Docker4 択難易度 応用

状況

docker run -d -p 8080:3000 --name web myweb:2.0 で起動。PORTS は 0.0.0.0:8080->3000/tcp。ホストで curl localhost:8080 は接続を切られるが、docker exec web curl -s localhost:3000 は HTML を返す。

最も疑わしい原因は?

  1. A-p の指定が抜けていて、ポートが公開されていない
  2. Bアプリがコンテナ内の 127.0.0.1 だけで待ち受けている
  3. Cホストのファイアウォールが 8080 番を塞いでいる
  4. Dコンテナの中でアプリが起動していない

正答

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

解説

PORTS に 0.0.0.0:8080->3000/tcp と出ているので、-p による公開はできている(A は否定)。コンテナの中からの curl は HTML を返すので、アプリは起動して応答している(D は否定)。ホスト自身から localhost に接続しているので、外からの通信を塞ぐファイアウォールも考えにくい(C)。残るのは待ち受けアドレスで、公開ポートからの転送はコンテナのネットワークインターフェース宛てに届くため、アプリがコンテナ内の 127.0.0.1 だけで待ち受けていると受け付けられない。開発サーバの既定値に多く、0.0.0.0 で待ち受けるよう設定する。

参考: docs.docker.com

portbind-addresstroubleshooting

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

Dockerクイズへ