16

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

次のコマンドで基本的な 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 コマンドを実行するsocket.error: [Errno 111] ECONNREFUSEDと、2 つのコンテナーをどのようにリンクしようとしても取得されません。

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

4

1 に答える 1

28

コンテナ内でサービスを実行している場合、何の役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

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

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

于 2016-11-12T14:18:42.590 に答える