我如何配置 2 docker 组合文件,以便它们在已被拉取的情况下使用现有服务?
How can I configure 2 docker compose files such that they use an existing service if it's already been pulled?
我经常在使用 Docker 的不同应用程序之间切换,其中一些是需要同时运行的微服务,因此我不能简单地杀死所有容器。如果他们共享 mssql 或 redis 之类的服务,我 运行 会遇到端口预留问题。当然,我可以将它们设置为使用自己的端口。但是如果服务的同一个实例已经存在,我想重用它,因为我的开发机器不是那么强大。 docker 文件应该各自创建自己的数据库,所以一切都已经像我希望的那样隔离了。
用例看起来可行,但不是真正的标准(因为乍一看存在一些风险,不同应用程序的数据库会纠缠在一起!)但假设它对于开发(≠生产)环境是可以的。
TL;DR:
您似乎只需要创建(至少)三个 docker-compose.yml
文件:
- 普通数据库的那个,比如说
mysql/docker-compose.yml
- 第一个 webapp 的那个,比方说
app1/docker-compose.yml
- 第二个webapp的那个,依此类推...
该方法的症结在于:
- 我们依赖 external networks、
的 so-called docker-compose 功能
- 而且我们不要暴露比要求更多的端口……(详情见下文:§)
最小工作示例
文件mysql/docker-compose.yml
:
services:
db:
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
volumes:
- mysql-data:/var/lib/mysql
# don't include ports:
networks:
- mysql-network
volumes:
mysql-data:
driver: local
networks:
mysql-network:
driver: bridge
# override the name
name: mysql-network
文件app1/docker-compose.yml
:
services:
app1:
image: phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: db
networks:
- mysql-network
ports:
- '8080:80'
networks:
mysql-network:
external:
name: mysql-network
旁注
当然,由于后端和公共数据库是分开的 docker-compose.yml
规范,您将无法从某些字段中受益,例如 depends_on:
,即,您需要事先在 mysql/
文件夹中手动 运行 docker-compose up -d
。
(§) 即使这个用例只针对开发环境,像往常一样,应该避免在 db
服务中公开端口,即 DON 'T 写:
db:
image: mysql:8
ports:
- '3306:3306'
...
as (i) 这不是 Compose 服务通信所必需的:它们只需要属于一个公共 Compose 网络并使用 Compose 服务主机名,并且 (ii) 直接在主机上暴露一个这样的端口会不必要地增加攻击面……
我经常在使用 Docker 的不同应用程序之间切换,其中一些是需要同时运行的微服务,因此我不能简单地杀死所有容器。如果他们共享 mssql 或 redis 之类的服务,我 运行 会遇到端口预留问题。当然,我可以将它们设置为使用自己的端口。但是如果服务的同一个实例已经存在,我想重用它,因为我的开发机器不是那么强大。 docker 文件应该各自创建自己的数据库,所以一切都已经像我希望的那样隔离了。
用例看起来可行,但不是真正的标准(因为乍一看存在一些风险,不同应用程序的数据库会纠缠在一起!)但假设它对于开发(≠生产)环境是可以的。
TL;DR:
您似乎只需要创建(至少)三个 docker-compose.yml
文件:
- 普通数据库的那个,比如说
mysql/docker-compose.yml
- 第一个 webapp 的那个,比方说
app1/docker-compose.yml
- 第二个webapp的那个,依此类推...
该方法的症结在于:
- 我们依赖 external networks、 的 so-called docker-compose 功能
- 而且我们不要暴露比要求更多的端口……(详情见下文:§)
最小工作示例
文件mysql/docker-compose.yml
:
services:
db:
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
volumes:
- mysql-data:/var/lib/mysql
# don't include ports:
networks:
- mysql-network
volumes:
mysql-data:
driver: local
networks:
mysql-network:
driver: bridge
# override the name
name: mysql-network
文件app1/docker-compose.yml
:
services:
app1:
image: phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: db
networks:
- mysql-network
ports:
- '8080:80'
networks:
mysql-network:
external:
name: mysql-network
旁注
当然,由于后端和公共数据库是分开的
docker-compose.yml
规范,您将无法从某些字段中受益,例如depends_on:
,即,您需要事先在mysql/
文件夹中手动 运行docker-compose up -d
。(§) 即使这个用例只针对开发环境,像往常一样,应该避免在
db
服务中公开端口,即 DON 'T 写:db: image: mysql:8 ports: - '3306:3306' ...
as (i) 这不是 Compose 服务通信所必需的:它们只需要属于一个公共 Compose 网络并使用 Compose 服务主机名,并且 (ii) 直接在主机上暴露一个这样的端口会不必要地增加攻击面……