Docker守护程序无法在CoreOS上启动时启动


23

我安装了CoreOS(835.9.0)的原始版本,启动时未启动docker守护进程。它仅在我通过SSH并执行例如时开始docker ps

如何使Docker守护程序在系统启动时自动启动?

当我说Docker守护程序时,我的意思ps -ef | grep docker是直到执行之后才显示任何进程docker ps

Answers:


40

sudo systemctl enable docker 做到了。


2
谢谢,我确实阅读了Docker文档,但找不到任何帮助-我确实找到了很多有关重启策略的信息,但当然,它们仅在docker守护程序启动后才适用。
克里斯

6
背景:这是因为docker在CoreOS上是套接字激活的,即它不会阻止启动链。当您在磁盘上有许多容器时,早期版本的docker启动速度很慢,这阻止了所有依赖docker的容器快速启动,从而导致了一些有趣的故障。
罗布2015年

4
天哪 这使我发疯。我在任何文档中所读到的内容都没有提到这一点。因此,我几乎不赞成CoreOS,而是支持AWS AMI。(默认情况下,AWS AMI自动启动Docker守护程序)。
Nostalg.io

2
鉴于CoreOS是专用的Docker OS,并且在启动期间未启动Docker,对于CoreOS而言,这种行为非常不正常???
typelogic

3
这是至关重要的信息。CoreOS文档未提及必须启用Docker(或与此有关的任何其他容器运行时)的任何内容。由于可以在裸露的CoreOS上启动Docker容器(并且由于使CoreOS可以运行容器),因此给我的印象是默认设置。当第一次由更新触发的重启未启动容器时,我才意识到自己的错误。
弗洛里安·冯·斯托施

6

现在有点老了,但是我已经开始使用cloud-init在所有新服务器上执行此操作。我有一个保存的cloud-init脚本,用于所有服务器。其中一部分包含:

#cloud-config
coreos:
  units:
    - name: "docker.service"
      command: "start"
      enable: true

这将启用docker服务,并在每次引导时都将其启动。


2

正如已经说明此评论罗布,搬运工被插座激活。这意味着除非被调用,否则守护进程不会启动。这里已有的答案有效,但是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文档以获取更多背景信息。


那是CoreOS的“最新”消息吗?Docker已经有重启策略多年,这种方法已经不再是必需的或不可取的了。从来都不是真正想要的,但这是Docker(非常旧的版本)缺乏对重新启动容器本身的支持的解决方法。我想很长一段时间停止使用CoreOS ...
Michael Hampton

当容器由于其他原因而崩溃时,也将应用@MichaelHampton重新启动策略,因此不能替代另一个。此外,重新启动策略不允许您在启动时更新容器等。我不知道哪个更好,但是我想这种方法可以给您更多的控制权。
Neograph734 '18

1
当您开始需要如此多的控制权时,通常还需要协调服务提供的许多其他功能:在简单的docker-compose端,一直到Kubernetes。
迈克尔·汉普顿

1

我正在使用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在另一个答案中尝试了这个技巧,虽然它一开始就起作用,但似乎引起了某种形式的雷电风云,其中码头工人显然在试图做很多事情而失败了。我怀疑这是其中的注释中提到的“阻塞启动链”行为。


在一个集群上有相同的用例运行gitlab-runner。这肯定唤醒了守护程序。您可以在点火文件coreos.com/os/docs/latest/using-systemd-drop-in-units.html
drgn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.