状況
compose で app と db(PostgreSQL)を起動。db のログには ready to accept connections が出ているのに、app は数分たっても connect ECONNREFUSED 127.0.0.1:5432 を出し続ける。app の環境変数は DB_HOST=localhost。
最も疑わしい原因は?
- Adb の起動が間に合わず、app が先に接続している
- Bdb サービスに ports: 5432:5432 を書いていない
- Clocalhost は app コンテナ自身を指し、db には届かない
- DDB のパスワードが app と db で食い違っている
正答
- A
- B
- C
- D
解説
コンテナはそれぞれ自分のネットワーク空間を持ち、localhost(127.0.0.1)はそのコンテナ自身を指す。app から localhost:5432 につなぐと app コンテナの中を探すことになり、そこに DB はいないので接続を拒否される。compose では同じネットワークのサービスをサービス名で名前解決できるので、DB_HOST=db にする。db は準備完了をログに出していて、数分たっても失敗が続くので起動順(A)ではない。サービス間の通信はコンテナ側のポートを直接使うので ports(B)は不要で、書くとホストに公開されてしまう。パスワード違いなら接続拒否ではなく認証エラーになる(D)。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ