こんにちは、フルスタックエンジニアのryuです。
今回の記事では、Dockerfileでポートを指定するEXPOSEについて解説します。EXPOSEとは、コンテナ実行時に、指定したポートをコンテナがリッスンするようにするコマンドです。使い方など詳しく解説します。
目次
Dockerfileでリッスンするポートを指定するEXPOSE
今回の記事では、Dockerfileでリッスンするポートを指定するEXPOSEについて解説します。
EXPOSEとは?
EXPOSEはDockerfileで使用されるコマンドです。コンテナ実行時に、指定したポートをコンテナがリッスンするようになります。
例えば、以下のようなDockerfileがあった場合、コンテナはポート80番を受け付けるようになります。
FROM nginx
EXPOSE 80
ただ、EXPOSEだけでは、ポートは公開されません。つまり、使用者からコンテナにはアクセスできません。後に説明する”docker run -p”コマンドを使用し、公開用のポートとEXPOSEで指定したポートを紐づけることで、公開されるようになります。
そのため、EXPOSEはイメージの作者とコンテナ実行者の両者に対して、ドキュメントのような役割をします。
(docker 公式ドキュメント)
EXPOSE
命令だけは、実際にはポートを 公開 しません。これは、どのポートを公開する意図なのかという、イメージの作者とコンテナ実行者の両者に対し、ある種のドキュメントとして機能します。
では、EXPOSEの使い方や”docker run”コマンドを使って、コンテナのポートを公開する方法を説明します。
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番としてアクセスすることになります。
まとめ
今回の記事では、Dockerfileでポートを指定するEXPOSEについて解説しました。Dockerfileのコマンドは様々なものがあるので是非覚えておきましょう。以上で記事を終わります。読んでいただきありがとうございました!
参考:Dockerfile リファレンス — Docker-docs-ja 20.10 ドキュメント