Docker 容器在启用 systemd 脚本的情况下重新启动后无法启动

chi*_*hip 6 reboot systemd docker docker-container

我有以下 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
Run Code Online (Sandbox Code Playgroud)

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

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

docker run --net=host --restart=always --name hub -t hub
Run Code Online (Sandbox Code Playgroud)

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

? hub.service - Hub docker container
   Loaded: loaded (/etc/systemd/system/hub.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
Run Code Online (Sandbox Code Playgroud)

Tob*_*s J 12

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

\n

事实证明,套接字在 systemd 中已启用,但服务本身已禁用,因此在针对它发出命令之前不会启动。

\n

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

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

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

\n

我能够通过运行来解决这个问题systemctl enable --now docker.service

\n
root@poke:~# systemctl enable --now docker.service\nSynchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.\nExecuting: /lib/systemd/systemd-sysv-install enable docker\n
Run Code Online (Sandbox Code Playgroud)\n

非常感谢这位 reddit 用户的回复给我带来的消息。

\n


kax*_*993 5

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

  • 这个答案告诉用户使用 Docker 的重启管理,但看起来 OP 想要使用 systemd。[Docker 文档](https://docs.docker.com/config/containers/start-containers-automatically/#use-a-process-manager) 说:“不要尝试将 Docker 重启策略与主机级别结合起来流程经理,因为这会产生冲突。” (2认同)