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
デバッグのヒントがあれば、これは非常に役立ちます。
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に接続できるようになりました。
ホストからコンテナーに通信するには、ホストでポートを公開する必要があります。例えば。 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
コンテナーの作成中に-p
オプションを使用して、redisコンテナーポートをホストポートにマップします。例:
Sudo docker run -p 6379:6379 --name containername imageId
次に、ホストマシンのコンテナ内で実行されているredisにアクセスできます。