web-dev-qa-db-ja.com

あるDockerコンテナーから別のコンテナーに接続する

1つのdockerコンテナーでrabbitmq-serverを実行し、セロリを使用して別のコンテナーからそれに接続したい( http://celeryproject.org/

以下のコマンドを使用してrabbitmqを実行しています...

Sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server

とセロリを実行して

Sudo docker run -i -t markellul/celery /bin/bash

http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html で接続を検証するための非常に基本的なチュートリアルを実行しようとしているとき

接続拒否エラーが発生します:

コンシューマ:amqp://[email protected]:5672 //に接続できません:[Errno 111]接続が拒否されました。

Rabbitmqをセロリと同じコンテナにインストールすると、正常に動作します。

コンテナが互いに相互作用するために何をする必要がありますか?

22
Mark Ellul

[編集2016]

直接リンクは現在非推奨です。コンテナをリンクする新しい方法は docker network connect です。これは仮想ネットワークと非常によく似ており、以前のリンク方法よりも幅広い機能セットを備えています。

まず、名前付きコンテナーを作成します。

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
docker run --name celery -it markellul/celery /bin/bash

次に、ネットワークを作成します(最後のパラメーターはネットワーク名です)。

docker network create -d bridge --subnet 172.25.0.0/16 mynetwork

コンテナを新しく作成したネットワークに接続します。

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery

これで、両方のコンテナが同じネットワークにあり、相互に通信できます。

非常に詳細なユーザーガイドは ネットワークの操作:コンテナーの接続 にあります。

[古い答え]

Docker 0.6.5のリンクと呼ばれる新機能 があります。これは、Dockerコンテナー間の通信を支援するためのものです。

まず、いつものようにrabbitmqコンテナーを作成します。人生を少し楽にする新しい「名前」機能も使用したことに注意してください。

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server

リンクパラメータを使用してコンテナをマップできます(ここでは名前を使用していますが、IDでもかまいません)。

docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash

Dockerがいくつかの環境変数を自動的に追加したので、これでrabbitmqコンテナーのIPとポートにアクセスできます。

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT

さらに、Dockerはソースコンテナーのホストエントリを/etc/hostsファイルに追加します。この例では、amqはコンテナ内で定義されたホストになります。
Dockerから ドキュメント

/ etc/hostsファイルのHostエントリとは異なり、環境変数に格納されているIPアドレスは、ソースコンテナーが再起動されても自動的に更新されません。/etc/hostsのHostエントリを使用して、リンクされたコンテナのIPアドレスを解決することをお勧めします。

78
Alp

コンテナーのIPを取得し、別のコンテナーからそれに接続するだけです。

CONTAINER_IP=$(Sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
6
Valentin Kantor

-p 5672を指定すると、Dockerはホストの49xxxなどの新しいポートを開き、コンテナーのポート5672に転送します。

次のコマンドを実行すると、コンテナに転送されているポートを確認できます。

Sudo docker ps -a

そこから、次のようにホストIPアドレスに直接接続できます。

amqp://guest@Host_IP:49xxx

各コンテナは基本的に独自のローカルホストであるため、localhostは使用できません。

3
amattn

設計上、別のコンテナに直接接続することはできないと思います。それはホストの責任です。 Volumes を使用してコンテナ間でデータを共有する例をここに示します http://docs.docker.io/en/latest/examples/couchdb_data_volumes/ ですが、私はしませんそれがあなたが探しているものだと思います。

私は最近 https://github.com/toscanini/maestro について知りました-それはあなたのニーズに合うかもしれません。それができるかどうか教えてください:)、私はまだ自分で試していません。


編集。あなたが読むことができることに注意してください ここ ネイティブの「コンテナの配線とサービスの発見」がロードマップにあること。遅くとも7.0または8.0だと思います。

1
qkrijger

あなたはDockerインスタンスIPを取得できます...

CID=$(Sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); Sudo docker inspect $CID | grep IPAddress

しかし、それはあまり役に立ちません。

pipework を使用して、Dockerコンテナー間にプライベートネットワークを作成できます。

1
chanux

これは現在0.8ロードマップにあります:

https://github.com/dotcloud/docker/issues/114

0
Allard Hoeve

画像を作成:

 docker build -t "imagename1" .
 docker build -t "imagename2" .

Dockerイメージを実行します。

docker run -it -p 8000:8000 --name=imagename1 imagename1
docker run -it -p 8080:8080 --name=imagename2 imagename2

ネットワークを作成:

docker network create -d bridge "networkname"

イメージを実行した後に作成されたcontainer(imagename)を使用してネットワークを接続します。

docker network connect "networkname" "imagename1"
docker network connect "networkname" "imagename2"

ネットワークには任意の数のコンテナを追加できます。

docker network inspect ''networkname"