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をセロリと同じコンテナにインストールすると、正常に動作します。
コンテナが互いに相互作用するために何をする必要がありますか?
直接リンクは現在非推奨です。コンテナをリンクする新しい方法は 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アドレスを解決することをお勧めします。
コンテナーのIPを取得し、別のコンテナーからそれに接続するだけです。
CONTAINER_IP=$(Sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
-p 5672を指定すると、Dockerはホストの49xxxなどの新しいポートを開き、コンテナーのポート5672に転送します。
次のコマンドを実行すると、コンテナに転送されているポートを確認できます。
Sudo docker ps -a
そこから、次のようにホストIPアドレスに直接接続できます。
amqp://guest@Host_IP:49xxx
各コンテナは基本的に独自のローカルホストであるため、localhostは使用できません。
設計上、別のコンテナに直接接続することはできないと思います。それはホストの責任です。 Volumes を使用してコンテナ間でデータを共有する例をここに示します http://docs.docker.io/en/latest/examples/couchdb_data_volumes/ ですが、私はしませんそれがあなたが探しているものだと思います。
私は最近 https://github.com/toscanini/maestro について知りました-それはあなたのニーズに合うかもしれません。それができるかどうか教えてください:)、私はまだ自分で試していません。
編集。あなたが読むことができることに注意してください ここ ネイティブの「コンテナの配線とサービスの発見」がロードマップにあること。遅くとも7.0または8.0だと思います。
あなたはDockerインスタンスIPを取得できます...
CID=$(Sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); Sudo docker inspect $CID | grep IPAddress
しかし、それはあまり役に立ちません。
pipework を使用して、Dockerコンテナー間にプライベートネットワークを作成できます。
これは現在0.8ロードマップにあります:
画像を作成:
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"