我安装了 CoreOS (835.9.0),它在启动时不会启动 docker 守护进程。只有当我通过 SSH 登录并执行例如 时,它才会启动docker ps
。
如何让 docker 守护进程在系统启动时自动启动?
当我说docker守护进程时,我的意思是ps -ef | grep docker
在我执行完之后才显示任何进程docker ps
答案1
sudo systemctl enable docker
成功了。
答案2
这有点过时了,但我已经开始在所有新服务器上使用 cloud-init 来执行此操作。我已保存了一个用于所有服务器的 cloud-init 脚本。其中一部分包含:
#cloud-config
coreos:
units:
- name: "docker.service"
command: "start"
enable: true
这将启用 docker 服务并在第一次和每次启动时启动它。
答案3
正如已经解释的那样此评论经过抢,docker 是套接字激活的。这意味着守护进程只有在被调用时才会启动。这里现有的答案有效,但 CoreOS 建议采用不同的方法。
根据CoreOS 文档是为你自己的应用程序创建一个服务,而该服务又需要 Docker 服务:
/etc/systemd/system/myapp.service:
[Unit]
Description=MyApp
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 1; done"
[Install]
WantedBy=multi-user.target
并让该服务自动启动:
$ sudo systemctl enable /etc/systemd/system/myapp.service
$ sudo systemctl start hello.service
示例用例是在服务启动后将容器更新到最新版本,高级示例还在 etcd 中注册该服务。阅读CoreOS 文档了解更多背景信息。
答案4
我使用的是 Docker Swarm,因此没有专门的应用程序让 systemd 负责...我只需要在启动时启动 docker。这是我想出的解决方案。
放这个/etc/systemd/system/poke-docker.service
:
[Unit]
After=default.target
[Service]
Type=oneshot
ExecStart=/usr/bin/docker version
RemainAfterExit=yes
[Install]
WantedBy=default.target
然后只需systemctl enable poke-docker
将其设置为在每次启动时触发,在启动序列结束时即可。该docker version
命令与 docker 守护进程对话,触发套接字并启动 docker 服务本身。
我尝试了systemctl enable docker
另一个答案中的技巧,虽然一开始有效,但似乎造成了某种惊群效应,docker 显然试图做很多事情,但失败了。我怀疑这是评论中提到的“阻止启动链”行为。