Docker-compose多个实例在单个主机上的部署

5
这是我的 Docker 文件的外观。
version: "3"
services:
  controller:
    build: ./cd_controller
    image: cd_controller:latest
    env_file: $PWD/robot-configurations/.env
    cap_add:
      - ALL
    links:
      - test_fixture
    volumes:
      - dependencypackages:/root/dependency-packages
      - robotconfigurations:/root/robot-configurations
    container_name: controller_g5
  test_fixture:
    image: docker-standard-all.ur-update.dk/ur/pytest-ur:0.7.1
    volumes:
      - pytestfixture:/workspace
      - controllertests:/workspace/controller-tests
    entrypoint: /workspace/entrypoint.sh
    container_name: test_fixture
    stdin_open: true # docker run -i
    tty: true        # docker run -t
volumes:
  robotconfigurations:
    driver_opts:
      type: none
      device: $PWD/robot-configurations
      o: bind
  ...

基本上它有两个服务/容器:controller和test_fixture。 controller有运行的源代码,而test_fixture包含所有测试用例。 test_fixture需要通过套接字与控制器通信。由于docker-compose在其容器之间创建网络,在我的py-test案例中,我只是简单地使用

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("controller_g5", 30001)) # controller_g5 is name of the controller container 

到目前为止,一切看起来都很好。但我意识到我有多个版本/功能的源代码。所以我希望创建多个实例,每个实例都有自己的网络。给容器命名是否会阻止在不同网络中使用相同名称的容器创建?此外,我不确定如何在同一主机上启动具有类似容器的另一个网络。我发现了单个主机上的多个隔离环境,但无法获得示例。任何帮助都将不胜感激。
1个回答

8
你只需要使用一个不同的项目名称。默认情况下,compose使用您的项目所在的目录名称作为项目名称。docker-compose会适当地设置每个项目的隔离网络。
要创建两个命名空间为“dev”和“test”的项目实例,您可以按以下方式运行它:
docker-compose -p dev up
docker-compose -p test up 

https://docs.docker.com/compose/reference/overview/中。
-p, --project-name NAME     Specify an alternate project name
                              (default: directory name)

你需要删除多个项目实例中的container_name字段才能正常工作。Compose会自动在容器名称前添加项目名称,但如果指定了container_name,它就不会这样做。如果使用container_name,在从compose文件启动另一个项目时会出现容器名称冲突。删除container_name后,你的服务将以服务名称作为主机名。

感谢您的回复。这非常接近我正在寻找的解决方案。使用项目名称运行docker-compose无法设置固定的“容器名称:test_fixture/controller_g5”。看起来容器名称必须是唯一的,无论网络如何。您能否建议一种在不指定容器名称s.connect(("dev_controller_1", 30001))的情况下访问网络中其他容器的方法? - BhanuKiran
你需要删除 container_name 字段来解决容器名称冲突。Compose 通常会自动将项目名称前缀添加到容器中,除非指定了 container_name。在删除 container_name 字段后,你的服务将获得与服务名称相同的主机名(controller 和 test_fixture)。如果你在代码中硬编码了服务主机名为 controller_g5,那么你需要将服务重命名为 controller_g5 - Shashank V
dev_controller_1 . I am worried about the tailing number 1. The first container is name ends with _1 and the second _2. If i name the service as controller_g5 THe container name would be controller_g5_1 - BhanuKiran
1
您不需要担心数字。在项目中,您仍然可以使用服务名称作为主机名,例如 controller_g5 将正常工作。 - Shashank V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接