nis*_*ant 4 networking containers redis docker
我正在docker容器中运行redis-server。它在127.0.0.1端口6379上运行。
在容器中:在容器中时, 我能够连接到redis服务器,并且可以毫无问题地处理命令。
从主机: 当我使用redis-cli Monitor从主机到容器执行redis-cli时,出现错误:服务器关闭了连接。
如果我只是这样做redis-cli,它会提示您;
127.0.0.1:6379>
127.0.0.1:6379> set www yee
Error: Server closed the connection
Run Code Online (Sandbox Code Playgroud)
似乎docker暴露了正确的端口,并且docker端口映射正在运行。失败不是在建立连接时发生的,而是连接很快就终止了。
从同一docker(网桥)网络上的另一个容器中:
redis.on('error', function(err) {
logger.error('Redis error: ' + err);
} );
Redis error: Redis connection to 172.18.0.2:6379 failed - connect ECONNREFUSED 172.18.0.2:6379
Run Code Online (Sandbox Code Playgroud)
我的redis.conf档案有protected-mode no。
日志记录设置为调试,但是日志上没有任何信息表明尝试建立连接并拒绝连接。
Redis客户端会继续重试超时,但是每次它被拒绝连接时。我尝试在docker网络上使用容器名称(作为主机名)和容器IP地址,在两种情况下,结果都是相同的。
docker network create redisnet
docker run --name redis -p 6379:6379 -d --net "redisnet" redis-server
docker run --name apiserver -p 81:8080 --net "redisnet" -d api-server
If I try to ping it from another container on the same net:
docker run -it --rm --net redisnet redis redis-cli -h redis ping
Could not connect to redis at redis:6379: Connection refused
Run Code Online (Sandbox Code Playgroud)
如果有任何调试技巧,将非常有帮助;
-p在创建容器时使用选项将您的 redis 容器端口映射到主机端口。例子:
sudo docker run -p 6379:6379 --name containername imageId
Run Code Online (Sandbox Code Playgroud)
然后您可以访问在主机上的容器内运行的 redis。
要在主机与容器之间进行通信,您需要在主机上发布端口。例如docker run -p 6379:6379 redis。无需公开端口。这将使该服务可用于网络上的任何对象。您可以通过指定要监听的接口来限制它,例如:docker run -p 127.0.0.1:6379:6379 -d redis
要在容器之间进行通信,它们需要位于同一用户创建的docker网络上。例如:
docker network create my_app
docker run --net my_app -d --name redis redis
Run Code Online (Sandbox Code Playgroud)
然后,您将能够将其他容器连接到同一网络,并与“ redis:6379”进行通信。例如:
$ docker run -it --rm --net my_app redis redis-cli -h redis ping
PONG
Run Code Online (Sandbox Code Playgroud)
我通过注释中的以下行来解决此问题redis.conf。
# bind 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
当在容器上启动Redis并将其连接到docker网络时,将在该网络上创建一个用于Redis的新接口,并且该接口具有其自己的IP地址。例如,泊坞窗网络可以分配范围内的地址,172.18.0.2/24而redis容器则可以分配172.18.0.2。除非总是在docker run命令中明确分配IP地址,否则并不总是能够预测将哪个IP地址分配给Redis。唯一的选择是注释bind in redis.conf,这将允许redis现在侦听6379所有接口上的请求。
这解决了问题,我能够从另一个容器连接到Redis。
| 归档时间: |
|
| 查看次数: |
5900 次 |
| 最近记录: |