was bedeutet fd: // genau in dockerd -H fd: //

8

Docker-Daemon-Dokumentation schlägt die folgende Option hosts für die meisten vor Setups:

%Vor%

Ich denke, fd steht für den Dateideskriptor. Ich verstehe nicht, wie fd für Socket-Kommunikation verwendet wird.

Ich verstehe die folgenden Optionen:

%Vor%

Dies sind Unix-Domain-Sockets und TCP-Sockets. Ich weiß, wie man den Docker-Daemon mit diesen Sockets aufruft:

%Vor%

Aber wenn ich den Docker-Daemon mit -H fd:// gestartet habe, gibt der folgende Aufruf den Fehler:

%Vor%

Was bedeutet fd:// ? Gibt es irgendeinen Nutzen dafür?

    
Mert Nuhoglu 09.04.2017, 05:49
quelle

2 Antworten

12

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%
  1. Beenden Sie den Docker-Dienst: systemctl stop docker

    %Vor%

    Es wird kein Andockprozess ausgeführt und keine docker.sock

  2. 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.

  3. 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%     
shizhz 14.04.2017 09:30
quelle
1
___ tag123sockets ___ Ein Endpunkt eines bidirektionalen Interprozess-Kommunikationsflusses. Dies bezieht sich oft auf einen Prozessablauf über eine Netzwerkverbindung, ist jedoch keineswegs darauf beschränkt. Nicht zu verwechseln mit Websocket (einem Protokoll) oder anderen Abstraktionen (z. B. socket.io). ___ qstnhdr ___ was bedeutet fd: // genau in dockerd -H fd: // ___ tag123docker ___ Docker bietet eine High-Level-API, um Prozesse und Anwendungen mit einem gewissen Maß an Isolation und Wiederholbarkeit auf Servern zu containern. Docker unterstützt sowohl Linux- als auch Windows-Container. ___ qstntxt ___

Docker-Daemon-Dokumentation schlägt die folgende Option -H fd:// für die meisten vor Setups:

%Vor%

Ich denke, fd:// steht für den Dateideskriptor. Ich verstehe nicht, wie %code% für Socket-Kommunikation verwendet wird.

Ich verstehe die folgenden Optionen:

%Vor%

Dies sind Unix-Domain-Sockets und TCP-Sockets. Ich weiß, wie man den Docker-Daemon mit diesen Sockets aufruft:

%Vor%

Aber wenn ich den Docker-Daemon mit %code% gestartet habe, gibt der folgende Aufruf den Fehler:

%Vor%

Was bedeutet %code% ? Gibt es irgendeinen Nutzen dafür?

    
___ answer43408869 ___

Wenn Sie den Docker-Daemon starten, teilt %code% 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 %code% -System, das das traditionelle SysV-Init-System ersetzen soll. Eine seiner Haupteigenschaften ist schneller Init-Prozess.
  • %code% 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 %code% like %code% 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 %code% , 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 %code% unit-Datei, für Docker ist es %code% mit Inhalt:

    %Vor%

Mal sehen, wie das Ganze funktioniert. Ich habe die Dateien %code% und %code% unter %code% . Die %code% -Zeile für %code% ist:

%Vor%
  1. Beenden Sie den Docker-Dienst: %code%

    %Vor%

    Es wird kein Andockprozess ausgeführt und keine %code%

  2. Führe %code% :

    aus %Vor%

    Nach dem Start von %code% können wir sehen, dass immer noch kein Docker-Prozess läuft, aber der Socket %code% wurde erstellt und gehört zum Prozess %code% .

    (Off-Topic: Eigentlich ist der Socket jetzt bereit, Anfragen zu empfangen, auch wenn %code% noch nicht läuft. systemd startet %code% 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.

  3. Start %code%

    %Vor%

    Wie Sie sehen, läuft Docker jetzt. Gehen wir einen Schritt zurück und versuchen, %code% manuell vom Terminal aus auszuführen:

    %Vor%

    Jetzt siehst du den Unterschied; Wenn Sie %code% 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 %code% in %code% analysieren und eine %code% -Anforderung an den docker-Dämon stellen. Der Standardhost ist %code% . Zu den unterstützten Protokollen gehören %code% , %code% , %code% und %code% . Soweit ich aus dem Quellcode erkunde, ist die Transportkonfiguration für %code% die gleiche wie für %code% . Wenn du also tcp socket hörst, kannst du es einfach mit:

abspielen %Vor%

ist das gleiche wie:

%Vor%     
___ antwort43310994 ___

Die Syntax %code% wird verwendet, wenn docker innerhalb von systemd ausgeführt wird. Systemd selbst erstellt einen Socket in der docker.socket-Unit-Datei und hört ihn an, und dieser Socket ist mit dem Docker-Daemon mit der %code% -Syntax in der docker.service-Unit-Datei verbunden.

    
___
BMitch 09.04.2017 19:32
quelle

Tags und Links