状況
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 を返す。
最も疑わしい原因は?
- A-p の指定が抜けていて、ポートが公開されていない
- Bアプリがコンテナ内の 127.0.0.1 だけで待ち受けている
- Cホストのファイアウォールが 8080 番を塞いでいる
- Dコンテナの中でアプリが起動していない
正答
- A
- B
- C
- 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
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ