状況
Dockerfile に EXPOSE 8000 を書いたイメージを docker run -d --name app myapi:1.0 で起動。ホストで curl localhost:8000 は Connection refused。docker ps の PORTS は 8000/tcp で、矢印(->)が無い。
最も疑わしい原因は?
- Aアプリが 8000 番ではなく別のポートで待ち受けている
- Bコンテナが起動直後に終了している
- Cイメージのビルドキャッシュが古い
- DEXPOSE だけで、-p によるポートの公開をしていない
正答
- A
- B
- C
- D
解説
EXPOSE はイメージの作者が「このポートを使う」と書き残すための命令で、それだけではホストに公開されない。docker ps の PORTS が 8000/tcp だけで、0.0.0.0:8000->8000/tcp のような矢印が無いのは、公開していない印である。docker run -p 8000:8000 を付けて起動し直す。docker ps に表示されている以上、コンテナは動いている(B は否定)。待ち受けポートの違い(A)は、公開した後もつながらないときに疑うもの。ビルドキャッシュ(C)はポートの公開の有無とは関係がない。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ