【问题标题】:Cannot stop or restart a docker container无法停止或重新启动 docker 容器
【发布时间】:2015-09-30 16:22:06
【问题描述】:

尝试停止或重新启动 docker 容器时,我收到以下错误消息:

$ docker restart 5ba0a86f36ea
Error response from daemon: Cannot restart container 5ba0a86f36ea: [2] Container does not exist: container destroyed
Error: failed to restart containers: [5ba0a86f36ea]

但是当我跑步时

$ docker logs -f 5ba0a86f36ea

我可以看到日志,所以显然容器确实存在。有什么想法吗?

编辑:

对不起,我忘了说这个:

当我运行docker ps -a 时,我看到容器已启动并正在运行。但是其中的应用程序出现故障,所以我想重新启动它,或者只是在线获取该应用程序的新版本。但是当我无法停止和移除容器时,我也无法启动并运行一个新的应用程序,它会监听同一个端口。

【问题讨论】:

  • 我猜你可以销毁一个容器,但仍然有关于它的日志,当它被销毁时。否则你的观察是没有意义的。
  • 您是想运行一个全新的容器,清除所有数据和更改,还是想从您使用的文件中取出重要文件?
  • 如果您的 docker 映像没有适当的进程处理,可能会发生这种情况。

标签: docker


【解决方案1】:

我忘记了我已将容器作为系统服务启动。
所以如果我停止或杀死容器,服务会将它带回来。

如果你使用的是systemctl,可以用systemctl | grep running列出所有正在运行的服务,并找到服务的名称。

然后使用 sudo systemctl disable <your_service_name> 阻止它。

【讨论】:

    【解决方案2】:

    有时这是由 docker 守护进程的问题引起的。 我通过重新启动 docker 服务解决了这个问题。 在 Linux 上:

    systemctl restart docker
    

    【讨论】:

      【解决方案3】:

      就我而言,docker rm $(docker ps -aq) 适合我。

      【讨论】:

      • 注意:使用这个命令要小心!它将删除所有 docker 容器(已停止!除非您将数据存储在运行此命令的卷中,否则可能会导致意外的数据丢失!此外,这并不能解决 PO 问题。问题是关于停止和重新启动容器。
      【解决方案4】:

      如果您在 Mac 上并通过终端尝试此操作:使用 killall Docker 退出 Docker。

      在 Applications 文件夹中或使用 open /Applications/Docker.app 重新启动它。

      随后您可以为相关容器运行docker rm <id>

      【讨论】:

        【解决方案5】:

        适用于 Mac 上安装了 Docker Desktop 的任何人。我只需单击托盘图标并说Restart Docker。一旦它重新启动就能够删除容器。

        【讨论】:

          【解决方案6】:

          我在我的机器中找不到boot2docker。所以,我想出了一些对我有用的东西。

          $ sudo systemctl restart docker.socket docker.service
          $ docker rm -f <container id>
          

          检查它是否对您也有帮助。

          【讨论】:

          • 我不得不使用强制选项docker rm -f &lt;container id&gt;,但它有效。谢谢。
          • 感谢@chaseisabelle 的反馈。有道理。我会将其合并到答案中。
          • 在 Windows 机器上关闭 Docker 桌面,然后从任务管理器中停止 Docker.Service。然后重新运行 Docker Desktop。
          【解决方案7】:

          就我而言,我无法删除使用游牧工作创建的容器, docker logs &lt;ContainerID&gt; 没有输出,一般来说,它看起来像冻结了。

          到目前为止,解决方案是:sudo service docker restart,有人可以提出更好的解决方案吗?

          【讨论】:

            【解决方案8】:

            如果您使用的是 Ubuntu,请确保 docker-compose 未安装为 snap。这将导致各种随机问题,包括上述问题。

            删除快照:

            sudo snap remove docker-compose
            

            并从 compose 存储库手动安装:

            Docker compose installation instruction

            【讨论】:

              【解决方案9】:

              使用“top”命令检查是否有僵尸进程。

              docker ps | grep <<container name>> 
              

              获取容器 ID。

              ps -ef | grep <<container id>>
              
              ps -ef|grep defunct | grep java
              

              并通过 Parent PID 杀死容器。

              【讨论】:

                【解决方案10】:

                我在 Windows 主机上遇到了同样的问题,这里没有其他选项对我有用。我最终只需要删除位于此处的物理容器文件夹:

                C:\ProgramData\Docker\containers\[container guid]
                

                为了安全起见,我首先停止了 docker 服务,当我重新启动它时,损坏的容器现在已经消失了,我可以创建新的容器了。我怀疑这同样适用于 linux 主机,但我不知道容器文件夹在该操作系统上的保存位置。

                【讨论】:

                  【解决方案11】:

                  享受

                  sudo aa-remove-unknown

                  这对我有用。

                  【讨论】:

                  • 是的,这已经成功移除了被感染的容器。
                  【解决方案12】:

                  所有码头工人: start | restart | stop | rm --force | kill 命令 如果容器被卡住,可能无法工作。您始终可以重新启动 docker 守护程序。但是,如果您有其他容器正在运行,那可能不是选项。你可以做的是:

                  ps aux | grep <<container id>> | awk '{print $1 $2}'
                  

                  输出包含:

                  <<user>><<process id>>
                  

                  然后像这样杀死与容器关联的进程:

                  sudo kill -9 <<process id from above command>>
                  

                  这将杀死容器,您可以使用正确的图像启动一个新容器。

                  【讨论】:

                  • 我的结果是kill: illegal process id: [USER][PROCESS_ID]。你知道有什么替代品吗?
                  • 我收到No such process
                  • 如果你有No such process,很有可能ps aux返回了你刚刚运行的命令(ps aux | grep
                  • 是的,警官,这就是杀死集装箱的人。 (谢谢!)
                  【解决方案13】:

                  值得知道:

                  如果您正在运行 ENTRYPOINT 脚本...该脚本将与 shebang 一起使用

                  #!/bin/bash -x
                  

                  但会阻止容器停止与

                  #!/bin/bash -xe
                  

                  【讨论】:

                  • 这是什么原因?我找不到任何参考
                  • 完全不知道,我只是在胡闹的时候发现的
                  【解决方案14】:

                  这看起来像 docker/docker/issues/12738,在 docker 1.6 或 1.7 中看到:

                  某些容器无法正常停止,并重新启动

                  当我们的用户主机从 1.5.0 升级到 1.6.0 时,我们经常在他们的主机中看到这个问题。
                  升级后,部分容器无法停止(给500 Server Error: Internal Server Error ("Cannot stop container xxxxx: [2] Container does not exist: container destroyed")或强制销毁(给500 Server Error: Internal Server Error ("Could not kill running container, cannot remove - [2] Container does not exist: container destroyed"))。 进程仍在主机上运行。
                  有时,它在重新启动 docker daemon 后可以工作。

                  有一些解决方法:

                  我已经为那个无法杀死的容器尝试了所有远程 API 调用,结果如下:

                  • jsonstatschangestoplogs 返回有效响应
                  • stoppausewaitkill 报告了 404(!)

                  在完成远程 API 后,我再次检查了 docker ps(容器仍然存在),但随后我重试了 docker kill,它成功了!容器被杀死了,我可以将其移除。

                  或者:

                  有效的是在我的主机上重新启动 boot2docker。然后docker rm -f

                  $ boot2docker stop
                  $ boot2docker start
                  $ docker rm -f 1f061139ba04
                  

                  【讨论】:

                  • 谢谢,是的,重启机器有帮助。不幸的是,它是一个服务器,不应该经常重启,希望他们能修复这个错误。因为我有 docker 1.7
                  • 我同意,这确实是一种解决方法,而不是完整的分辨率。我会监控那个错误报告。
                  • 我有一个不健康的容器,我无法停止或杀死:docker stop -f # 帮助,谢谢!
                  最近更新 更多