从主机

时间:2016-12-29 00:00:51

标签: docker redis

我看到很多人都在苦苦挣扎,有点觉得redis容器图片中可能存在错误,而其他人似乎正在追逐类似的问题。

我在DockerHub上使用标准的redis图像。 (https://github.com/dockerfile/redis

像这样运行:

docker run -it -p 6379:6379 redis bash

我可以启动服务器,然后从容器映像执行redis ping。

不幸的是,我无法从我的主机连接到redis容器。

我尝试过设置,如下所示。

bind 127.0.0.1

并从配置中删除了绑定

并尝试关闭保护模式

protected-mode no

我知道它正在读取配置文件,因为我更改了端口只是为了测试,我能够做到这一点。

我正在运行Windows 10,所以可能是Windows网络问题。我通常不会遇到码头工人的问题。我很疑惑

6 个答案:

答案 0 :(得分:19)

问题在于你的绑定,你应该设置以下内容:

bind 0.0.0.0

这将设置redis绑定到所有可用接口,在具有一个接口的容器化环境中(eth0)和一个环回(lo)redis将绑定到两个接口以上。您应该考虑通过config file中的其他指令或使用firewalls等外部工具添加安全措施。因为通过这种方法,每个人都可以连接到您的redis服务器。

默认设置为bind 127.0.0.1,此设置将使redis仅侦听环回接口,并且只能从容器内部访问。 (为安全起见)

使用自定义配置文件运行redis:

sudo docker run -d --name redis-test -p 6379:6379  -v /path/to/redisconf/redis.conf:/redis.conf redis redis-server /redis.conf

现在验证安装了redis-tools的docker主机:

sudo redis-cli                           
127.0.0.1:6379> 
127.0.0.1:6379> set farhad likes:stackoverflow
OK
127.0.0.1:6379> get farhad
"likes:stackoverflow"
127.0.0.1:6379> 

您还可以通过以下方式从外部主机连接到您的redis容器:

redis-cli -h 'IP-address-of-dockerhost-running-redis-container'

答案 1 :(得分:13)

这是设置Redis容器的更简单方法。

下载图像并运行容器

docker run -d --name some-redis -p 6379:6379 redis

如果没有图像,此命令将其拉出。然后,如果您需要从 redis-cli 访问控制台,可以使用:

docker exec -it some-redis bash

要输入到容器控制台,并在控制台中输入

root@72c388dc2cb8:/data# redis-cli

输出:

127.0.0.1:6379> 

这足以满足我的用例(轻松快速的本地开发)。

答案 2 :(得分:2)

以下是一些说明,以使其正常工作。

安装正式的Docker而不是Distro仓库。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
systemctl enable docker ; systemctl start docker; systemctl status docker

请参阅Install using the convenience script

从主机连接到Redis容器

mkdir -p /etc/redis/
chown -R 1000:1000 /etc/redis
sudo docker run -d --name redis -p 6379:6379 --restart unless-stopped -v /etc/redis/:/data redis redis-server /data

注意:解决方案的关键是将端口暴露(-p 6379:6379)到Docker主机并路由到容器端口。 请参阅Redis Docker Documentation

在Docker主机中安装“ redis-tools”。 Centos通过epel版本安装Redis。

答案 3 :(得分:1)

现在使用版本4.0.9Docker Toolbox on Win10)可能会更容易。只需连接redis客户端,然后:

set bind 0.0.0.0
save

停止/启动后,新设置会停止。

答案 4 :(得分:0)

使用以下命令创建Redis容器

sudo docker run -d --name redis-test -p 6379:6379  -v /redis/redis.conf:/redis.conf redis redis-server /redis.conf --appendonly yes --requirepass "redis"

您可以使用Redis-CLI在同一台计算机上访问Redis,如果您正在使用其他计算机,请使用host machine IP。如果要在同一主机中访问Redis容器,则另一个Docker容器将使用机器的private IP

答案 5 :(得分:0)

如果您想在 docker 容器中运行 Redis 集群。

答案在 Redis 自述文件 redis.conf 中,这里是从文件中提取的关于如何像专业人士一样解决问题的摘录。

全部归功于 redis.conf 文件,redis 版本 6 及更高版本。

########################## CLUSTER DOCKER/NAT support  ########################

# In certain deployments, Redis Cluster nodes address discovery fails, because
# addresses are NAT-ted or because ports are forwarded (the typical case is
# Docker and other containers).
#
# In order to make Redis Cluster working in such environments, a static
# configuration where each node knows its public address is needed. The
# following two options are used for this scope, and are:
#
# * cluster-announce-ip
# * cluster-announce-port
# * cluster-announce-bus-port
#
# Each instructs the node about its address, client port, and cluster message
# bus port. The information is then published in the header of the bus packets
# so that other nodes will be able to correctly map the address of the node
# publishing the information.
#
# If the above options are not used, the normal Redis Cluster auto-detection
# will be used instead.
#
# Note that when remapped, the bus port may not be at the fixed offset of
# clients port + 10000, so you can specify any port and bus-port depending
# on how they get remapped. If the bus-port is not set, a fixed offset of
# 10000 will be used as usual.
#
# Example:
#
# cluster-announce-ip 10.1.1.5
# cluster-announce-port 6379
# cluster-announce-bus-port 6380