私は 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 で指定し、その後はポートを気にせずに、次のように実行したいと思います。
$ docker run -d an_image
これは可能ですか?
ベストアンサー1
基本的に、3つ(4つ)のオプションがあります。
- 指定
EXPOSE
もせず、-p
- 指定のみ
EXPOSE
- 指定し
EXPOSE
て-p
-p
暗黙的に行うもののみ指定するEXPOSE
も も指定しない場合は
EXPOSE
、-p
コンテナ内のサービスにはコンテナ自体の内部からのみアクセスできるようになります。ポートを使用すると
EXPOSE
、コンテナ内のサービスは Docker の外部からではなく、他の Docker コンテナ内からアクセス可能になります。そのため、コンテナ間の通信に適しています。EXPOSE
ポートがあれば-p
、コンテナ内のサービスは Docker の外部からでもどこからでもアクセスできるようになります。を実行するが
-p
、 を実行しない場合はEXPOSE
、Docker は暗黙的に を実行しますEXPOSE
。これは、ポートが一般に公開されている場合、他の Docker コンテナーにも自動的に公開されるためです。したがって、-p
が含まれますEXPOSE
。これは実質的に 3) と同じです。
両者を分離する理由は、私見では次のとおりです。
- ホストポートの選択はホストに依存するため、Dockerfileには属しません(そうでない場合はホストに依存することになります)。
- 多くの場合、コンテナ内のサービスが他のコンテナからアクセス可能であれば十分です。
のドキュメンテーション明確に述べている:
この
EXPOSE
命令は、リンク内で使用するためのポートを公開します。
また、どのようにすればリンクコンテナ(レガシー機能)、これは基本的に、私が説明したコンテナ間通信です。