如果端口已绑定,为什么Docker运行--rm选项不起作用?

时间:2015-03-11 19:51:51

标签: docker

$ docker rm containername
containername

然后我尝试运行一个容器并为其指定一个名称containername

docker run -it --rm -p 8080:8080 --name containername b014d35f03a
FATA[0000] Error response from daemon: Cannot start container 2dc7aa98e8213625352e0ef8aadeaa1b6b4a0ab92c6c64c4dafe870b5bb7a49e: Bind for 0.0.0.0:8080 failed: port is already allocated 

为什么Docker现在说containername被采用了?自从我放入--rm后,它是否已经退出容器?有没有办法解决这个问题? (在退出时始终移除容器)

$ docker run -it --rm -p 8080:8080 --name containername b014d35f03a
FATA[0000] Error response from daemon: Conflict. The name "containername" is already in use by container 2dc7aa98e821. You have to delete (or rename) that container to be able to reuse that name.

1 个答案:

答案 0 :(得分:2)

关于另一个应用程序正在使用的端口的第一个错误意味着Docker 失败启动容器:

FATA[0000] Error response from daemon: Cannot start container
2dc7aa98e8213625352e0ef8aadeaa1b6b4a0ab92c6c64c4dafe870b5bb7a49e:
Bind for 0.0.0.0:8080 failed: port is already allocated 

因为它没有启动容器,所以客户端从未有机会开始监视它以便在退出时将其删除。我怀疑这种行为背后的想法是你可能想要有机会诊断出这种类型的失败,而不是直接删除容器。

你可以:

  • 打开问题和/或提交代码以更改行为,以便在任何情况下都会删除容器,或

  • 您可以使用明确的docker rm而不是依靠客户端为您执行此操作。例如,在启动容器之前,您始终可以显式docker rm containername。这是一种相当常见的模式,因为这意味着如果发生错误,容器仍然会悬空,以便您可以对其进行诊断。