1. ホーム
  2. docker

[解決済み] Dockerの「expose」と「publish」の違いは何ですか?

2022-03-15 18:38:44

質問

Dockerfilesを試していて、ほとんどのロジックを理解しているつもりです。しかし、この文脈では、ポートを公開することと、ポートを公開することの違いがわかりません。

私が見たすべてのチュートリアルでは、最初に EXPOSE というコマンドをDockerfileに記述します。

...
EXPOSE 8080
...

そして、このDockerfileからイメージを構築するのです。

$ docker build -t an_image - < Dockerfile

そして パブリッシュ を実行すると、上記と同じポートが表示されます。

$ docker run -d -p 8080 an_image

を使用してすべてのポートを公開するか

$ docker run -d -P an_image

どうせ公開されるなら、Dockerfileでポートを公開する意味はあるのでしょうか?最初にポートを公開する必要があるのでしょうか? ではなく 後で公開するのですか?実質的には、イメージ作成時にDockerfileで使用するポートを全て指定し、その後はわざわざ指定せず、シンプルにwithで実行したいのですが、いかがでしょうか?

$ docker run -d an_image

これは可能か?

どのように解決するのですか?

基本的には、3つの選択肢があります。

  1. どちらも指定しない EXPOSE また -p
  2. 指定するのみ EXPOSE
  3. 指定する EXPOSE-p

1) EXPOSE または -p からしかアクセスできないので、コンテナ内のサービスは 内部 コンテナそのものです。

2) もし、あなたが EXPOSE ポートを指定すると、コンテナ内のサービスはDockerの外部からはアクセスできず、他のDockerコンテナの内部からアクセスできるようになります。なので、コンテナ間通信に適しています。

3) もし、あなたが EXPOSE-p を指定すると、コンテナ内のサービスはどこからでも、たとえDockerの外からでもアクセスできるようになります。

両者が分離されている理由はIMHOにあります。

  • ホストポートの選択はホストに依存するため、Dockerfile には属しません (さもなければホストに依存することになります)。
  • で、あるコンテナ内のサービスが他のコンテナからアクセスできれば十分なことが多い。

は、その ドキュメント を明示的に記述しています。

は、以下の通りです。 EXPOSE 命令は、リンク内で使用するためのポートを公開します。

また、その方法を指南しています。 リンクコンテナ これは基本的に、先ほどお話したコンテナ間のコミュニケーションです。

PS: もし、あなたが -p を使用せず EXPOSE Dockerは暗黙のうちに EXPOSE . これは、ポートが一般に公開されている場合、自動的に他のDockerコンテナにも公開されるからです。したがって -p が含まれます。 EXPOSE . だから、4つ目のケースとして上に挙げなかったのです。