🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

3899閲覧

linux nignxでDockerfileのEXPOSE 80はなぜ明示的に書く必要があるのか?

Kchan_01

総合スコア110

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/03/18 15:07

編集2021/03/18 15:21

Dockerを学び始めた初心者です。

Dockerfileに記載するEXPOSEについて質問です。今まで何個かDockerfileを書きましたが、EXPOSEを書かなくても、期待通りに動いていました。

正しい書き方を学びたいと思って、公式のDockerイメージを読んでいると、EXPOSEというものを見つけました。

公式のDockerイメージ

公式のDockerイメージでは明示的にEXPOSE 80と書いていますが、書かなくても動きます。

docker-nginx/Dockerfile at master · nginxinc/docker-nginx

なぜ明示的にEXPOSE 80と書く必要があるのでしょうか。

リファレンスの説明

DockerのリファレンスのDockerに通知するという部分もよくわかりません。

The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime.

Dockerfile reference | Docker Documentation

DockerfileのEXPOSEはなぜ書く必要があるのでしょうか、
また、書かないことでどのようなトラブルが予想されるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2021/03/18 15:19

記憶違いでなければそもそもexposeしとかんと、dockerコンテナ内で動いているnginxがserveしているサーバーへアクセスする手段がないように思うのですが、識者の人任せた。
over

2021/03/19 00:00

> 今まで何個かDockerfileを書きましたが、EXPOSEを書かなくても、期待通りに動いていました。 期待した動作にはexposeは必要なかったということはありませんか? exposeはdockerイメージのポート公開設定なので、これを必要としなければ記載する必要がないとの理解です。
退会済みユーザー

退会済みユーザー

2021/03/19 19:04 編集

例えばpythonイメージそのままの $ cat Dockerfile FROM python:3.9.2 $ のようなイメージをビルドします。 $ docker build -t python-web . このイメージをinspectしてexposeされたportを確認します。 $ docker inspect python-web | grep Expose 何も出ないのでありません。このpythonから組み込みのWebサーバーを8080ポートで起動します。 $ docker run -it --rm python-web python -m http.server 8080 Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ... これを実行すると、デフォルトではbridgeネットワークなので、コンテナ内の8080ポートはホスト上のポートに紐付かず、別端末から↓のようにしても、何も取得できません。 $ wget 'http://localhost:8080/' --2021-03-20 04:00:00-- http://localhost:8080/ localhost (localhost) をDNSに問いあわせています... ::1, 127.0.0.1 localhost (localhost)|::1|:8080 に接続しています... 失敗しました: 接続を拒否されました. localhost (localhost)|127.0.0.1|:8080 に接続しています... 失敗しました: 接続を拒否されました. コンテナをCtrl+Cで停止し、今度は-pオプションをつけて、コンテナの8080ポートをホストの8080に紐付けます。 $ docker run -it --rm -p 8080:8080 python-web python -m http.server 8080 Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ... また別端末から取得してみると… $ wget 'http://localhost:8080/' --2021-03-20 04:00:00-- http://localhost:8080/ localhost (localhost) をDNSに問いあわせています... ::1, 127.0.0.1 localhost (localhost)|::1|:8080 に接続しています... 失敗しました: 接続を拒否されました. localhost (localhost)|127.0.0.1|:8080 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 987 [text/html] `index.html' に保存中 index.html 100%[====================================================================================================>] 987 --.-KB/s in 0s 2021-03-20 04:00:00 (191 MB/s) - `index.html' へ保存完了 [987/987] 取得に成功します(失敗してるのはtcp6) つまり、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. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports." コンテナ利用者に向けたドキュメンテーション的な意味合いと、-Pオプション指定時のコンテナ側のポート指定ということになります。 例えば $ cat Dockerfile FROM python:3.9.2 EXPOSE 8080/tcp $ docker build -t python-web . $ docker inspect python-web ... "ExposedPorts": { "8080/tcp": {} }, ... "ExposedPorts": { "8080/tcp": {} }, ... $ docker run -it --rm -P python-web python -m http.server 8080 Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ... 別端末から $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2ca7c5bd264 python-web "python -m http.serv…" 32 seconds ago Up 30 seconds 0.0.0.0:49157->8080/tcp upbeat_joliot ... $ wget 'http://localhost:49157/' --2021-03-20 04:00:00-- http://localhost:49157/ localhost (localhost) をDNSに問いあわせています... ::1, 127.0.0.1 localhost (localhost)|::1|:49157 に接続しています... 失敗しました: 接続を拒否されました. localhost (localhost)|127.0.0.1|:49157 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 987 [text/html] `index.html.1' に保存中 index.html.1 100%[====================================================================================================>] 987 --.-KB/s in 0s 2021-03-20 04:00:00 (172 MB/s) - `index.html.1' へ保存完了 [987/987] $ のように取得できます。今回のケースでは、-P指定のためにホスト側のポートがランダムになり、一旦コンテナの情報を取得して紐付いたポートを使ってアクセスしています。 https://docs.docker.com/engine/reference/run/#expose-incoming-ports なぜ書く必要があるか?と予想されるトラブルは知りません。
guest

回答1

0

ベストアンサー

exposeは必要ありません。
公式のリファレンスにかかれている通りです。ただし、このドキュメントにもあるように、明示することでメリットもあるため、使う人は多いと思います。

https://docs.docker.com/engine/reference/builder/#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. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports.

EXPOSEは実際にはPortを公開しません。これは、イメージを作った人がどのポートで動くことを期待しているかを明示するための一種のドキュメントとして作用します。実際にポートを公開するには、docker runしてコンテナを動かす際に-pオプションを付与します。

投稿2021/03/21 04:43

編集2021/03/21 04:44
inductor

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問