Docker 报错 name is already in use by container 怎么办?
容器名在同一 Docker daemon 内唯一,报名称冲突时:docker ps -a 找到占用者,docker rm 删除或 docker rename 改名;脚本化启动建议用 --rm 或不指定名字。本文给出处理流程。
原因与解法:容器名在同一个 Docker daemon 内唯一(包括已停止的容器),你要用的名字被某个旧容器占着。处理:①docker ps -a 找到占名字的容器;②确认无用就 docker rm <名字> 删掉,还想留就先 docker rename 旧名 新名;③再重新启动你的容器。
处理流程
# 1. 找到冲突容器(停止的也算)
docker ps -a --filter 'name=^/myapp$'
# 2a. 直接删掉(确认无重要数据)
docker rm myapp
# 2b. 或改名保留
docker rename myapp myapp-backup
# 3. 重新创建
docker run -d --name myapp ...
改名不会停止旧容器,也不会释放其端口、卷或其他资源。运行中的容器先 docker stop 再 rm,或 docker rm -f 一步到位(会强制杀进程)。
删之前要确认的事
- 可写层里有数据吗:
docker diff myapp看改动;有的话先docker cp拷出或docker commit存镜像 - 检查挂载与删除选项:普通 rm 不删除命名卷或绑定目录,但匿名卷、--rm、-v 及其他清理命令有不同语义;commit 也不备份卷数据
脚本化启动的防冲突写法
# 方式一:一次性容器用 --rm,退出即自动删除
docker run --rm myimage ./job.sh
# 方式二:先检查占用者的归属、状态和数据,再决定 stop/rm 或 rename
docker inspect myapp
# 不要在部署脚本中无条件强删同名容器
# 方式三:不指定名字,让 Docker 自动生成
docker run -d myimage
为什么 CI 上特别容易撞
CI 每次跑同名容器,上次异常退出没清理就撞名。--rm 只清理本次成功创建的容器,不会删除已经占名的容器;并行任务仍需唯一名称。约定:CI 任务一律 --rm,或名字带构建号 --name myapp-$BUILD_ID。
常见问题(FAQ)
Q:docker ps 看不到但还报冲突?
A:docker ps 只显示运行中的,停止的容器也占名字——必须 docker ps -a。
Q:compose 报类似冲突?
A:手工起过同名容器占了 compose 要用的名字,应先确认该容器归属与数据,再选择改名或删除;compose 项目内容器名带项目前缀,一般不冲突。
Q:能不能强制覆盖占用?
A:没有"覆盖"概念,必须先释放名字(rm 或 rename)。