こんにちは。Яeiです。
今回は、現役エンジニアの私がDockerfileのEXPOSEの書き方について記事にしようと思います。
EXPOSE句はDockerfileを記載する際に必須レベルで記載する・・・と思って勘違いが生まれやすいものです。
当記事は以下の公式リファレンスを元に記載しております。
Dockerfile reference >>
結論:EXPOSEの書き方
書き方は以下となります。
EXPOSE <port> [<port>/<protocol>…]
例:80ポート、tcpプロトコルの公開の場合
EXPOSE 80/tcp
ただし、EXPOSEを書いたからといって実際にポート公開されることはありません。
詳細:EXPOSEの書き方
コンテナはいわばLinux環境を仮想化したものですが、その仮想化した環境を外部からアクセスできるようにするか否かの設定がポートフォワーディング設定となります。
よく勘違いが発生するのが、このポートフォワーディング設定こそがDockerfileで指定するEXPOSEだと思っている人が多いです。
しかし、ポートフォワーディング設定は「-p」オプションでの設定となります。
そうすると「あれ?EXPOSEは何者?」と疑問に思うかもしれません。
The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.
これを訳すと、
EXPOSE設定をしても実際にポートを公開しません。
EXPOSE命令はイメージをビルドする人とコンテナーを実行する人との間で、どのポートが公開される予定であるかについて補足するためのドキュメントとして機能します。
といった感じになります。
例えば、nginx:latestイメージをプルしたとします。ここで、プルしたイメージに対して「docker history」コマンドを実行するとイメージの履歴が見れます。
> docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
51086ed63d8c 25 hours ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 25 hours ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 25 hours ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 25 hours ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 25 hours ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 25 hours ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 25 hours ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 25 hours ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 25 hours ago /bin/sh -c set -x && addgroup --system -… 61.1MB
<missing> 25 hours ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 25 hours ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.6 0B
<missing> 25 hours ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.23.1 0B
<missing> 25 hours ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 38 hours ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 38 hours ago /bin/sh -c #(nop) ADD file:b78b777208be08edd… 80.5MB
こんな感じで公開ポートを確認することができるのです。
nginxについてはDockerHubのoverviewページに使い方も含めて丁寧に記載されてますし、各イメージの詳細を見れば確認するともできます。
そんなnginxでさえお作法として記載しているのであれば記載しておくと良いかもしれません。
基本的にオフィシャルイメージではしっかりと記載されているイメージになります。
当記事は以上となります。
EXPOSE命令は誤解の生じやすいものではありますが、覚えておくと良いと思います。
実際にコンテナアクセスが必要になった場合は必ず関連して出てくる設定になると思いますので、その際に戸惑わないようになれば良いでしょう。
長々とお疲れさまでした。