web-dev-qa-db-ja.com

別のコンテナのサービスからrabbitmqdockerコンテナに接続する

多くの検索を行いましたが、この問題を修正できません。

このコマンドを介して実行されている基本的なRabbitmqコンテナーがあります。

docker run -d --hostname rabbitmqhost --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management

namekoを使用して、このコンテナーに接続するマイクロサービスを作成しています。基本的なマイクロサービスモジュールmain.pyは次のとおりです。

from nameko.rpc import rpc
class Service_Name(object):
    name = "service_name"

    @rpc
    def service_endpoint(self, arg=None):
        logging.info('service_one endpoint, arg = %s', arg)

このサービスは実行され、次のコマンドを使用してホストマシンからrabbitmqに接続します。

nameko run main --broker amqp://guest:guest@localhost

サービスをDockerコンテナー(service_oneと呼ばれる)に入れたかったのですが、そうして前のnamekoコマンドを実行すると、2つのコンテナーをどのようにリンクしようとしても、socket.error: [Errno 111] ECONNREFUSEDが返されます。

正しい方法は何でしょうか?目的は、各サービスをコンテナーに入れ、すべてがウサギを介して相互に通信することです。ありがとう。

8
steve

コンテナ内でサービスを実行している場合、amqp://guest:guest@localhostは何の役にも立ちません。 localhostは、コンテナのネットワーク名前空間を指します...もちろん、そこには何もリッスンしていないため、ECONNREFUSEDを取得します。

別のコンテナのサービスに接続する場合は、そのコンテナのIPアドレス、またはそのコンテナのIPアドレスに解決されるホスト名を使用する必要があります。

ユーザー定義ネットワーク でコンテナーを実行している場合、Dockerはコンテナー名をアドレスにマップするDNSサーバーを維持します。つまり、最初にネットワークを作成した場合:

docker network create myapp_net

次に、そのネットワークでrabbitmqコンテナを起動します。

docker run -d --network myapp_net --hostname rabbitmqhost \
   --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management

次に、そのネットワークで開始されたotherコンテナーは、ホスト名rabbitmqを使用してそのコンテナーに接続できるようになります。

デフォルトのネットワークで実行されているコンテナー(コマンドラインに--networkパラメーターがない)の場合、--linkオプションを使用して、文書化されているように、柔軟性は劣りますが、同様の効果を実現できます ここ

11
larsks