Docker4 択難易度 応用

状況

compose で app と db(PostgreSQL)を起動。db のログには ready to accept connections が出ているのに、app は数分たっても connect ECONNREFUSED 127.0.0.1:5432 を出し続ける。app の環境変数は DB_HOST=localhost。

最も疑わしい原因は?

  1. Adb の起動が間に合わず、app が先に接続している
  2. Bdb サービスに ports: 5432:5432 を書いていない
  3. Clocalhost は app コンテナ自身を指し、db には届かない
  4. DDB のパスワードが app と db で食い違っている

正答

  1. A
  2. B
  3. C
  4. D

解説

コンテナはそれぞれ自分のネットワーク空間を持ち、localhost(127.0.0.1)はそのコンテナ自身を指す。app から localhost:5432 につなぐと app コンテナの中を探すことになり、そこに DB はいないので接続を拒否される。compose では同じネットワークのサービスをサービス名で名前解決できるので、DB_HOST=db にする。db は準備完了をログに出していて、数分たっても失敗が続くので起動順(A)ではない。サービス間の通信はコンテナ側のポートを直接使うので ports(B)は不要で、書くとホストに公開されてしまう。パスワード違いなら接続拒否ではなく認証エラーになる(D)。

参考: docs.docker.com

composenetworklocalhosttroubleshooting

この問題を含む Docker のテストを制限時間つきで解く

Dockerクイズへ