问题
docker compose
在不同目录下运行时,创建的网络不同,这确实会导致 docker compose down
无法删除容器或网络,从而留下“残留容器”,引发后续冲突。
🧩 问题原理详解
默认网络命名规则:
Docker Compose 会自动为项目创建网络,网络名是:
<项目名>_<网络名>
其中 <项目名>
是当前目录名或 -p
指定的项目名。
不同目录 = 不同项目名
比如你分别在两个目录运行:
/home/user/projectA --> 网络名是 projectA_app_network /home/user/projectB --> 网络名是 projectB_app_network
虽然两个 Compose 文件内容相同,但创建的是不同网络、不同容器组。
问题来了:
当你在/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
这个命令只需要执行一次。
🧠 修改前后对比:
📌 最终示例配置:
version: '3'
services:
fastapi:
image: mix-app:1.0
container_name: mix_app
networks:
- app_network
# 其余配置略...
networks:
app_network:
external: true