我经常遇到一些我们的docker容器应用程序的问题,简单的解决方法是重启docker容器。不幸的是,这是一个手动过程,我们已经破坏了功能,直到我们发现哪个容器有问题并且需要重新启动。这让我想知道在某些情况下是否有一种很好的自动重启docker容器的技术?
现在我正在考虑--autorestart
标志的组合,并强制应用程序在遇到已知问题时关闭。但是,我不确定这是否是最佳方法。
答案 0 :(得分:2)
如果您的应用程序能够检测到问题,您可以轻松地让容器重新启动。两个重要的事情是--restart
标志,并且当应用程序检测到问题时应用程序存在。
在后台启动容器(-d
)并设置restart policy:
docker run --restart unless-stopped -d [IMAGE] [COMMAND]
使用重新启动策略,您可以控制命令存在时Docker执行的操作。使用--restart unless-stopped
告诉Docker始终重新启动命令,无论命令的退出代码是什么。这样,您可以让应用程序检查其运行状况,并在必要时使用exit(1)
或类似的关闭。当发生这种情况时,Docker将遵循其重启策略并启动一个新容器。
虽然Docker并不真正关心返回代码,但我会确保应用程序存在状态代码而不是0
来表示问题。如果您确实想要分析日志或从脚本中使用容器,这可能会有用。
编辑:
我最初在答案中使用了--restart always
,但经过一些考虑后,我认为在这里使用--restart unless-stopped
可能会更好。它的行为更容易预测,因为docker stop
确实会停止服务。使用--restart always
时,docker stop
会停止容器,但会再次启动新容器,这不一定是您想要或期望发生的容器。
答案 1 :(得分:2)
除了--restart=always
和--restart=unless-stopped
之外,我们还有--restart=on-failure[:max-retry]
(如果容器返回非零退出代码,则Docker尝试重新启动容器。您可以选择指定最大数量Docker尝试重新启动容器的次数。
我们还可以使用Docker HEALTHCHECK 指令: 它告诉Docker如何测试容器以检查其是否仍在工作。这样可以检测到诸如Web服务器陷入无限循环并且无法处理新连接的情况,即使服务器进程仍在运行。我们还可以使用Healthcheck重新启动容器。 [https://docs.docker.com/engine/reference/builder/#healthcheck][1]
以下是一些我用来重新启动容器并修复的示例:
docker run -d \
--name autoheal \
--health-cmd='stat /etc/nginx/nginx.conf \
--health-interval=2s \
--restart=always \
-e AUTOHEAL_CONTAINER_LABEL=all \
-e DOCKER_SOCK=/var/run/docker.sock \
-e CURL_TIMEOUT=15 \
-v /var/run/docker.sock:/var/run/docker.sock \
willfarrell/autoheal
docker run -d \
--name autoheal \
--restart=always \
-e autoheal=true \
-e AUTOHEAL_DEFAULT_STOP_TIMEOUT=10 \
-e AUTOHEAL_INTERVAL=5 \
-e AUTOHEAL_START_PERIOD=0 \
-p 8080:8080 testing:latest
docker run -d --health-cmd='curl -sS http://localhost:80 || exit 1' \
--health-timeout=10s \
--health-retries=3 \
--health-interval=5s \
-p 8080:9080 testing:latest
答案 2 :(得分:1)
您可以使用next命令重启容器:
docker restart $container