docker-composeポートと公開の違いは何ですか


回答:


527

docker-composeリファレンスによると、

ポートは次のように定義されます。

ポートを公開します。両方のポート(HOST:CONTAINER)を指定するか、コンテナーポートのみを指定します(ランダムなホストポートが選択されます)。

  • docker-compose.ymlで言及されているポートは、docker-composeによって開始されたさまざまなサービス間で共有されます。
  • ポートは、ランダムなポートまたは特定のポートに対してホストマシンに公開されます。

私の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

Exposeは次のように定義されます。

ホストマシンに公開せずにポートを公開します-ポートはリンクされたサービスにのみアクセスできます。内部ポートのみ指定できます。

ポートはホストマシンには公開されず、他のサービスにのみ公開されます。

mysql:
  image: mysql:5.7
  expose:
    - "3306"

そうするとdocker-compose ps、次のようになります。

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

24
指定することがありますどのような利点を説明しETO可能でしょうexposedocker-compose?私の知る限り、リンクされたサービスがポートにアクセスできるようにするために、exposeを指定する必要はありません。
ジューシーな

3
公開されたポートが同じDockerネットワーク内のサービスでのみ利用可能になると教えてはいけませんか(ほとんどの部分でリンクが置き換えられています)。
ニャー2018

8
@Juicy Dockerfilesと似ているexposeと思います:「EXPOSE命令は実際にはポートを公開しません。ドキュメントの一種として機能します...」docs.docker.com/engine/reference/builder/#expose
tsauerwein

1
ポートはファイアウォールレベルの設定を上書きしますか?ファイアウォールでmysqlのポートを開かないことに気づきましたが、リモートからアクセスできました。ポートをエクスポーズする代わりに「3306:3306」に設定しました。
TekiusFanatikus

3
また、を使用するとdocker-compose run、のポート定義docker-compose.ymlはデフォルトで無視されます。docker-compose upパラメータを使用または指定します--service-ports
Juha Untinen '10

177

ポート

  1. コンテナーをアクティブにして、Dockerの外部の世界(同じホストマシンまたは別のマシンにすることができます)から指定されたポートをリッスンし、さらに、Docker内のアクセス可能な世界をリッスンします。
  2. 複数のポートを指定できます(そのため、ポートポートではありません)

ここに画像の説明を入力してください

公開する

  1. コンテナーをアクティブ化して、Dockerの内部のワールドからのみ特定のポートをリッスンし、Dockerの外部のアクセスできないワールドからはリッスンします。
  2. 複数のポートを指定できます

ここに画像の説明を入力してください


3
公開では複数のポートが許可されることに注意してください-docs.docker.com/compose/compose-file/#expose- ただし、内部+外部ではなく内部ポートのみを指定します
Stuart Moore

しかし、コンテナから外の世界にアクセスしたい場合はどうすればよいですか?stackoverflow.com/questions/61322256/...
gstackoverflow

26

ポート このセクションは、ホストサーバーとDockerコンテナー間のマッピングを定義するために使用されます。

ports:
   - 10005:80

これは、コンテナー内で実行されているアプリケーションがポート80で公開されていることを意味します。ただし、外部システム/エンティティはそれにアクセスできないため、ホストサーバーのポートにマップする必要があります。

注:外部ポートがアプリケーションにアクセスできるようにするには、ホストポート10005を開き、ファイアウォールルールを変更する必要があります。

彼らは使うことができます

http:// {ホストIP}:10005

このようなもの

EXPOSE これは、アプリケーションがdockerコンテナー内で実行されているポートを定義するためにのみ使用されます。

dockerfileでも定義できます。一般に、dockerfile内でEXPOSEを定義することは広く、広く使用されている方法であり、デフォルトの80ポート以外のポートで実行することはほとんどありません。


19

ポート

この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を使用して他のコンテナーに接続できます。


3

私は以前の答えに完全に同意します。エクスポージャーとポートの違いは、Dockerのセキュリティコンセプトの一部であることを述べておきます。Docker のネットワーキングと連動しています。例えば:

Webフロントエンドとデータベースバックエンドを備えたアプリケーションを想像してください。外部の世界はWebフロントエンド(おそらくポート80)にアクセスする必要がありますが、バックエンド自体だけがデータベースのホストとポートにアクセスする必要があります。ユーザー定義のブリッジを使用すると、Webポートのみを開く必要があり、データベースアプリケーションはポートを開く必要がありません。これは、Webフロントエンドがユーザー定義のブリッジを介してアクセスできるためです。

これは、Dockerでネットワークアーキテクチャをセットアップするときの一般的な使用例です。したがって、たとえばデフォルトのブリッジネットワークでは、外部からポートにアクセスできません。そのため、「ポート」を使用してイングレスポイントを開くことができます。「公開」を使用して、ネットワーク内の通信を定義します。デフォルトのポートを公開する場合は、docker-composeファイルで「expose」を定義する必要はありません。

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