Docker面向多环境下的本地开发
我正在寻找使用docker来模拟我们当前云环境的最小值。我们有大约10个服务(每个都有自己的MySQL8数据库、redis、php-fpm和nginx)。目前,他们每个存储库都有一个Docker面向多环境下的本地开发,docker,docker-compose,dockerfile,microservices,Docker,Docker Compose,Dockerfile,Microservices,我正在寻找使用docker来模拟我们当前云环境的最小值。我们有大约10个服务(每个都有自己的MySQL8数据库、redis、php-fpm和nginx)。目前,他们每个存储库都有一个docker compose.yml,但他们不能互相交谈,如果我想测试一个服务需要与另一个服务交谈的功能,我就倒霉了 我的第一个方法是使用Debian为每个服务创建一个Dockerfile(并使用一个新的docker compose.yml一起运行),但我没有走得太远,能够安装nginx,(php fpm和依赖项),
docker compose.yml
,但他们不能互相交谈,如果我想测试一个服务需要与另一个服务交谈的功能,我就倒霉了
我的第一个方法是使用Debian为每个服务创建一个Dockerfile
(并使用一个新的docker compose.yml
一起运行),但我没有走得太远,能够安装nginx
,(php fpm
和依赖项),但当我进入数据库时,它变得很奇怪,我觉得这不是正确的方法
是否有办法从服务中“包含”每个docker compose.ymldocker compose.yml?
有没有更好的方法?或者我应该继续使用Dockerfile
并使用dockercompose
在同一网络上运行它们吗?TL;博士
您可以使用配置docker compose
与来自其他项目的服务进行通信,或者(根据您的项目)使用/指定合成文件的路径,并将所有服务置于同一网络中
使用外部网络
给定以下带有项目a
和b的树:
.
├── a
│ └── docker-compose.yml
└── b
└── docker-compose.yml
version: '3.7'
services:
nginx_b:
image: 'nginx'
container_name: 'nginx_b'
expose:
- '80'
Projecta
的docker compose
为默认网络设置名称:
version: '3.7'
services:
nginx:
image: 'nginx'
container_name: 'nginx_a'
expose:
- '80'
networks:
default:
name: 'net_a'
项目b
配置为使用命名网络net\u b
和预先存在的net\u 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\u b
容器,我们可以到达nginx\u a
容器:
注意:这是一个极简主义的例子。外部网络必须存在,然后才能尝试使用预先存在的网络配置环境。我建议使用docker compose.yml,而不是修改现有的项目
该配置使nginx_b
容器在两个网络中各有一英尺:
使用-f
命令行选项
使用-f
命令行选项充当覆盖。它不适用于上述组合文件,因为两者都指定了nginx
服务(docker compose
将覆盖/合并第一个nginx
服务和第二个nginx
服务)
为项目a
使用修改后的docker compose.yml
:
version: '3.7'
services:
nginx_a:
container_name: 'nginx_a'
image: 'nginx'
expose:
- '80'
。。。对于项目b
:
.
├── a
│ └── docker-compose.yml
└── b
└── docker-compose.yml
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
:
您可以使用,即,使用网络A创建项目A,然后创建项目B并使用其自己的网络+项目A创建的外部网络。使用外部网络配置的项目B中的服务可以与项目A中运行的服务通信。如果您确实希望在同一网络中启动所有服务(假设它们都是使用默认网络配置的)然后,您可以使用或环境变量来包含所有docker compose.yml
文件中的服务,即:compose\u FILE=docker compose.a.yml:docker-compose.b.yml docker compose up-d
,但是请注意,如果多个项目指定相同的服务,这将作为覆盖。谢谢您的回复。我已经修改了指定使用-f方法。我发现的唯一问题是服务A的mysql与服务B的mysql崩溃。错误消息为:无法锁定。/ibdata1错误:11
两个服务都使用相同的命名卷(?)在这种情况下,第一个实例正确启动,第二个实例(装载相同的卷)无法获取由第一个服务持有的锁。您使用的是来自本地文件系统的绑定装载,而不是命名卷。您可以更新每个db服务的卷映射,以使用命名卷或在主机上使用不同的路径。例如,将/env/mysql/data:/var/lib/mysql
替换为/db\u a/mysql/data:/var/lib/mysql
用于其中一个服务和/db_b/mysql/data:/var/lib/mysql
因此服务不会尝试挂载相同的目录。是的,但是路径/env/mysql/data
与运行docker compose
的iirc的位置相关(我需要仔细检查)但是,这个想法是存在的,只要这些服务没有装载相同的卷,你就应该是好的。我只运行了两个测试,路径/env/mysql/data
是相对于第一个docker compose.yml
文件位置的(使用-f参数传递),显示错误:生成路径…\service\u a\service\u b\…不存在、不可访问或不是有效的URL