【问题标题】:docker-compose: redis connection refused between containersdocker-compose:容器之间的redis连接被拒绝
【发布时间】:2017-05-09 05:44:02
【问题描述】:

我正在尝试设置一个 docker-compose 文件,该文件旨在用 Supervisor 替换运行多个进程(RQ 工作程序、RQ 仪表板和 Flask 应用程序)的单个 Docker 容器解决方案。

主机系统是 Debian 8 Linux,我的 docker-compose.yml 看起来像这样(我删除了所有其他条目以减少错误来源):

version: '2'
  services:
    redis:
      image: redis:latest
    rq-worker1:
      build: .
      command: /usr/local/bin/rqworker boo-uploads
      depends_on:
        - redis

“rq-worker1”是一个PythonRQ worker,试图通过localhost和6379端口连接redis,但是建立连接失败:

redis_1       | 1:M 23 Dec 13:06:26.285 * The server is now ready to accept connections on port 6379
rq-worker1_1  | [2016-12-23 13:06] DEBUG: worker: Registering birth of worker d5cb16062fc0.1
rq-worker1_1  | Error 111 connecting to localhost:6379. Connection refused.
galileoqueue_rq-worker1_1 exited with code 1

docker ps 的输出如下所示:

CONTAINER ID        IMAGE               COMMAND                      CREATED             STATUS              PORTS               NAMES
36cac91670d2        redis:latest        "docker-entrypoint.sh"   14 minutes ago      Up About a minute   6379/tcp                galileoqueue_redis_1

我尝试了所有方法,从针对本地 IP 0.0.0.0 / 127.0.0.1 甚至 localhost 运行 RQ 工作程序。 Stackoverflow 上发布的其他解决方案也不适用于我(docker-compose: connection refused between containers, but service accessible from host 例如)。

这是我的docker info 输出:

Containers: 25
  Running: 1
  Paused: 0
  Stopped: 24
Images: 485
Server Version: 1.12.5
Storage Driver: aufs
  Root Dir: /var/lib/docker/aufs
  Backing Filesystem: extfs
  Dirs: 436
  Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
  Volume: local
  Network: null bridge host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options:
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux 8 (jessie)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 13.61 GiB
Name: gp-pc-201
ID: LBGV:K26G:UXXI:BWRH:OYVE:OQTA:N7LQ:I4DV:BTNH:FZEW:7XDD:WOCU

有谁知道为什么两个容器之间的连接不起作用?

【问题讨论】:

    标签: python docker redis containers


    【解决方案1】:

    在您的代码中,来自rq-worker1localhostrq-worker1 本身,而不是redis,并且您无法通过从rq-worker1 连接到localhost 来访问redis:6379。但默认情况下redisrq-worker1 在同一个network 中,您可以在该网络中使用服务名称作为域名。 这意味着,您可以使用redis 作为域名从rq-worker1 连接到redis 服务,例如:client.connect(("redis", 6379))

    您应该在rq-worker1 的配置中将localhost 替换为redis

    【讨论】:

    • 谢谢!这解决了连接错误。我使用所有 Python 命令的主机参数连接到“redis”,它工作得很好。
    • 我遇到了类似的问题,试图从 django Web 服务访问 redis-server。为我解决问题的方法是更改​​我的 docker-compose.yml 文件以在我的 redis_db 服务规范中公开端口 6379(我使用它而不是 redis,因为这也是图像名称),然后在我的“网络”服务中,我添加了“链接:/n - redis_db”(注意那里的新行)。之后,我就可以从我的网络服务内部连接到 redis。
    • 这里表达的想法帮助我解决了错误的容器间通信问题:连接到 localhost:6379 的错误 99。无法分配请求的地址
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2018-10-23
    • 2019-10-20
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多