DockerfileでEXPOSEを使用する理由—とにかくすべてのポートにバインドできるため


23

そのポートをコンテナに入れdocker run -p 3000:3000 image にできEXPOSEます(以下を参照)。それが本当なら、なぜDockerfileにわざわざEXPOSEを入れるのですか?画像ユーザーとのコミュニケーションのためだけですか?ポートがすべてとにかくバインド可能であれば、ポートを公開する機能的な理由がわからないからです。


ここでは、公開されていないにもかかわらずコンテナ内のポートにバインドする手順を示します

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$

回答:


29

DockerのEXPOSEドキュメントは、この特定のポイントに対応しています。

このEXPOSE命令は、実際にはポートを公開しません。これは、イメージを作成する人とコンテナを実行する人との間のドキュメントの一種として機能し、どのポートが公開されることを意図しています。コンテナの実行時にポートを実際に公開するには、-pフラグon docker runを使用して1つ以上のポートを公開およびマップするか、-Pフラグを使用してすべての公開ポートを公開し、それらを高次ポートにマップします。

最後の文に注意してください。複数のポートを公開する場合は、コマンドラインで複数のポート-Pを設定しないようにするのに役立ちます-p


「ドキュメント」は画像メタデータの形式です。-P他のユーティリティは、フラグに役立つだけでなく、実行中のコンテナにこのメタデータを照会できます。これは、これらの公開ポートをデフォルトとして使用して転送ルールを動的に更新するプロキシで役立ちます。
BMitch

@BMitch絶対に、OPにはまだ役に立たない無関係な情報だと感じましたが、自由に編集してください
。– Tensibai

EXPOSEはドキュメンテーションです
井上智文

4

これは自動化のために行われます。docker run -Pコンテナを起動するために実行されるユニバーサルコマンドを使用でき、Dockerfile自体を使用して、どのコンテナがどのポートを公開するかを指定します。パイプラインを介して構築される数十または数百のコンテナを扱う場合、これは非常に便利です。Dockerfileに含まれていない外部の詳細を、ステージからステージへのパイプラインを介してコンテナーと一緒に渡すことは、規模が非常に困難です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.