2016-12-15 2 views
7

ここで何が起こっているのか分かりません。 ホストのパブリックIPパブリッシュされたポートを使用して、ホストを介して、1つのドッカーコンテナ内から別のドッカーコンテナへのHTTPリクエストを実行したいだけです。ホストから別のドッカーコンテナを1つカールすることができないのですが、

これは私の設定です。私は私の開発マシンを持っています。私は2つのコンテナを持つドッカーホストマシンを持っています。 CONT_Aはリッスンし、ポート上でWebサービスを公開する3000

DEV-MACHINE 

HOST (Public IP = 111.222.333.444) 
    CONT_A (Publish 3000) 
    CONT_B 

私のdevのマシンでenter image description here

(完全に異なるマシン)何の問題もなく

私がカールすることができます

curl http://111.222.333.444:3000 --> OK 

私がホストにSSHするとき

私はCONT_B

ない可能、ちょうどタイムアウト内で実行すると、私は、任意のproblesm

curl http://111.222.333.444:3000 --> OK 

ずにカールすることができます。しかし、Pingは正常です...

docker exec -it CONT_B bash 
$ curl http://111.222.333.444:3000 --> TIMEOUT 
$ ping 111.222.333.444 --> OK 

なぜですか?

のUbuntu 16.04、ドッカーの1.12.3(デフォルトのネットワーク設定)

+0

私はこのことを考えているので、ドッカーは、iptablesの&ブリッジネットワークを使用してネットワークをどのように処理するかである可能性があります。私はそれを見なければならないが、あなたが与えているIPアドレスがおそらくドッカーネットワーク内で割り当てられた "内部IP"ではなく、ホストから見たIPアドレスであると推測している。原因のpingは、ドッキングホスト(コンテナではない)に解決されるため解決できる可能性があります。しかし、これを達成するドッカーの方法は、コンテナAにポートを公開するのではなく、オーバーレイネットワークをhttps://docs.docker.com/engine/userguide/networking/にすることです。 –

+2

@RikNauta私が使用しているIPアドレスは** public host ip **です。確かにそれは内部のドッカーネットワークと何らかの形で矛盾しない限り、常に正しく解決されるべきです。これは '104 ...' IPアドレスです。 – pqvst

+0

それはうまくいくはずです。ユーザーランドプロキシプロセスドッカーが実行され、ホスト上で待機し、tcp接続をコンテナに転送します。 Docker 1.11で同じことができますか?ドッカーデーモンで 'userland-proxy'がfalseに設定されていますか? – Matt

答えて

2

私は、これは厳密に質問には答えていない知っているが、あなたの問題を解決するためのよりドッカーっぽい方法があります。私は、容器間通信のためのポートを完全に公開することを忘れてしまいます。代わりに、docker swarmを使用してオーバーレイネットワークを作成します。あなたは完全なガイドhereを見つけることができますが、本質的には、次の操作を行います。

//create network  
docker network create --driver overlay --subnet=10.0.9.0/24 my-net 
//Start Container A 
docker run -d --name=A --network=my-net producer:latest 
//Start Container B 
docker run -d --name=B --network=my-net consumer:latest 

//Magic has occured 
docker exec -it B /bin/bash 
> curl A:3000 //MIND BLOWN! 

その後、容器内のあなただけのカールホスト名のAと、それは(あなたがなどスケーリングやって起動しても)

あなたのために解決されることが可能であることあなたが群れドッカーを使用してに熱心でないなら

あなたはまだ同様ドッカーレガシーリンクを使用することができます。

docker run -d --name B --link A:A consumer:latest 

あなたのA・コンテナ内のすべての公開(公開されません)ポートをリンクすることになります。

そして、あなたは生産に移動し始めた場合、最終的に...完全にリンク&オーバーレイネットワークを忘れる... Kubernetesの:-)ビットより困難な初期設定を使用しますが、彼らは&スケーリングをリンクさせるために概念&ツールの束を紹介コンテナのクラスタをもっと簡単に!しかし、それは私の個人的な意見です。

+2

単一のホストにいるときにオーバーレイネットワークである必要はなく、デフォルトのブリッジドライバはファイルを処理します。 – BMitch

0

私は同様の問題を抱えていました.1つのコンテナ(Webと呼ぶことができます)に複数のサーバーブロックがあり、cronは別のコンテナにインストールされています(cronと呼ぶことができます)。私はドッカーの作成を使用します。私は時々アプリケーションのいずれかでいくつかのPHPスクリプトを実行するためにcronからウェブへのカールを使いたかった。それは次のようになります:

curl http://app1.example.com/some_maintance.php 

しかし、私はいつもしばらくしてからホストに到達できませんでした。

最初のソリューションは、cronのコンテナ内の/ etc/hostsファイルを更新し、追加することでした:

1.2.3.4は、WebコンテナのIPであり、それが働いた
1.2.3.4 app1.example.com 

- しかし、これはハックです - としても私が知る限り、このようなマニュアルの更新は奨励されていません。ドッカーの作成でextra_hostsを使用する必要があります.IPアドレスを指定するには、コンテナーの名前の代わりに明示的なIPアドレスが必要です。

私はカスタムネットワークソリューションを使用しようとしましたが、これを処理する正しい方法はありますが、ここでは決して成功しませんでした。私がこれをする方法を学ぶなら、私はこの答えを更新することを約束します。

は、最後に私は、サーバーのIPアドレスを指定するには、カールの機能を使用し、私は別のパラメータにヘッダとしてドメイン名を渡す:

curl -H'Host: app1.example.com' web/some_maintance.php 

ない非常に美しいが、作業を行います。

(ここでは、ウェブが私のnginxのコンテナの名前です)

関連する問題