Docker-Daemon startet nicht beim Booten unter CoreOS

23

Ich habe eine Vanille-Installation von CoreOS (835.9.0) und der Docker-Daemon wird beim Start nicht gestartet. Es fängt erst an wenn ich in SSH bin und mache zB docker ps.

Wie kann ich den Docker-Daemon beim Systemstart automatisch starten lassen?

Wenn ich den Docker-Daemon sage, meine ich, ps -ef | grep dockerzeigt keine Prozesse, bis ich es tuedocker ps

Chris
quelle

Antworten:

40

sudo systemctl enable docker hat den Trick gemacht.

Chris
quelle
2
Vielen Dank, und ich habe die Docker-Dokumentation gelesen und konnte nichts finden, was helfen könnte. Ich habe viel über Neustart-Richtlinien herausgefunden, aber diese gelten natürlich nur, wenn der Docker-Dämon gestartet wird.
Chris
6
Hintergrund: Der Grund dafür ist, dass Docker unter CoreOS Socket-aktiviert ist, dh die Boot-Kette nicht blockiert. Frühe Docker-Versionen ließen sich nur langsam starten, wenn sich viele Container auf der Festplatte befanden, wodurch alles, was vom Docker abhing, nicht schnell gestartet werden konnte, was einige interessante Fehler verursachte.
Rob
4
Güte. Das hat mich verrückt gemacht. Nichts, was ich in einem der Dokumente gelesen habe, erwähnte dies. Ich hätte CoreOS deswegen fast zugunsten von AWS AMI abgeschworen. (AWS AMI startet den Docker-Daemon standardmäßig automatisch.)
Nostalg.io
2
Sehr ungewöhnlich für CoreOS, da CoreOS ein dediziertes Docker-Betriebssystem ist und Docker beim Booten nicht startet.
Typelogic
3
Dies ist eine äußerst wichtige Information. In den CoreOS-Dokumenten wird nicht erwähnt, dass Docker (oder eine andere Container-Laufzeit) aktiviert werden muss. Da es möglich ist, Docker-Container auf nacktem CoreOS zu starten (und CoreOS Container ausführen soll), hatte ich den Eindruck, dass dies der Standard war. Ich habe meinen Fehler erst erkannt, als der erste durch ein Update ausgelöste Neustart meine Container nicht startete.
Florian von Stosch
6

Das ist jetzt ein bisschen alt, aber ich habe damit begonnen, Cloud-Init zu verwenden, um dies auf allen neuen Servern zu tun. Ich habe ein gespeichertes Cloud-Init-Skript, das ich für alle meine Server verwende. Ein Teil davon enthält:

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

Dadurch wird der Docker-Dienst aktiviert und bei jedem Start zuerst gestartet.

captncraig
quelle
2

Wie bereits in diesem Kommentar von Rob erläutert , ist der Docker Socket-aktiviert. Das bedeutet, dass der Deamon erst startet, wenn er aufgerufen wird. Die vorhandenen Antworten hier funktionieren, aber CoreOS empfiehlt einen anderen Ansatz.

Der empfohlene Weg, dies zu tun, besteht laut CoreOS-Dokumentation darin, einen Dienst für Ihre eigene App zu erstellen, für den wiederum der Docker-Dienst erforderlich ist:

/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

Und lassen Sie diesen Dienst stattdessen automatisch starten:

$ sudo systemctl enable /etc/systemd/system/myapp.service
$ sudo systemctl start hello.service

Der Beispielanwendungsfall besteht darin, den Container nach dem Start des Dienstes auf die neueste Version zu aktualisieren. Im erweiterten Beispiel wird der Dienst auch in etcd registriert. Weitere Hintergrundinformationen finden Sie in der CoreOS-Dokumentation .

Neograph734
quelle
Das ist das "Neueste" von CoreOS? Docker verfügt seit Jahren über Neustartrichtlinien, und dieser Ansatz ist nicht mehr erforderlich oder wünschenswert. Es war nie wirklich wünschenswert, aber es war eine Problemumgehung für (sehr alte Versionen von) Dockers mangelnde Unterstützung für den Neustart von Containern. Ich denke, es ist lange her, CoreOS nicht mehr zu verwenden ...
Michael Hampton
@MichaelHampton Neustartrichtlinien gelten auch, wenn der Container aus einem anderen Grund abstürzt, sodass eine Richtlinie keinen Ersatz für eine andere darstellt. Außerdem erlauben Neustart-Richtlinien nicht, Container beim Booten zu aktualisieren usw. Ich habe keine Ahnung, was besser ist, aber ich nehme an, diese Methode gibt Ihnen ein wenig mehr Kontrolle.
Neograph734
1
Wenn Sie anfangen, so viel Kontrolle zu benötigen, benötigen Sie im Allgemeinen auch viele andere Bits, die von Orchestrierungsdiensten bereitgestellt werden: am einfachen Ende Docker-Compose bis hin zu Kubernetes.
Michael Hampton
1

Ich verwende Docker Swarm, daher habe ich keine spezielle App, für die systemd verantwortlich ist. Ich brauche nur Docker, um beim Booten zu starten. Dies ist die Lösung, die ich ausgearbeitet habe.

Setzen Sie dies /etc/systemd/system/poke-docker.service:

[Unit]
After=default.target

[Service]
Type=oneshot
ExecStart=/usr/bin/docker version
RemainAfterExit=yes

[Install]
WantedBy=default.target

Und dann systemctl enable poke-docker, um es so einzurichten, dass es bei jedem Systemstart gegen Ende der Startsequenz ausgelöst wird. Der docker versionBefehl kommuniziert mit dem Docker-Dämon, löst den Socket aus und startet den Docker-Dienst selbst.

Ich habe den systemctl enable dockerTrick in der anderen Antwort ausprobiert , und obwohl es auf den ersten Blick funktionierte, hat es anscheinend eine donnernde Herdensituation verursacht, in der Docker anscheinend versucht hat, eine ganze Menge zu tun und kläglich versagt hat. Ich vermute, dass dies das in den Kommentaren erwähnte Verhalten "Blockieren der Boot-Kette" ist.

Colin Dunklau
quelle
Hatte den gleichen Anwendungsfall wie Gitlab-Runner auf einem Schwarm. Dadurch wird der Dämon definitiv aufgeweckt. Sie können das systemd-Drop-In in Ihrer Zündungsdatei coreos.com/os/docs/latest/using-systemd-drop-in-units.html
drgn