回答:
docker-composeリファレンスによると、
ポートを公開します。両方のポート(HOST:CONTAINER)を指定するか、コンテナーポートのみを指定します(ランダムなホストポートが選択されます)。
私のdocker-compose.yml
ように見えます:
mysql:
image: mysql:5.7
ports:
- "3306"
そうするとdocker-compose ps
、次のようになります。
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32769->3306/tcp
ホストマシンに公開せずにポートを公開します-ポートはリンクされたサービスにのみアクセスできます。内部ポートのみ指定できます。
ポートはホストマシンには公開されず、他のサービスにのみ公開されます。
mysql:
image: mysql:5.7
expose:
- "3306"
そうするとdocker-compose ps
、次のようになります。
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
expose
と思います:「EXPOSE命令は実際にはポートを公開しません。ドキュメントの一種として機能します...」docs.docker.com/engine/reference/builder/#expose
docker-compose run
、のポート定義docker-compose.yml
はデフォルトで無視されます。docker-compose up
パラメータを使用または指定します--service-ports
ポート:
公開する:
ポート このセクションは、ホストサーバーとDockerコンテナー間のマッピングを定義するために使用されます。
ports:
- 10005:80
これは、コンテナー内で実行されているアプリケーションがポート80で公開されていることを意味します。ただし、外部システム/エンティティはそれにアクセスできないため、ホストサーバーのポートにマップする必要があります。
注:外部ポートがアプリケーションにアクセスできるようにするには、ホストポート10005を開き、ファイアウォールルールを変更する必要があります。
彼らは使うことができます
http:// {ホストIP}:10005
このようなもの
EXPOSE これは、アプリケーションがdockerコンテナー内で実行されているポートを定義するためにのみ使用されます。
dockerfileでも定義できます。一般に、dockerfile内でEXPOSEを定義することは広く、広く使用されている方法であり、デフォルトの80ポート以外のポートで実行することはほとんどありません。
このports
セクションでは、ホスト上のポートを公開します。Dockerは、ホストネットワークからコンテナへの特定のポートの転送を設定します。デフォルトでは、これはdocker-proxy
最初のポートでリッスンし、2番目のポイントでリッスンする必要があるコンテナに転送するユーザースペースプロキシプロセス()で実装されます。コンテナーが宛先ポートでリッスンしていない場合でも、ホストでリッスンしているものは表示されますが、そのホストポートに接続しようとすると、コンテナーへの転送が失敗して接続が拒否されます。
このプロキシはコンテナーのネットワーク名前空間内で実行されておらず、コンテナー内の127.0.0.1に到達できないため、コンテナーはすべてのネットワークインターフェイスでリッスンしている必要があります。そのためのIPv4メソッドは、アプリケーションがリッスンするように構成することです0.0.0.0
。
また、公開されたポートは反対方向には機能しないことにも注意してください。ポートを公開して、コンテナーからホスト上のサービスに接続することはできません。代わりに、すでに使用中のホストポートをリッスンしようとすると、Dockerエラーが見つかります。
Exposeはドキュメントです。画像にメタデータを設定し、実行時にコンテナにも設定します。通常、これはDockerfileでEXPOSE
指示を使用して構成します。これは、イメージを実行しているユーザーが、デフォルトでアプリケーションがリッスンするポートを知るためのドキュメントとして機能します。構成ファイルを使用して構成されている場合、このメタデータはコンテナーにのみ設定されます。docker inspect
イメージまたはコンテナでを実行すると、公開されたポートを確認できます。
公開されたポートに依存するいくつかのツールがあります。dockerでは、-P
フラグはすべての公開されたポートをホストの一時ポートに公開します。コンテナーポートを明示的に設定しない場合、アプリケーションにトラフィックを送信するときにデフォルトで公開ポートを使用するさまざまなリバースプロキシもあります。
これらの外部ツール以外では、exposeはコンテナー間のネットワークにまったく影響を与えません。コンテナから別のコンテナにアクセスするには、共通のDockerネットワークとコンテナポートへの接続のみが必要です。そのネットワークがユーザーによって作成された場合(たとえば、というデフォルトのブリッジネットワークではない場合bridge
)、DNSを使用して他のコンテナーに接続できます。
私は以前の答えに完全に同意します。エクスポージャーとポートの違いは、Dockerのセキュリティコンセプトの一部であることを述べておきます。Docker のネットワーキングと連動しています。例えば:
Webフロントエンドとデータベースバックエンドを備えたアプリケーションを想像してください。外部の世界はWebフロントエンド(おそらくポート80)にアクセスする必要がありますが、バックエンド自体だけがデータベースのホストとポートにアクセスする必要があります。ユーザー定義のブリッジを使用すると、Webポートのみを開く必要があり、データベースアプリケーションはポートを開く必要がありません。これは、Webフロントエンドがユーザー定義のブリッジを介してアクセスできるためです。
これは、Dockerでネットワークアーキテクチャをセットアップするときの一般的な使用例です。したがって、たとえばデフォルトのブリッジネットワークでは、外部からポートにアクセスできません。そのため、「ポート」を使用してイングレスポイントを開くことができます。「公開」を使用して、ネットワーク内の通信を定義します。デフォルトのポートを公開する場合は、docker-composeファイルで「expose」を定義する必要はありません。
expose
にdocker-compose
?私の知る限り、リンクされたサービスがポートにアクセスできるようにするために、exposeを指定する必要はありません。