簡潔な答え:
EXPOSE
文書化する方法です
--publish
(又は-p
)の方法でマッピングホスト・ポートを実行するコンテナ港
その下に注意してください:
EXPOSE
に関連していますDockerfiles
(文書化)
--publish
に関連していますdocker run ...
(実行/実行時)
ポートの公開と公開
Dockerネットワーキングでは、ネットワークポートに直接関与する2つの異なるメカニズムがあります。ポートの公開と公開です。これは、デフォルトのブリッジネットワークとユーザー定義のブリッジネットワークに適用されます。
EXPOSE
Dockerfile のキーワードまたはdocker runの--expose
フラグを使用してポートを公開します。ポートの公開は、どのポートが使用されているかを文書化する方法ですが、実際にポートをマップしたり開いたりするわけではありません。ポートの公開はオプションです。
--publish
または--publish-all
フラグを使用してポートを公開しますdocker run
。これは、コンテナーのネットワークインターフェイスで開くポートをDockerに指示します。ポートが公開されると、30000
実行時にホストマシンでマッピングするポートを指定しない限り、ポートはホストマシンで利用可能な高次のポート(より大きい)にマッピングされます。(Dockerfileで)イメージをビルドするときに、ホストマシンでマッピングするポートを指定することはできません。これは、イメージを実行するホストマシンでポートが使用可能であることを保証する方法がないためです。
from:Dockerコンテナーネットワーキング
2019年10月の更新:上記のテキストはドキュメントに含まれなくなりましたが、アーカイブされたバージョンはこちらです:docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
たぶん、現在のドキュメントは以下のとおりです:
公開されたポート
デフォルトでは、コンテナを作成するとき、コンテナはポートを外部に公開しません。Dockerの外部のサービス、またはコンテナーのネットワークに接続されていないDockerコンテナーがポートを使用できるようにするには、--publish
or -p
フラグを使用します。これにより、コンテナーポートをDockerホストのポートにマップするファイアウォールルールが作成されます。
そしてここで見つけることができます:docs.docker.com/config/containers/container-networking/#published-ports
また、
EXPOSE
...このEXPOSE
命令は実際にはポートを公開していません。これは、イメージを作成する人とコンテナを実行する人との間の一種のドキュメントとして機能し、ポートの公開が予定されています。
from:Dockerfileリファレンス
EXPOSE
/ --publish
が定義されていない場合のサービスアクセス:
で@Goloローデンの答えのことが記載されている::
「これらのいずれも指定しない場合、コンテナー内のサービスは、コンテナー自体の中以外からはアクセスできません。」
たぶんそれは答えが書かれていた時にそうであったが、今あなたが使用していない場合でも、と思われるEXPOSE
か--publish
、host
および他のcontainers
同一ネットワークのあなたは、そのコンテナの内側に始めることができるサービスにアクセスすることができます。
これをテストする方法:
以下を使用しましたDockerfile
。基本的に、私はubuntuから始めて、小さなWebサーバーをインストールします。
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
I build
「testexpose」となどの画像run
を使用して新しいコンテナ:
docker run --rm -it testexpose bash
コンテナ内で、次のインスタンスをいくつか起動しますmini-httpd
。
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
その後curl
、ホストまたは他のコンテナからを使用して、のホームページを取得できますmini-httpd
。