Docker - 名称已被容器使用

699

使用以下命令运行docker注册表总是会出现错误:

dev:tmp me$ docker run \
     -d --name registry-v1 \
     -e SETTINGS_FLAVOR=local \
     -e STORAGE_PATH=/registry \
     -e SEARCH_BACKEND=sqlalchemy \
     -e LOGLEVEL=DEBUG \
     -p 5000:5000 \
     registry:0.9.1
Error response from daemon: Conflict. The name "registry-v1" is already in use by container f9e5798a82e0. You have to delete (or rename) that container to be able to reuse that name.

我该如何防止这个错误?

22个回答

677

我也感到困惑。这里涉及到两个相关的命令:

docker run  # Run a command in a **new** container
docker start  # Start one or more stopped containers

166
在这种情况下,使用 docker ps -a 查看所有容器也很重要。 - Sławosz
39
是的,docker start -a container-name 是您可以使用的命令来启动使用 docker run 创建的容器。请注意 -a 标志,它是 --attach 的缩写。这样容器将在前台启动,就像使用 docker run 时一样(默认情况下以前台模式运行容器)。 - Krzysztof Wołowski
2
start 命令会使用相同的设置(端口、依赖项等)重新运行容器吗? - Suncatcher
2
@Suncatcher 是的。 - Henrik Sachse
这是另一个不幸命名的案例。我尝试执行一个容器,但出现错误,告诉我它没有运行。直觉上我运行容器来解决问题,但这却创建了一个容器?天哪。 - aaaaaa
这可能是有用的信息,但它并不是问题的正确答案。 - johannes_lalala

374

这意味着您以前已使用该参数启动了一个容器。

docker run --name registry-v1 ...

在重新创建具有相同名称的容器之前,您需要首先删除该容器。

docker rm registry-v1

如果该容器仍在运行中,您需要先停止它,然后才能使用此命令删除它:

docker stop registry-v1

或者为新容器选择一个不同的名称。

要获取现有容器及其名称的列表,只需调用:

docker ps -a

6
为什么它们被停下来了?或者如果它们已经被停下来了,那还有什么好处呢? - mskw
6
那么您可以稍后运行它们,而无需重新创建它们。 - Scott Stensland
3
您的意思是“这样您就可以运行这个镜像一次(即生成容器并在其中运行命令),然后随意启动容器多次”。但是为什么我们需要仅运行一次呢?甚至没有将“某物”对容器所做的可能更改持久化(请记住,除非提交,否则Docker容器状态更改会丢失)。 - Maksim Gumerov
23
如果您知道容器的名称,可以使用以下命令删除它:docker rm $(docker ps -aq --filter name=myContainerName) - Jujhar Singh
1
我有一个容器因为我在它运行时暂停了我的机器而停止了。我使用了 --rm 启动它,但在这种情况下,它被停止了(至少根据我的有限技能,似乎没有一种交互式地恢复它的方式)。 - tripleee
9
为什么不只使用 docker rm myContainerName 命令? - Rodrigo

220

以下是我所做的,它运行良好。

步骤1:(它会列出 Docker 容器及其名称)

docker ps -a

步骤2:

docker rm name_of_the_docker_container

9
这对我很有帮助,“docker ps”需要添加“-a”标志才能返回任何内容,这一点并不明显。 - MichaelChan
2
docker ps 命令只返回正在运行的容器,如果需要列出已停止的容器,则需要使用 -a 参数。 - Surendra Pratap

108

当您正在构建新的镜像时,通常希望每次都使用相同名称运行新的容器。我发现最简单的方法是使用--rm选项启动容器:

在构建新镜像时,通常需要每次以同一名称运行新容器。我发现最简便的方法是通过--rm选项启动容器:

--rm        Automatically remove the container when it exits
docker run --name my-micro-service --rm <image>

遗憾的是,在文档的示例中,几乎随机使用了它。

编辑:请查看Lepe在下面的评论。


镜像还是容器? - Pim van der Heijden
2
容器是从构建的镜像运行的。大致类似于类定义(镜像)和类实例(容器)。 - Martin
首先你说容器,然后是镜像。这不太清楚。而且,如果该镜像的容器已经在运行,使用 --rm 后它仍将继续运行。它不会重新启动。 - Pim van der Heijden
54
请注意:--rm 标志仅在使用 --rm 标志创建容器后才有效。这意味着,如果您创建容器时没有使用 --rm 标志,则必须手动删除它,然后才能利用 rm 标志的优势。 - lepe
遗憾的是,--rm--restart always 不兼容。 - Ralf Hundewadt
“--restart always” 与 “--name” 一起使用是否有效?从逻辑上讲,如果您始终重新启动容器,则在其退出时尝试删除它是没有意义的。 - Martin

94

只是为了解释其他人所说的(我花了一些时间才明白),简单来说,当您看到此错误时,这意味着您已经有了一个容器,您需要运行它。虽然直觉上 docker run 应该会运行它,但实际上并不是这样。该命令docker run 仅用于第一次启动容器。要运行现有容器,您需要使用docker start $container-name 命令。这就是向开发人员要求创建有意义/直观命令所得到的结果。


1
docker run = 创建 Docker 容器 + 启动 Docker 容器 - tintin

39

你有两个选项来解决这个问题...

  1. 使用以下命令删除之前使用该名称的容器:docker rm $(docker ps -aq --filter name=myContainerName)

    或者

  2. 将当前容器重命名为另一个名称,例如将 --name registry-v1 这一部分更改为类似于 --name myAnotherContainerName 的内容

您之所以会出现此错误,是因为该容器名称(即registry-v1)曾经被另一个容器使用过...即使该容器已退出并且当前没有在使用。


24

原因

存在一个同名的容器。

解决方法

要重用相同的容器名称,请通过以下方式删除现有容器:

docker rm <container name>

解释

容器可以在以下状态下存在,此时容器名称不能用于另一个容器:

  • created(已创建)
  • restarting(重新启动)
  • running(运行中)
  • paused(已暂停)
  • exited(已退出)
  • dead(已停止)

您可以使用以下方式查看处于 running(运行中)状态的容器:

docker ps

要显示所有状态的容器并查找容器名称是否被占用,请使用:

docker ps -a

如果想要重复使用容器,则 --rm 不是适当的开关。一个简单的 "docker start {容器名称}" 就足够了。 - Ken Ingram

20

以下是我在 Ubuntu 18 上解决此问题的方法:

  1. $ sudo docker ps -a
  2. 复制容器 ID

对于每个容器执行以下操作:

  1. $ sudo docker stop 容器ID
  2. $ sudo docker rm 容器ID

16

删除所有已退出的容器

docker rm $(docker ps -a -f status=exited -q)

13

问题: 当你尝试创建一个新的容器,而后台已经存在同名的容器时,就会出现冲突。

错误信息如下:

无法为服务X创建容器: 冲突。名称X已被容器abc123xyz使用。您必须删除或重命名该容器以便能够再次使用该名称。

解决方案是在docker-compose.yml中重新命名服务名称,或者删除正在运行的容器并重新构建它(这个解决方案适用于Unix/Linux/macOS系统):

  1. 获取所有正在运行的容器 sudo docker ps -a
  2. 获取特定的容器ID
  3. 停止和删除重复的容器/ 强制删除它
sudo docker stop <container_id>
sudo docker rm <container_id>

或者

sudo docker rm --force <container_id>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接