【问题标题】:Docker-compose multiple instances on a single host machineDocker-在单个主机上组合多个实例
【发布时间】:2020-06-17 19:05:28
【问题描述】:

这就是我的 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
  ...

基本上它有两个两个服务/容器控制器和test_fixture。控制器正在运行源代码,并且 test_fixture 包含所有 test_cases。 test_fixture 需要通过套接字与控制器通信。由于 docker-compose 在其容器之间创建了一个网络,因此在我的 py 测试用例中,我只是使用

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

到目前为止,一切看起来都很好。但我意识到我有多个版本/功能的源代码。所以我想创建一个相同事物的多个实例,每个实例都有自己的网络。命名容器是否会阻止在不同网络中创建具有相同名称的容器?此外,我不确定如何在同一台主机上使用类似的容器再启动一个网络。我遇到了Multiple isolated environments on a single host 但无法获得示例。

非常感谢任何帮助。

【问题讨论】:

    标签: linux docker docker-compose continuous-integration


    【解决方案1】:

    您只需要使用不同的项目名称。默认情况下,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,则在从撰写文件启动另一个项目时会出现容器名称冲突。删除container_name 后,您的服务将获得服务名称作为主机名。

    【讨论】:

    • 感谢您的回复。它非常接近我正在寻找的解决方案。使用项目名称运行 docker-compose 不允许设置固定的container names: test_fixture/controller_g5 看起来容器名称必须是唯一的,而与网络无关。您能否建议一种在不指定容器名称的情况下访问网络中其他容器的方法s.connect(("dev_controller_1", 30001))
    • 您需要删除container_name字段来修复容器名称冲突。除非指定了 container_name,否则 Compose 通常会自动将项目名称添加到容器中。删除 container_name 字段后,您的服务将获得与服务名称(控制器和 test_fixture)相同的主机名。如果您在代码中将服务主机名硬编码为controller_g5,则将服务重命名为controller_g5
    • dev_controller_1 。我担心拖尾编号 1。第一个容器的名称以 _1 结尾,第二个容器名称以 _2 结尾。如果我将服务命名为controller_g5,那么容器名称将是controller_g5_1
    • 您无需担心数字。在项目中,您仍然可以使用服务名称作为主机名,即 controller_g5 可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多