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
项目 a
和 b
:
.
├── a
│ └── docker-compose.yml
└── b
└── docker-compose.yml
项目 a
的 docker-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
:
我正在寻找使用 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
项目 a
和 b
:
.
├── a
│ └── docker-compose.yml
└── b
└── docker-compose.yml
项目 a
的 docker-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
: