1. 概述

在启动 Docker 容器时,我们有时会遇到名为 "容器中已使用名称" 的错误。

本文将探讨这个常见问题,并说明如何轻松解决它。首先,我们将展示如何引发此错误。然后,我们将解释其原因。最后,我们将展示如何修复它。

2. 引发错误的方法

2.1. 获取 Docker 镜像

让我们首先选择一个用于示例的 Docker 镜像。

我们将使用免费且公开可用的 Nginx 示例镜像。NGINX 是一个免费开源的 Web 服务器,被 Netflix、CloudFare 和 Airbnb 等许多公司使用。我们要使用的 Docker 示例镜像将提供一个带有主机名、IP 地址和端口等基本属性的网页。

2.2. 运行多个容器并引发错误

为了引发错误,我们需要运行两个将使用相同名称(baeldung_nginx)的实例。

值得考虑的是为什么我们需要为容器命名。名称可以是添加到正在运行容器列表意义的一种方便方式。更重要的是,名称可以作为 Docker 网络的引用

让我们启动第一个容器:

docker run --name baeldung_nginx -p 80:80 -d nginxdemos/hello:plain-text

我们以脱机模式运行容器,这意味着它将在后台运行。我们将容器的端口 80 发布到主机机器上的相同端口。最后,我们指定了自定义容器名称 - baeldung_nginx。

现在,如果我们在浏览器中打开 http://localhost,我们应该看到类似于以下内容:

Server address: 123.45.6.7:80
Server name: e378ad49d49d
Date: 08/Apr/2022:22:08:44 +0000
URI: /
Request ID: 7bda7e3234cb6d1e51900fccc89320d5

接下来,尝试运行第二个容器。我们将为第二个实例分配端口 81,因为第一个容器已经占用端口 80:

docker run --name baeldung_nginx -p 81:80 -d nginxdemos/hello:plain-text

不幸的是,这不起作用。我们收到了错误:

docker: Error response from daemon: Conflict. The container name "/baeldung_nginx" is already in use by container "76da8f6d3accc9b6d41c8a98fd492d4b8622804220ee628a438264b8cf4ae3d4". 
You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

3. 错误根本原因的解释

每个 Docker 容器都有一个唯一分配给它的名称。如果我们没有在 docker run 命令中使用可选的 name 参数,Docker 将为其分配一个随机名称。

在我们的案例中,我们希望为两个不同的容器分配相同的名称,baeldung_nginx。我们应该注意即使我们使用相同的 Docker 镜像,每个 docker run 命令都会创建一个新的容器。

由于第二个容器无法使用已被占用的名称,我们得到了错误。

4. 如何修复它

4.1. 重启容器

此解决方案适用于 Docker 容器名为 baeldung_nginx 已经在系统中存在,并且这是正确的状态的情况。在这种情况下,我们不想有两个具有相同名称的不同实例。相反,我们想重启现有的容器

为了重启现有容器,我们必须使用 docker start 而不是 docker run 命令。

docker run 创建与镜像相同的图像的多个副本。我们可以创建尽可能多的相同图像的克隆。另一方面,***docker start 启动之前已停止的容器

因此,我们可能并不是真正尝试启动新的容器,而是重启现有的一个,在这种情况下这是解决方案。然而,有时候我们想要用新镜像替换具有相同名称的现有容器。

4.2. 删除现有容器

当确信我们想要让新容器接管名称并且已停止了任何具有此名称的其他容器时,我们可以简单地删除具有该名称的先前容器:

docker rm baeldung_nginx

不幸的是,此命令并不总是起作用。例如,其他容器可能需要我们的容器正常工作。如果是这种情况,仍然想删除我们的容器,可以使用删除命令的 force 标志:

docker rm -f baeldung_nginx

一旦先前的容器被删除,就可以自由地使用选定的名称启动新的容器。

4.3. 使用不同的容器名称

如果我们想要运行同一镜像的两个实例怎么办?这个问题的解决方案很简单。我们只需使用两个不同的名称以及端口即可:

docker run --name baeldung_nginx_1 -p 80:80 -d nginxdemos/hello:plain-text
docker run --name baeldung_nginx_2 -p 81:80 -d nginxdemos/hello:plain-text

现在,让我们使用以下 Docker 命令列出正在运行的容器:

docker ps

我们应该看到类似于以下内容:

CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                NAMES
f341bb9fe165   nginxdemos/hello:plain-text   "/docker-entrypoint.…"   2 seconds ago    Up 2 seconds    0.0.0.0:81->80/tcp   baeldung_nginx_2
33883c2b31a7   nginxdemos/hello:plain-text   "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:80->80/tcp   baeldung_nginx_1

5. 总结

在本文中,我们学习了如何在 Docker 中修复 "容器中已使用名称" 的错误。

首先,我们看到了如何重现错误。然后,我们查看了错误的根本原因。

最后,我们看到了三种不同的方法来解决此问题。