2016-08-22 10 views
5

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

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

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

次私は私のサービスを管理するために、ホストにポートをフォワーディング関連していますが、サービスは単にデフォルトのドッキングウィンドウのネットワークを使って相互にアクセスすることができます考えてみましょう。たとえば、serv1で実行されているプログラムはredis:6379にアクセスすることができ、DNSマジックによってはそのような作業が行われます。ホスト名:ポートでコンテナのポートにアクセスできるように、私のホストをこのネットワークに追加したいと思います。

+0

https://www.npmjs.com/package/docker-machine-dns –

+2

現在、Dockerはポートバインディングの使用を継続するよう指示します。内部DNSを公開したり、私が見たドッカーホストにリンクすることは何もありません。また、デフォルトのファイアウォールルールは、ホストの外部からの直接アクセスを妨げ、このポートバインドを強制的に実行します。 Nehalのコメントはdockerホストの解決を示し、artworkadはあなたがすでに行っているポートバインディングを示しています。 – BMitch

答えて

3

からあなたは、アプリケーションと同じネットワーク上にあるコンテナ内(dnsmasqのような)DNSプロキシを実行することによって、これを達成することができます。その後、コンテナipでホストdnsを指定すると、ネットワーク上のコンテナにあるかのようにホスト名を解決できます。

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

1

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

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

はトリックを行う必要がありhttps://docs.docker.com/compose/compose-file/#/expose

expose: 
    - "6379" 

、ここで説明したようコマンドを公開使用する必要があること達成するために

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

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

+0

正確には、ホストのポートにバインドせずに、コンテナ内のどのポートにもアクセスできるようにしたいと考えています。たとえば、serv1で8080上で実行されているWebサーバーがある場合、私は自分のホストのブラウザを使用し、localhost:8080の代わりにserv1:8080を指しています。 この方法では、新しいポートへのアクセスが必要になるたびにドッカー作成ファイルを編集する必要はありません。 – polvoazul

+0

これは既にコンテナ間で発生しています。私のserv1コンテナでは、私はserv2:6379経由でredisデーモンにアクセスできます。先見性や何かにポートを公開する必要はなく、同じネットワーク上にあるだけで機能します。 私はホスト上でこの動作が欲しいです。 – polvoazul

+0

@polvoazul私は理解しています。しかし、DNSを使った内部サービスの発見とホストへのサービスエクスポージャーを混在させることはできないと思います(これはポートバインドによって行われます)。また、すべてのポートだけを公開するのが良い方法であるかどうかは疑問です。ホストからサービスにアクセスするためには、ポートバインディングについては本当に良い方法ではないと思います(少なくとも私はそのような方法を知らない)。 –

関連する問題