Docker 容器在启用 systemd 脚本后重新启动后无法启动

Posted

技术标签:

【中文标题】Docker 容器在启用 systemd 脚本后重新启动后无法启动【英文标题】:Docker container doesn't start after reboot with enabling systemd script 【发布时间】:2018-10-04 13:27:35 【问题描述】:

我有以下 systemd 脚本:

[Unit]
Description=Hub docker container
After=docker.service

[Service]
User=root
ExecStart=/home/hub/hub.sh
ExecStop=/bin/docker stop hub
ExecStopPost=/bin/docker rm hub

[Install]
WantedBy=multi-user.target

运行命令:systemctl start/stop hub 工作正常。我还使用 systemctl enable hub 创建了符号链接。为什么我重新启动整个笔记本电脑后我的服务无法启动?我遵循了 docker 指南,以便 Docker 在重新启动时启动,但由于某种原因我的容器没有启动。我的脚本中是否缺少字段?

我正在使用我的 ExecStart,“/home/hub/hub.sh”脚本的命令是:

docker run --net=host --restart=always --name hub -t hub

重新启动后,当我键入 systemctl status hub 时,我得到以下信息:

● hub.service - Hub docker container
   Loaded: loaded (/etc/systemd/system/hub.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

【问题讨论】:

【参考方案1】:

在我的情况下,我已经将容器设置为 restart=always(顺便说一句,您可以使用 docker inspect -f " .HostConfig.RestartPolicy.Name " <container> 检查容器的重启策略和/或使用 docker update --restart=always <container> 更改它)但容器仍然没有启动,直到我运行类似docker ps的命令。

原来 socket 在 systemd 中已启用,但 service 本身已被禁用,因此在针对它发出命令之前不会启动。 p>

通过systemctl status docker.socketsystemctl status docker.service 检查验证了这一点:

root@poke:~# systemctl status docker.socket
● docker.socket - Docker Socket for the API
   Loaded: loaded (/lib/systemd/system/docker.socket; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-07-30 18:28:38 EDT; 18h ago
   Listen: /var/run/docker.sock (Stream)
    Tasks: 0 (limit: 4647)
   CGroup: /system.slice/docker.socket
   
root@poke:~# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-07-31 13:19:53 EDT; 5min ago
     Docs: https://docs.docker.com
 Main PID: 3094 (dockerd)
    Tasks: 20
   CGroup: /system.slice/docker.service
           ├─3094 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
           └─3426 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 6379 -container-ip 172.17.0.3 -container-

(请注意 docker.service 的“已禁用”,即使它当时正在运行。)

我可以通过运行 systemctl enable --now docker.service 来解决这个问题:

root@poke:~# systemctl enable --now docker.service
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker

非常感谢 this reddit user's reply 给我的提示。

【讨论】:

【参考方案2】:

为了在重启后启动容器,您需要将此属性:--restart=always 添加到您的容器启动脚本中。例如: docker run -d -p 80:5000 --restart=always image_name

【讨论】:

我添加了重启标志,但它仍然无法正常工作,这是我在“hub.sh”脚本中使用的 docker 命令:docker run --net=host --restart=always --name hub -t hub 没关系,它奏效了。原来我在将通缉犯更改为多用户后忘记启用该服务。非常感谢! 其实我更喜欢用--restart unless-stopped 这个答案告诉用户使用 Docker 的重启管理,但看起来 OP 想要使用 systemd。 Docker docs 说,“不要尝试将 Docker 重启策略与主机级进程管理器结合起来,因为这会产生冲突。”

以上是关于Docker 容器在启用 systemd 脚本后重新启动后无法启动的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ubuntu docker 容器上使用 systemd [关闭]

生成的 podman systemd 文件无法启用

Systemd在docker容器中使用

Docker 容器空间大小设置 - 十

在 Docker 容器内开发时启用 VS Code IntelliSense

如何在systemd中添加service