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

9

我有如下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)
2个回答

11

在我的情况下,容器已经设置了restart=always(顺便说一下,您可以使用docker inspect -f "{{ .HostConfig.RestartPolicy.Name }}" <container>来检查容器的重启策略,或使用docker update --restart=always <container>进行更改),但是容器仍然没有启动,直到我运行了docker ps这样的命令。

结果发现,在systemd中启用了socket,但服务本身被禁用,因此在针对其发出命令之前不会启动。

通过使用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

感谢这位Reddit用户的回复,让我得以发现问题。


5

为了在重启后启动容器,您需要在容器启动脚本中添加此属性:--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 - chip
没事了,它起作用了。原来是我在将 wantedby 更改为 multi-user 后忘记启用服务了。非常感谢! - chip
1
实际上,我更喜欢使用 --restart unless-stopped - user6455909
2
这个答案告诉用户使用Docker的重启管理,但看起来OP想要使用systemd。Docker文档说:“不要尝试将Docker重启策略与主机级进程管理器结合使用,因为这会创建冲突。” - Richard Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接