使用 Compose 文件引用 Docker 容器中的多个主机名

使用 Compose 文件引用 Docker 容器中的多个主机名

我们通过 Docker 在自己的容器中运行大量服务,并使用 Docker Compose 连接它们。

以前我们使用链接来引用其他主机,但这样做的问题是,如果容器重新启动并获取新的 IP 地址,则链接的节点将不知道这一点并将停止工作。

因此,我们创建了一个网络并命名了主机,这很好用。但是,我们有一个用于测试的模拟组件,它取代了其他容器。我可以通过链接轻松配置这一点,但我不知道如何通过网络做到这一点。

原本是这样的:

mm:
  extends:
    file: common-service.yml
    service:  mm-container
  links:
    - mock:enet
    - mock:ff

(其中mm,容器知道容器enetff,并且在这个用于测试的组合文件中,我们将它们链接到容器mock。)

我尝试添加这个而不是链接:

extra_hosts:
  - "enet:mock"
  - "ff:mock"

(其中enetff是模拟主机名)但当然这会将这些行按原样添加到 /etc/hosts 中,因此不会进行主机名解析。

Docker 中是否有针对此问题的解决办法,或者我们是否必须重写我们的模拟工具?

答案1

您可以在模拟容器上定义网络别名。网络上定义了这些别名的每个人都将看到它们,因此您可能需要调整网络以防止其他容器看到它。例如

version: '3'

networks:
  mocknet:

services:
  mm:
    image: mm:latest
    networks:
      default:
      mocknet:

  other_svc:
    image: other_image:latest

  mock:
    image: mock:latest
    networks:
      mocknet:
        aliases:
        - ff
        - enet

如果此堆栈中的所有内容都可以将 ff 和 enet 解析为模拟服务,那么您可以不再使用 mocknet 而只需在默认网络上设置别名。

答案2

只要只有两个,您就可以为“mock”提供一个名称和一个主机名。Docker 会将它们都放入/etc/hosts

因此,类似于:

mock:
  [definitions of how to run 'mock']
  container_name: enet
  hostname: ff

相关内容