docker网络导致的docker compose down执行问题

2025-05-26

问题

docker compose 在不同目录下运行时,创建的网络不同,这确实会导致 docker compose down 无法删除容器或网络,从而留下“残留容器”,引发后续冲突。


🧩 问题原理详解

默认网络命名规则

Docker Compose 会自动为项目创建网络,网络名是:

<项目名>_<网络名>

其中 <项目名> 是当前目录名或 -p 指定的项目名。

不同目录 = 不同项目名
比如你分别在两个目录运行:

/home/user/projectA --> 网络名是 projectA_app_network /home/user/projectB --> 网络名是 projectB_app_network

虽然两个 Compose 文件内容相同,但创建的是不同网络、不同容器组

  1. 问题来了:
    当你在 /home/user/projectB 执行 docker compose down,它只会清除 projectB_* 的容器和网络,不会清理你在 /home/user/projectA 创建的容器。


🚨 所以会发生:

  • 容器 caddy 是在 /home/user/projectA 创建的;

  • 你切换到 /home/user/projectB 执行 docker compose down,并不会删除这个 caddy 容器;

  • 接着你再在 projectB 执行 docker compose up,就会报错:容器名 caddy 已经被占用(其实是 projectA 的残留)。

解决办法

产生问题的配置

networks:
  app_network:
    driver: bridge

表示让 Docker Compose 自动创建一个名为 app_network 的网络,但它实际创建出来的网络名是:

<项目名>_app_network

如果你想让它使用一个已经存在的、不带前缀的网络(如 app_network),你需要改为 使用外部网络 配置:

✅ 修改方式如下:

1. 修改 docker-compose.yml 中的网络配置为:

networks:
  app_network:
    external: true

这表示 Docker Compose 不再自动创建,而是使用系统中已有的 app_network

2. 在容器运行之前,你需要手动创建该网络

docker network create app_network

这个命令只需要执行一次。


🧠 修改前后对比:

修改前(自动创建,有前缀)

修改后(使用外部网络,无前缀)

myproject_app_network

app_network(不带前缀)

由 Compose 自动创建

需手动创建一次

容器间仍可通信

一样通信,且跨目录项目共享网络


📌 最终示例配置:

version: '3'
services:
  fastapi:
    image: mix-app:1.0
    container_name: mix_app
    networks:
      - app_network
    # 其余配置略...

networks:
  app_network:
    external: true

PREV
Docker Compose 中 -p(项目名)参数详解及其对资源管理的影响
NEXT
what?可自动申请并配置证书!这款web服务能这么牛逼?