为两个Docker容器设置相同的IP地址

时间:2019-07-14 11:57:49

标签: docker docker-compose

我正在从docker-compose文件中旋转两个docker容器。一个容器正在运行服务,另一个容器正在运行以执行该服务的测试。 我的docker-compose如下所示:

version: "3"

services:
  service-1:
    build: <service_path>
    image: <service_image>
    container_name: service-container-1
    networks:
      docker_net_3:
        ipv4_address: 192.168.8.2
  test-executor-1:
    build: <test_scripts_path>
    image: <test_scripts_image>
    container_name: test-container-1
    networks:
      docker_net_3:
        ipv4_address: 192.168.8.1
networks:
  docker_net_3:
    driver: bridge
    ipam:
      config:
      - subnet: 192.168.8.0/24

我想在具有不同网络的容器的同一台机器上使用相同的IP地址运行相同的设置。 这样我的测试就可以访问我在测试执行程序配置中指定的服务URL。

我尝试用相同的子网创建一个不同的docker网络,但失败并出现以下错误。

Creating network "test_executor_docker_net_3" with driver "bridge"
ERROR: Pool overlaps with other one on this address space

如何为多个容器设置相同的IP地址?

1 个答案:

答案 0 :(得分:2)

您应该在这里做两件事:

  1. 在某些Docker Compose文件中,您可以将服务名称用作主机名。这是因为emcee's parallel tempering sampler和Docker提供了内部DNS服务。

  2. 您要连接的服务的主机名实际上应该是可配置的。在您的示例中,您的测试环境非常脆弱,因为如果无法完全获得192.168.8.0/24网络,它将无法正常工作,因此我无法在台式机,非Docker VM上本地运行此测试, ....

这应该使您陷入根本不关心这些IP地址的情况。您确实需要修改测试服务以了解环境变量。但是否则,与您显示的内容相同的docker-compose.yml文件将是

version: "3"
services:
  service-1:
    build: <service_path>
  test-executor-1:
    build: <test_scripts_path>
    environment:
      SERVICE_URL: 'http://service-1/'

(最明显的机械问题是,从Linux主机或VM,您可以直接访问Docker内部的IP地址,因此,如果多个容器想要具有相同的地址,则不清楚哪个容器192.168.8.1是。您还可以将容器连接到多个网络,它们会在每个网络中获得一个IP地址,以防止网络共享地址范围。