一旦我在 Ubuntu 机器上重新启动了 docker 服务,service docker restart
它就会启动一些我没想到会启动的容器。
这是为什么?哪个配置文件/存储/任何其他东西都保存着有关应启动哪些图像的信息?
使用 列出图像时,我有很多图像(约 50 张)docker images
。但启动 时只有 8 张图像启动dockerd
。为什么?我该如何更改?
谢谢。
答案1
对于单个容器,您可以应用重启策略。这是在docker run --restart=...
启动容器时设置的,或者restart: ...
在 compose yml 文件中设置。您可以使用以下命令更改现有容器中的重启策略:
$ docker update --restart=... ${container_name_or_id}
要列出所有容器及其重启策略,您可以从 bash 运行以下命令:
$ docker container ls -q | \
xargs docker container inspect --format \
'{{ .Name }}: {{.HostConfig.RestartPolicy.Name}}'
这重启策略您可以使用的是:
不 容器退出时不自动重启。这是默认设置。
失败时[:最大重试次数] 仅当容器以非零退出状态退出时才重新启动。(可选)限制 Docker 守护程序尝试重新启动的次数。
总是 无论退出状态如何,始终重新启动容器。当您指定 always 时,Docker 守护程序将无限期地尝试重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。
除非停止 无论退出状态如何,始终重新启动容器,但如果容器之前已处于停止状态,则不要在守护进程启动时启动它。
重启策略always
会导致容器在 Docker 守护程序重启后意外重启,就像您看到的那样,即使您有意停止了容器。出于这个原因,我通常使用unless-stopped
重启策略创建独立容器。
如果您使用 docker swarm 模式,那么只要目标状态与当前状态不匹配,服务就会自动启动新容器。对于笔记本电脑中常见的单节点 swarm 集群,这意味着当您重新启动 docker 时容器将重新启动,但如果您只是停止或删除正在运行的容器,容器也会重新启动。
永久停止并删除服务:
$ docker service ls # to show the running services
$ docker service rm ${service_id_or_name}
如果服务配置了复制模式,而您只是想暂时停止它而不删除该服务,则可以将目标副本更新为 0:
$ docker service update --replicas=0 ${service_id_or_name}
服务可以作为堆栈的一部分进行部署。要删除整个堆栈:
$ docker stack ls # to show the defined stacks
$ docker stack rm ${stack_id_or_name}
答案2
这意味着您的某些容器将 RestartPolicy 设置为始终。这意味着容器必须始终处于启动状态。请检查这些有问题的容器,特别是检查 RestartPolicy 的值。
$ docker inspect container-name
这通常发生在创建容器时带有标志--restart
always
要禁用容器自动启动,请使用以下命令:
$ docker update --restart=no container-name
解决此问题的另一种方法是在启动容器时将 RestartPolicy 设置为unless-stopped。您可以阅读完整文档docker 更新
答案3
查看 docker 重启策略,例如--restart always
。我猜你的一些容器正在使用它。检查你的 docker 服务启动脚本。你可以使用docker ps -a --no-trunc
查看完整列表。
答案4
图像不会自动启动,但容器会。
在service docker restart
容器上停止或者开始带有--restart always
标志的将在重启时自动重新启动。请通过 检查这些docker ps -a
。
如果您不想启动某个容器(即使是带有--restart always
标志的容器),您只需要将其删除,docker rm container
或者docker-compose down
。