Kann mir jemand docker.sock erklären


130

Ich versuche, den tatsächlichen Grund für das Mounten docker.sockin einer docker-compose.ymlDatei zu verstehen . Ist es für die automatische Erkennung?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

Antworten:


130

docker.sockist der UNIX-Socket, den der Docker-Daemon abhört. Es ist der Haupteinstiegspunkt für die Docker-API. Es kann sich auch um einen TCP-Socket handeln, aus Sicherheitsgründen verwendet Docker jedoch standardmäßig den UNIX-Socket.

Der Docker-CLI-Client verwendet diesen Socket standardmäßig, um Docker-Befehle auszuführen. Sie können diese Einstellungen auch überschreiben.

Es kann verschiedene Gründe geben, warum Sie den Docker-Socket möglicherweise in einem Container montieren müssen. Als würde man neue Container aus einem anderen Container heraus starten. Oder für die automatische Erkennung und Protokollierung von Diensten. Dies erhöht die Angriffsfläche. Sie sollten also vorsichtig sein, wenn Sie den Docker-Socket in einen Container einbinden. In diesem Container werden vertrauenswürdige Codes ausgeführt. Andernfalls können Sie einfach Ihren Host gefährden, auf dem der Docker-Daemon ausgeführt wird, da Docker standardmäßig alle Container als Root startet.

Docker-Socket verfügt in den meisten Installationen über eine Docker-Gruppe, sodass Benutzer in dieser Gruppe Docker-Befehle für Docker-Socket ohne Root-Berechtigung ausführen können. Die tatsächlichen Docker-Container erhalten jedoch weiterhin Root-Berechtigung, da der Docker-Daemon effektiv als Root ausgeführt wird (für den Zugriff auf Namespace und Cgroups ist Root-Berechtigung erforderlich). .

Ich hoffe es beantwortet deine Frage.

Weitere Informationen: https://docs.docker.com/engine/reference/commandline/dockerd/#examples


1
Defekter Link. Wahrscheinlich ähnliche Informationen wie die erwarteten sind folgende: docs.docker.com/engine/admin
Borja Bolilla

7
Zusätzlich zu den Warnungen, die @boynux bereitgestellt hat, finden Sie weitere Informationen im Artikel Best Practices für Docker-Sicherheit . In diesem Fall/var/run/docker.sock
Arnold Schrijver

36

Ich weiß, dass es etwas spät ist, aber ich hoffe, dass meine Antwort so viele Einblicke gibt

Lassen Sie mich zunächst über Unix-Sockets sprechen

Der Begriff Sockets bezieht sich üblicherweise auf IP-Sockets. Dies sind diejenigen, die an einen Port (und eine Adresse) gebunden sind, an die wir TCP-Anforderungen senden und von denen wir Antworten erhalten.

Ein anderer Socket-Typ ist ein Unix-Socket. Diese Sockets werden für IPC (Interprocess Communication) verwendet. Sie werden auch als Unix Domain Sockets ( UDS ) bezeichnet. Unix-Sockets verwenden das lokale Dateisystem für die Kommunikation, während IP-Sockets das Netzwerk verwenden.

Der Docker-Daemon kann über drei verschiedene Socket-Typen auf Docker Engine-API-Anforderungen warten : unix, tcp, and fd.

Standardmäßig wird unter /var/run/docker.sock ein Unix-Domain-Socket (oder IPC-Socket) erstellt

Sehen wir uns einige Live-Beispiele an :

Docker Server verwendet diesen Socket, um die REST-API abzuhören, und die Clients verwenden den Socket, um API-Anforderungen an den Server zu senden.

curl kann über die --unix-socketFlagge mit einem Unix-Socket sprechen . Da die Docker Server-API als REST verfügbar gemacht wird, müssen Befehle über HTTP gesendet werden. Da dieser Server lokal ist (denken Sie daran, das Dateisystem), können wir auch einen beliebigen Hostnamen in der URL übergeben (oder uns an den lokalen Host halten, der auch gut funktioniert!). Der Server kümmert sich nicht um den Hostnamen, sondern nur um den Pfad.

curl --unix-socket /var/run/docker.sock http://localhost/images/json | jq

 [
  {
    "Containers": -1,
    "Created": 1525888860,
    "Id": "sha256:24a77bfbb9ee3aeef9e24766ad6e9fa57f85c67596f154e8916e4f314067e149",
    "Labels": null,
    "ParentId": "",
    "RepoDigests": [
      "postgres@sha256:b06cdddba62f1550a1c674270814e72eaa8734d95912019b4ddc288b650ad67d"
    ],
    "RepoTags": null,
    "SharedSize": -1,
    "Size": 39507096,
    "VirtualSize": 39507096
  }
]

Einige Befehle :

Mit docker.sock kann man viel machen

Schauen Sie sich diesen schönen Artikel an


6

Grundsätzlich wird der Host-Docker-Daemon dem Container ausgesetzt. Sie können also Docker-API / -Client von Ihrem Container aus aufrufen, um Images / Container zu starten / zu stoppen / zu erstellen, beispielsweise indem Sie diese Befehle direkt auf dem Host aufrufen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.