web-dev-qa-db-ja.com

別のDockerコンテナからRedisに接続できません

Dockerコンテナ内でredis-serverを実行しています。 127.0.0.1ポート6379で実行されています。

コンテナ内:コンテナ内でredis-serverに接続し、コマンドを問題なく処理できます。

ホストから: 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ポートマッピングが機能しているようです。障害は接続の確立ではありませんが、接続はすぐに終了します。

同じ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

僕の 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

デバッグのヒントがあれば、これは非常に役立ちます。

4
nishant

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に接続できるようになりました。

6
nishant

ホストからコンテナーに通信するには、ホストでポートを公開する必要があります。例えば。 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
6
BMitch

コンテナーの作成中に-pオプションを使用して、redisコンテナーポートをホストポートにマップします。例:

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

次に、ホストマシンのコンテナ内で実行されているredisにアクセスできます。

4
Anand Jain