如何从应用程序服务器容器连接到Rabbitmq容器

时间:2019-03-09 11:53:44

标签: docker docker-compose rabbitmq

我是Docker的新手,我正在尝试将我用Golang编写的该应用程序进行Docker化。这是一个简单的Web服务器,可与Rabbitmq和mongodb进行交互

它将凭据形成一个toml文件并将其加载到配置结构中,然后在端口3000上启动应用程序服务器。这些是凭据

mongo_server = "localhost"
database = "collect_db"
rabbitmq_server = "amqp://guest:guest@localhost:5672/"

如果无法连接到这些URL,它将失败并显示错误。以下是我的docker-compose.yml

version: '3'
services:
  rabbitmq:
    image: rabbitmq 
    ports:
      - 5672:5672
  mongodb:
    image: mongo
    ports:
      - 27017:27017
  web:
    build: .
    image: palash2504/collect
    container_name: collect_service
    ports:
      - 3000:3000
    depends_on:
      - rabbitmq
      - mongodb
    links: [rabbitmq, mongodb]

但是它无法与用于本地开发的URL上的Rabbitmq连接,即amqp://guest:guest@localhost:5672/

我意识到,rabbitmq容器可能在配置文件中提供的地址以外的其他地址上运行。

我想知道设置任何环境凭证的正确方法,以便能够将我的应用程序连接到Rabbitmq。

还有什么方法最适合更改我的应用程序代码以初始化与外部服务的连接?我当时正在考虑放弃config.toml文件,并使用os.Getenv和os.Setenv来获取连接的URL。

1 个答案:

答案 0 :(得分:2)

本地主机地址可以在本地解析。因此,它们将无法在容器内部工作,因为它们将寻找本地地址(即在容器内部)。

服务可以通过使用服务名称作为地址来相互访问。因此,例如,您可以在网络容器中定位mongodb

您可以试一下:

mongo_server = mongodb
database = "collect_db"
rabbitmq_server = "amqp://guest:guest@rabbitmq/"

建议在撰写文件本身中设置服务目标环境变量:

#docker-compose.yml

#...other stuff...

web:
    #...other stuff...
    environment:
      RABBITMQ_SERVER: rabbitmq
      MONGO_SERVER: mongodb
    depends_on:
      - rabbitmq
      - mongodb

这使您可以在单个位置进行配置调整。

作为旁注,在我看来links: [rabbitmq, mongodb]可以删除。并且我建议不要更改容器名称(除非必要,请删除container_name: collect_service