2016-11-12 116 views
1

我已經完成了大量搜索,但無法解決此問題。從另一個容器中的服務連接到rabbitmq泊塢窗容器

我通過這個命令有一個基本的RabbitMQ的容器中運行:

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

我使用nameko創造它連接到這個容器中的微服務。這是一個基本的microService模塊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:[email protected]

我希望把服務爲一體的碼頭工人容器(稱爲service_one),但是當我這樣做並運行以前的nameko命令時,無論我如何嘗試鏈接兩個容器,我都會得到socket.error: [Errno 111] ECONNREFUSED

什麼是正確的方法?目的是讓每個服務都在一個容器中,通過兔子互相交談。謝謝。

+0

「無論我如何嘗試鏈接兩個容器...」你有什麼嘗試? – larsks

+0

我試過鏈接和網絡,結果我得到ampq連接值每個方法都有點不對。 (我使用本地主機而不是AMQ_PORT_5672_TCP_ADDR等)。 – steve

回答

2

如果你正在一個容器內運行一個服務,那麼amqp://guest:[email protected]不會對你有什麼好處; localhost指的是容器的網絡命名空間......所以當然你會得到一個ECONNREFUSED,因爲這裏沒有任何東西在聽。

如果要連接到另一個容器中的服務,則需要使用該容器的IP地址或解析爲該容器的IP地址的主機名。

如果您在user-defined network中運行容器,則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選項來達到類似的,雖然不夠靈活,效果,如記錄here

+0

謝謝。我最終使用--link將每個服務容器連接到兔子,儘管我明白上述是新的標準方式。 – steve

+1

我只是想強調Docker網絡解決方案的一個優點:當使用'--link'時,如果你停止你的rabbitmq容器,你的應用程序運氣不好:在啓動一個新的rabbitmq後你不能「重新鏈接」容器容器。另一方面,使用依賴dns進行名稱解析的Docker網絡,如果您啓動一個與新容器名稱相同的新容器,則您的服務可能會恢復(假定您的應用程序代碼正常處理斷開連接) 。 – larsks

+0

啊,這很好,謝謝。如果我使用網絡解決方案,兔子的地址和端口是什麼?即相當於'AMQ_PORT_5672_TCP_ADDR'和'AMQ_PORT_5672_TCP_PORT' – steve