不同网络下不同Docker Compose文件如何共享已运行的MySQL容器
实现方案
核心原理
两个Docker Compose栈的容器默认网络隔离,只要让第二份配置里的服务同时加入MySQL所在的第一份栈的网络,就能通过容器名直接访问MySQL实例,不需要额外启动新的MySQL容器,也无需将MySQL端口映射到宿主机,内部网络通信即可完成调用,安全性更高。
操作步骤
先查询第一份Compose创建的MySQL所在网络的实际名称
执行命令:docker network ls
找到前缀为第一份Compose所在目录名(默认项目名)、后缀为some-network的网络,比如第一份Compose所在目录叫db-stack,默认网络名就是db-stack_some-network;如果第一份配置里已经显式指定了网络名,就直接用你指定的名称。修改第二份Docker Compose配置,做两处核心调整:
- 顶层新增
networks字段,声明第一份的MySQL网络为外部可引用网络 - 给
service1新增加入MySQL网络的配置,同时保留原有some-network-1网络 - service1内连接MySQL的配置中,主机地址直接填第一份MySQL的
container_name的值(示例里的container_name)即可,端口用MySQL默认的3306
- 顶层新增
修改后的第二份Compose配置示例
services: service1: container_name: service1 restart: always build: context: ....... volumes: - ...... ports: - ..... # 同时加入原有网络和MySQL所在的外部网络 networks: - some-network-1 - mysql-network # 注意:跨Compose的depends_on不生效,此处不需要配置,建议在service1的启动逻辑里加等待MySQL就绪的判断,或通过健康检查做依赖控制 # 顶层新增网络声明 networks: some-network-1: # 保留你原来some-network-1的原有配置即可 mysql-network: external: true # 此处替换为第一步查询到的实际MySQL网络名称 name: db-stack_some-network
可选优化(第一份Compose调整,非必须)
如果后续还要让更多其他栈访问这个MySQL,可以把第一份Compose里的some-network显式声明固定名称,避免默认自动加项目名前缀,配置如下:
services: mysql: restart: always container_name: container_name image: mysql environment: .... volumes: - ..... healthcheck: - ... networks: - some-network # 顶层新增网络声明 networks: some-network: name: some-network
内容的提问来源于stack exchange,提问作者sayali
相关产品推荐
相关产品推荐

