こんにちは、フルスタックエンジニアのryuです。
今回の記事では、Dockerfileでポートを指定するEXPOSEについて解説します。EXPOSEとは、コンテナ実行時に、指定したポートをコンテナがリッスンするようにするコマンドです。使い方など詳しく解説します。
Dockerfileでリッスンするポートを指定するEXPOSE¶
今回の記事では、Dockerfileでリッスンするポートを指定するEXPOSEについて解説します。
EXPOSEとは?¶
EXPOSEはDockerfileで使用されるコマンドです。コンテナ実行時に、指定したポートをコンテナがリッスンするようになります。
例えば、以下のようなDockerfileがあった場合、コンテナはポート80番を受け付けるようになります。
FROM nginx
EXPOSE 80
ただ、EXPOSEだけでは、ポートは公開されません。つまり、使用者からコンテナにはアクセスできません。後に説明する”docker run -p”コマンドを使用し、公開用のポートとEXPOSEで指定したポートを紐づけることで、公開されるようになります。
そのため、EXPOSEはイメージの作者とコンテナ実行者の両者に対して、ドキュメントのような役割をします。
EXPOSE命令だけは、実際にはポートを 公開publish しません。これは、どのポートを公開する意図なのかという、イメージの作者とコンテナ実行者の両者に対し、ある種のドキュメントとして機能します。
では、EXPOSEの使い方や”docker run”コマンドを使って、コンテナのポートを公開する方法を説明します。
あわせて読みたい - 【簡単!】Dockerとは?初心者向けに分かりやすく解説【Docker入門講座①】 - 【初心者向け】Dockerファイルとは?書き方を解説【Docker入門④】
DockerfileでのEXPOSEの使い方¶
ここからはDockerfileでのEXPOSEの使い方について解説します。コンテナでポートをリッスンさせて、”docker run”コマンドを使って、ホスト上のポートとバインディングさせて公開できるようにします。
EXPOSEでポートとプロトコルを指定する¶
EXPOSEは以下のように記述します。
EXPOSE 80
EXPOSE [ポート番号]
上記のように記述すると、コンテナはTCPの80番ポートをリッスンするようになります。プロトコルを指定しない場合は、デフォルトでTCPをリッスンします。
プロトコルを指定する場合は、このように記述します。
EXPOSE 80/tcp
EXPOSE 80/udp
EXPOSE [ポート番号]/[プロトコル]
docker runコマンドでホスト上のポートとバインディングする¶
先ほども説明した通り、EXPOSEだけではコンテナにアクセスすることはできません。”docker run”コマンドを使用して、ホスト上のポートとコンテナのポートを紐づけます。
docker run -p 80:80 ・・・
docker run -p [ホスト側のポート]:[コンテナ側のポート]
ホスト側のポートとコンテナ側のポートは必ずしも一致させる必要はありません。コンテナ側が80番ポートをリッスンしていても、ホスト側で8080番を指定すれば、外部からは8080番としてアクセスすることになります。
あわせて読みたい 【初心者向け】DockerHubからイメージを取得して起動する方法解説【Docker入門③】
まとめ¶
今回の記事では、Dockerfileでポートを指定するEXPOSEについて解説しました。Dockerfileのコマンドは様々なものがあるので是非覚えておきましょう。以上で記事を終わります。読んでいただきありがとうございました!
参考:Dockerfile リファレンス — Docker-docs-ja 20.10 ドキュメント
/blog/docker-book

