web-dev-qa-db-ja.com

Dockerネットワークをホストマシンに公開するにはどうすればよいですか?

次のdocker-compose.ymlを検討してください

version: '2'
services:
    serv1:
        build: .
        ports:
          - "8080:8080"
    links:
      - serv2

    serv2:
        image: redis
        ports:
          - "6379:6379"

サービスを管理するためにポートをホストに転送していますが、デフォルトのDockerネットワークを使用するだけでサービスが相互にアクセスできます。たとえば、serv1で実行されているプログラムはredis:6379にアクセスでき、DNSの魔法がそれを機能させます。ホスト名:ポートでコンテナのポートにアクセスできるように、このネットワークにホストを追加したいと思います。

10
polvoazul

これは、アプリケーションと同じネットワーク上にあるコンテナーでdnsプロキシ(dnsmasqなど)を実行することで実現できます。次に、ホストDNSをコンテナIPに向けると、ネットワーク上のコンテナにいるかのようにホスト名を解決できるようになります。

https://github.com/hiroshi/docker-dns-proxy はその一例です。

7
dnephin

私はあなたを正しく理解しているかどうかわかりません。あなたは例えば欲しい同じネットワーク内にあるコンテナからだけでなく、ホストIPアドレスを使用してコンテナの外部からもredisサーバーにアクセスできますか?

これを実現するには、ここで説明するようにexposeコマンドを使用する必要があります https://docs.docker.com/compose/compose-file /#/ expose

expose:
  - "6379"

そう

ports:
  - "6379:6379"
expose:
  - "6379"

トリックを行う必要があります。

EXPOSE命令は、コンテナーが実行時に指定されたネットワークポートでリッスンすることをDockerに通知します。 EXPOSEは、コンテナのポートにホストがアクセスできるようにしません。これを行うには、-pフラグを使用してポートの範囲を公開するか、-Pフラグを使用して公開されているすべてのポートを公開する必要があります。 1つのポート番号を公開し、別の番号で外部に公開できます。

から https://docs.docker.com/engine/reference/builder/#expose

1
Upvote

ホストマシンのhostsファイルを変更して、コンテナエントリを追加するだけです。 例: 127.0.0.1 container1 127.0.0.1 container2 127.0.0.1 container3

ポートのバインドが行われたと仮定します。

0
Hunter

コンテナにアクセスするための簡単な回避策が必要な場合:

  1. コンテナIPを取得
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

172.19.0.9
  1. コンテナ名を使用する必要がある場合は、それを/etc/hostsに追加します。
# /etc/hosts

172.19.0.9 container_name
0
Yamaneko