首页 文章

无法从另一个泊坞窗容器连接到redis

提问于
浏览
2

我在docker容器中运行redis-server . 它运行在127.0.0.1端口6379上 .

In Container: 我能够在容器和处理命令中连接到redis-server而没有问题 .

From Host: 当我使用redis-cli监视器从主机到容器执行redis-cli时,它会显示错误:服务器关闭连接 .

如果我只是做 redis-cli ,它会给出提示;

127.0.0.1:6379> 
127.0.0.1:6379> set www yee
Error: Server closed the connection

这似乎是docker有正确的端口暴露,并且docker端口映射正在工作 . 失败不是 Build 连接,但连接很快就会终止 .

From another container on the same docker (bridge) network:

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

我的 redis.conf 文件有 protected-mode no .

日志记录设置为debug,但日志中没有任何信息显示已尝试和拒绝连接 .

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

如果有任何调试提示,这将非常有帮助;

3 回答

  • 3

    要从主机到容器进行通信,您需要在主机上发布端口 . 例如 . 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
    

    然后,您就可以将其他容器连接到同一网络并与“redis:6379”进行通信 . 例如 . :

    $ docker run -it --rm --net my_app redis redis-cli -h redis ping
    PONG
    
  • 1

    在创建容器时,使用 -p 选项将redis容器端口映射到主机端口 . 例:

    sudo docker run  -p 6379:6379 --name containername imageId
    

    然后,您可以访问在主机上的容器内运行的redis .

  • 3

    我通过在 redis.conf 中注释掉以下行来解决这个问题 .

    # bind 127.0.0.1
    

    当redis在容器上启动并连接到docker网络时,会在该网络上为redis创建一个新接口,并且此接口具有自己的ip地址 . 例如,docker网络可以分配 172.18.0.2/24 范围内的地址,并且可以为redis容器分配 172.18.0.2 . 除非有人在docker run命令中明确指定了ip地址,否则并不总是可以预测将哪个IP地址分配给redis . 唯一的选择是在 redis.conf 中注释绑定,这将允许redis现在在所有接口上侦听对 6379 的请求 .

    这解决了问题,我可以从另一个容器连接到redis .

相关问题