はじめに
Minecraft統合版サーバーをDocker化して、ついでにAPIで色々操作できるようにする的な個人開発(自分用)をしています。
業務でDockerを使ってこなかったので、色々知ることがたくさんあり、下書きにもいくつか溜まっているので、今回はその中の一つを記事として公開します。
EXPOSE命令とは何か
結論から言うと、EXPOSE命令は「このポートを開放すべき」というドキュメントのような役割を持つものです。
ただし、単なるコメントとは違って、実行時に-Pフラグを使った場合には自動的にポートマッピングしてくれるので、ちゃんと効力はあります。
重要なのは、DockerfileでEXPOSEを書いただけでは、ポートは公開されないということです。
実際にポートを公開するには、docker run実行時に-pオプションで指定するか、-Pオプションを使う必要があります。
公式ドキュメントにはこう書かれています。
EXPOSE 命令だけは、実際にはポートを公開(publish)しません。これは、どのポートを公開する意図なのかという、イメージの作者とコンテナ実行者の両者に対し、ある種のドキュメントとして機能します。
つまり、DockerfileでいくらEXPOSEを書いても、最終的に公開ポートを決めるのは実行時のオプション次第ということです。
もちろん、アプリケーションが8080番ポートで動いている場合、そのポートを開けないとアクセスできないのは当然ですが、EXPOSEはあくまで「このポートを使います」という情報を示すものです。
まとめ
公式ドキュメントを読むと、機能の本質が腑に落ちました。
LLMと徹底的に対話することで、認識の誤りも限りなく少なくできました。
記事にも残して多重アウトプット、完璧です。