Wenn Sie den Docker-Daemon starten, teilt -H fd://
Docker mit, dass der Dienst von Systemd gestartet wird und Socket-Aktivierung verwendet. systemd erstellt dann den Ziel-Socket und übergibt ihn an den zu verwendenden Docker-Daemon. Dies wird in Einführung in Systemd und in Einführung in die Socket-Aktivierung . Die Blogs sind ziemlich lang, aber wirklich lesenswert. Hier eine kurze Zusammenfassung der wichtigsten Punkte zum Verständnis dieser Frage:
- Systemd ist ein neues
init
-System, das das traditionelle SysV-Init-System ersetzen soll. Eine seiner Haupteigenschaften ist schneller Init-Prozess.
-
Socket activation
ist eine der Technologien, die in Systemd verwendet werden, um die Service-Initialisierung zu beschleunigen
- Um Anfragen zu empfangen, benötigt der Dienst einen Socket zum Anhören. Nehmen Sie Docker als Beispiel, es braucht ein
unix domain socket
like /var/run/docker.sock
oder ein TCP-Socket. Natürlich benötigen diese Sockets etwas, um sie zu erstellen und meistens ist es der Dienst selbst zur Startzeit.
- Mit Socket-Aktivierung erstellt SystemD diese Sockets und hört sie für Dienste an und übergibt diese Sockets an Dienste mit
exec
, wenn der Dienst gestartet wird. Ein Vorteil besteht darin, dass Clientanforderungen nach dem erfolgreichen Erstellen des Sockets in den Socketpuffer eingereiht werden können, noch bevor der zugehörige Dienst gestartet wird.
-
Die Socket-Information für einen bestimmten Dienst, der von Systemd verwendet wird, ist in socket
unit-Datei, für Docker ist es [docker.socket][3]
mit Inhalt:
%Vor%
Mal sehen, wie das Ganze funktioniert. Ich habe die Dateien docker.socket
und docker.service
unter /etc/systemd/system
. Die ExecStart
-Zeile für docker.service
ist:
%Vor%
-
Beenden Sie den Docker-Dienst: systemctl stop docker
%Vor%
Es wird kein Andockprozess ausgeführt und keine docker.sock
-
Führe systemctl start docker.socket
:
aus
%Vor%
Nach dem Start von docker.socket
können wir sehen, dass immer noch kein Docker-Prozess läuft, aber der Socket /var/run/docker.sock
wurde erstellt und gehört zum Prozess systemd
.
(Off-Topic: Eigentlich ist der Socket jetzt bereit, Anfragen zu empfangen, auch wenn docker
noch nicht läuft. systemd startet docker.service
in dem Moment, in dem die erste Anfrage kommt und übergibt die bereits erstellten Sockets an Docker. Dies ist das sogenannte On-Demand-Auto-Laichen.
-
Start docker.service
%Vor%
Wie Sie sehen, läuft Docker jetzt. Gehen wir einen Schritt zurück und versuchen, /usr/bin/dockerd -H fd://
manuell vom Terminal aus auszuführen:
%Vor%
Jetzt siehst du den Unterschied; Wenn Sie -H fd://
verwenden, erwartet docker, dass der Socket an seinen übergeordneten Prozess übergeben wird, anstatt ihn selbst zu erstellen. Wenn es von Systemd gestartet wird, führt Systemd die Aufgabe aus, aber wenn Sie es manuell am Terminal starten, führen Sie den Job nicht aus, sodass der Docker-Daemon-Prozess fehlschlägt und abgebrochen wird. Dies ist der Code, der angibt, wie der Andockprozess fd: // beim Start des Andockdämons beginnt , können Sie sehen, wenn Sie interessiert sind.
Auf der anderen Seite wird docker cli für den docker-Client das Protokoll / addr von host
in -H
analysieren und eine http
-Anforderung an den docker-Dämon stellen. Der Standardhost ist unix:///var/run/docker.sock
. Zu den unterstützten Protokollen gehören tcp
, unix
, npipe
und fd
. Soweit ich aus dem Quellcode erkunde, ist die Transportkonfiguration für fd
die gleiche wie für tcp
. Wenn du also tcp socket hörst, kannst du es einfach mit:
abspielen
%Vor%
ist das gleiche wie:
%Vor%