Docker面向多环境下的本地开发

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

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

是否有办法从服务中“包含”每个
docker compose.yml
docker 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'
Project
a
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