重启后无法自动启动 Docker 容器问题解决方案

32次阅读
没有评论

问题描述

在托管自己的 Docker registry 时,遇到了一个问题:每次重启服务器后,registry 容器无法自动启动。他在启动 registry 容器时使用了以下命令:

docker run -d -p 5000:5000 --name registry -v /var/lib/registry/:/var/lib/registry -v /root/certs:/certs -v /root/auth/:/auth -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -e "REGISTRY_AUTH=htpasswd" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" --restart always registry:2.7.1

重启后尝试手动启动 registry 容器时,遇到了以下错误:

Error response from daemon: OCI runtime create failed: container with id exists: dfb0bef21bdfc8a89b59498befd37f83513e75527c0beb552e0400df2a2b7c7d: unknown Error: failed to start containers: registry

此外,用户在重启后可以正常启动其他新的容器。用户的 Docker 版本是 18.09.6。

解决方案

请注意以下操作可能会涉及版本差异,务必做好备份。

方案1

首先,我们需要确认 registry 容器是否真的已经停止。可以通过以下命令检查:

docker ps -a

如果 registry 容器已经运行,可以使用以下命令手动停止并启动它:

docker stop registry
docker start registry

此外,关于 --restart always 参数,它仅会在容器运行至少 10 秒并且 Docker 能够监控该服务时才会生效。更多有关 --restart 选项的详细信息,请参考 Docker 官方文档 restart policy detail

方案2

用户已经尝试编写了一个启动脚本,但是问题依然存在。我们注意到启动时 docker daemon 似乎没有准备好,导致容器没有自动启动。这可能与 Docker 版本、服务器启动时的服务顺序等因素有关。

为了解决这个问题,我们可以考虑在服务器启动时延迟启动 Docker 容器,等待 Docker daemon 完全启动。以下是一个示例的启动脚本,可以在容器A启动后等待一段时间再启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

总结

以上是解决 Docker 重启后无法自动启动容器的两种方案。方案1主要关注检查容器状态和启动策略,方案2则尝试通过脚本延迟启动以解决 Docker daemon 启动延迟的问题。根据具体情况,选择适合自己的方案来解决问题。如果问题仍然存在,建议查阅 Docker 官方文档,了解最新的解决方案和常见问题的处理方法。

正文完