web-dev-qa-db-ja.com

docker-compose:コンテナー間のredis接続が拒否されました

複数のプロセス(RQワーカー、RQダッシュボード、およびFlaskアプリケーション)を実行する単一のDockerコンテナーソリューションを Supervisor

ホストシステムは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"はPython RQ 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、さらにはローカルホストに対してRQワーカーを実行することから、すべてを試しました。 Stackoverflowに投稿された他のソリューションも私にとっては機能しませんでした( docker-compose:コンテナー間の接続は拒否されましたが、ホストからアクセス可能なサービス 例)。

そして、これは私の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

2つのコンテナー間の接続が機能しない理由を誰かが知っていますか?

15
henning82

あなたのコードでは_rq-worker1_からのlocalhostredisではなく_rq-worker1_自体であり、localhostに接続して_redis:6379_に到達することはできません_rq-worker1_から。ただし、デフォルトではredisと_rq-worker1_は同じ network にあり、そのネットワークでドメイン名としてサービス名を使用できます。つまり、redisをドメイン名として使用して、_rq-worker1_からredisサービスに接続できます。例:client.connect(("redis", 6379))

_rq-worker1_の設定でlocalhostredisに置き換える必要があります。

19