Docker-在单个主机上组合多个实例

Bha*_*ran 6 linux continuous-integration docker docker-compose

这就是我的 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
  ...
Run Code Online (Sandbox Code Playgroud)

基本上它有两个两个服务/容器控制器和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 
Run Code Online (Sandbox Code Playgroud)

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

任何帮助是极大的赞赏。

Sha*_*k V 10

您只需使用不同的项目名称即可。默认情况下,compose 使用项目所在的目录名称作为项目名称。docker-compose负责为每个项目适当地设置隔离网络。

要创建命名空间为“dev”和“test”的两个项目实例,您可以按如下方式运行它:

docker-compose -p dev up
docker-compose -p test up 
Run Code Online (Sandbox Code Playgroud)

来自https://docs.docker.com/compose/reference/overview/

-p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
Run Code Online (Sandbox Code Playgroud)

您需要删除container_name多个项目实例才能工作的字段。container_nameCompose 会自动在容器名称前添加项目名称,但如果指定则不会执行此操作。container_name如果使用的话,从 compose 文件启动另一个项目时,您会遇到容器名称冲突。删除后container_name,您的服务将获取服务名称作为主机名。