多くの検索を行いましたが、この問題を修正できません。
このコマンドを介して実行されている基本的な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
が返されます。
正しい方法は何でしょうか?目的は、各サービスをコンテナーに入れ、すべてがウサギを介して相互に通信することです。ありがとう。
コンテナ内でサービスを実行している場合、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
オプションを使用して、文書化されているように、柔軟性は劣りますが、同様の効果を実現できます ここ 。