Docker 适用于多环境本地开发

Docker for local development with multiple environment

我正在寻找使用 docker 来模拟我们当前云环境的最小值。我们有大约 10 个服务(每个服务都有自己的 MySQL8 数据库、redis、php-fpm 和 nginx)。目前他们每个存储库有一个 docker-compose.yml,但他们不能互相交谈,如果我想测试一个服务需要与另一个服务交谈的功能,我就不走运了。

我的第一个方法是使用 Debian 为每个服务创建一个 Dockerfile(并且 运行 一起使用新的 docker-compose.yml),但我没有走得太远,能够安装 nginx、(php-fpm 和依赖项),但是当我访问数据库时,它变得很奇怪,我觉得这不是正确的方法。

有没有办法 docker-compose.yml 从服务中“包含”每个 docker-compose.yml? 有更好的方法吗?或者我应该使用 docker-compose?

Dockerfile 和 运行 它们全部放在同一个网络上

TL;DR;

您可以使用 external networks to communicate with services from other projects or (depending on your project) use the -f command-line option / COMPOSE_FILE environment variable 配置 docker-compose 以指定撰写文件的路径,并在同一网络内启动所有服务。


使用外部网络

给定以下 tree 项目 ab:

.
├── a
│   └── docker-compose.yml
└── b
    └── docker-compose.yml

项目 adocker-compose 设置默认网络的名称:

version: '3.7'
services:
  nginx:
    image: 'nginx'
    container_name: 'nginx_a'
    expose:
    - '80'
networks:
  default:
    name: 'net_a'

并且项目 b 配置为使用命名网络 net_b 和 pre-existing net_a 外部网络:

version: '3.7'
services:
  nginx:
    image: 'nginx'
    container_name: 'nginx_b'
    expose:
    - '80'
    networks:
    - 'net_a'
    - 'default'
networks:
  default:
    name: 'net_b'
  net_a:
    external: true

... exec进入nginx_b容器我们可以到达nginx_a容器:

Note: this is a minimalist example. The external network must exist before trying to bring up an environment that is configured with the pre-existing network. Rather than modifying the existing projects docker-compose.yml I'd suggest using overrides.

该配置使 nginx_b 容器在两个网络中都占有一席之地:

使用 -f command-line 选项

使用 -f command-line 选项作为覆盖。它不适用于上述组合文件,因为它们都指定了 nginx 服务(docker-compose 将覆盖/合并第一个 nginx 服务与第二个)。

将修改后的 docker-compose.yml 用于项目 a:

version: '3.7'
services:
  nginx_a:
    container_name: 'nginx_a'
    image: 'nginx'
    expose:
    - '80'

... 对于项目 b

version: '3.7'
services:
  nginx_b:
    image: 'nginx'
    container_name: 'nginx_b'
    expose:
    - '80'

...我们可以将两种环境都置于同一个网络中:docker-compose -f a/docker-compose.yml:b/docker-compose.yml up -d: