2017-04-21 20 views
0

私は2つの異なるDockerコンテナを持っていて、それぞれ異なるイメージを持っています。コンテナ内の各アプリは、競合しないポートを使用します。 docker-compose.ymlを参照してください:2つの異なるDockerコンテナ間でlocalhostを共有するにはどうすればよいですか?

version: "2" 

services: 

    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    ports: 
     - "6473:6473" 
     - "6474:6474" 
     - "1812:1812" 
    depends_on: 
     - postgres 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

    postgres: 
    container_name: postgres.dev 
    hostname: postgres.dev 
    image: postgres:9.6 
    ports: 
     - "5432:5432" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

私は、例えば、ホストマシン(Mac OS)をから成功した各画像をカールすることができますcurl -k https://localhost:6473/service_a/api/versionが動作します。私がしたいのは、service_aコンテナからlocalhostからpostgresコンテナを参照することができるように、これらの2つのコンテナが1つであるかのように、同じlocalhostを共有することです。ホスト名postgres.devservice_aコンテナの内側から使用すると可能ですが、localhostを使用したいと考えています。これは可能ですか?私はネットワーキングやドッカーにあまり精通していません。

Mac版:10.12.4

ドッカーバージョン:ドッカーバージョン17.03.0-CE、私はかなり前に研究を行っているが、解決策を見つけることができませんでした60ccb22

構築。 関連性:https://forums.docker.com/t/localhost-and-docker-compose-networking-issue/23100/2

+0

これを行ういくつかの方法(さまざまな度合いのハッキー)が、どのようにしたいですか? – johnharris85

+0

私は繰り返し述べますが、なぜこれをやりたいのですか? 'localhost'で困ったことは、混乱の原因になるだけです。同じコンテナ内で両方のプロセスを実行すると、ハック感がなくても同じ結果が得られます。 – Matt

+0

私の使用例はこれです:これらの2つのサービスはセキュリティのために同じホストに配備する必要がありますので、現実世界の 'service_a'は' localhost/127.0.0.1'だけを聞くように設定されます。理想的には、私はpostgresとservice_aの両方を持つDockerイメージを作成しますが、それは実現可能ではないと思われます。 – kolistivra

答えて

1

正しい方法:localhostを使用しないでください。代わりに、dockerのDNSネットワーキングを組み込み、サービス名でコンテナを参照してください。スケーリングを破るので、コンテナ名を設定してはいけません。


悪い方法:あなたがドッキングウィンドウのネットワーキング機能を使用したくない場合は、ネットワークをホストするために切り替えることができますが、それは、容器を接続するためのオプションのように非常に重要な機能や他のドッキングウィンドウ機能をオフにします一緒に自分の孤立したネットワークで動作しなくなります。その免責事項を使用すると、結果は次のようになります。あなたは、コンテナネットワークでもはやしているので、私は、ホストへのコンテナからポートパブリッシングを削除しない

version: "2" 

services: 

    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    network_mode: "host" 
    depends_on: 
     - postgres 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

    postgres: 
    container_name: postgres.dev 
    image: postgres:9.6 
    network_mode: "host" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

注意。そして、ドッキング・コンテナからホスト自体のホスト名を変更すべきではないので、ホスト名設定を削除しました。

参照しているリンク先の記事は、これがVMの場合、ホストがローカルホストとしてコンテナと通信できないことを示しています。これは予想される制限ですが、コンテナ自体はローカルホストとして互いに会話できるようになります。 docker-toolboxでVirtualBoxベースのインストールを使用する場合は、仮想ボックスIPによってコンテナと通信できるはずです。


本当に間違った方法:コンテナネットワークモードを乱用する。このモードは、コンテナのネットワーキングの問題や特殊な使用事例のデバッグに使用でき、DNSを使用するようにアプリケーションを再設定するのを避けるために使用するべきではありません。データベースを停止すると、ネットワークの名前空間が失われるため、別のコンテナを破棄します。

これは、docker-composeが何らかのアクションを実行する前にネットワークの存在をチェックするため、おそらく2つの別々のdocker-compose.ymlファイルを実行する必要があります。Postgresのコンテナで起動します。

version: "2" 
services: 
    postgres: 
    container_name: postgres.dev 
    image: postgres:9.6 
    ports: 
     - "5432:5432" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

その後、あなたは、同じネットワーク名前空間に第2のサービスを行うことができます。

version: "2" 
services: 
    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    network_mode: "container:postgres.dev" 
    ports: 
     - "6473:6473" 
     - "6474:6474" 
     - "1812:1812" 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 
+0

これは正しい方法だと思います。残念ながらMac用Dockerは 'host'ネットワーキングに問題があるようです:https://forums.docker.com/t/should-docker-run-net-host-work/14215とhttps://forums.docker.com/ localhost-connection-via-net-host/10471/15 – kolistivra

+0

フォーラムポストは、ホストからlocalhostでコンテナにアクセスしようとする問題を指摘しています。質問とこの答えは、コンテナからローカルホストへのコンテナです。しかし、私は繰り返し述べますが、これをしないでください。もしそれが壊れば、あなたはすべての部分を保つようになります。 – BMitch

関連する問題