


So beheben Sie den Fehler, wenn der Container den Host-Docker verwendet
In den letzten Jahren ist Docker als effiziente Containerisierungslösung immer beliebter geworden. Bei der Verwendung von Docker für die Containerbereitstellung treten jedoch auch einige Probleme auf. Wenn beispielsweise aus dem Container heraus auf den Hostcomputer zugegriffen wird, meldet der Container über den Host-Docker einen Fehler. In diesem Artikel wird die Ursache dieses Problems erläutert und wie es behoben werden kann.
Problembeschreibung
Bei der Verwendung von Docker zum Bereitstellen von Anwendungen ist es manchmal erforderlich, vom Container aus auf das Host-Dateisystem oder den Docker-Daemon des Hosts zuzugreifen. Normalerweise durch Hinzufügen von -v /:/host
und -v /var/run/docker.sock:/var/run/docker.sock
beim Starten der Containerparameter diese Funktion erreichen. Wenn der Container jedoch versucht, auf den Host-Docker-Daemon zuzugreifen, wird in einigen Fällen eine Fehlermeldung ähnlich der folgenden angezeigt: -v /:/host
和 -v /var/run/docker.sock:/var/run/docker.sock
参数来实现这一功能。但是在某些情况下,当容器尝试访问宿主机 Docker daemon 时,会出现类似以下错误的信息:
FATA[0000] Post http:///var/run/docker.sock/v1.18/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
这是因为容器中的进程在寻找 Docker daemon 的进程时,会先尝试在容器内部的 /var/run/docker.sock
目录下寻找,而该目录在容器内部是不存在的,于是就会导致该错误的出现。
解决方法
方法一:使用 --privileged
参数
在启动容器时,使用 --privileged
参数可以让容器拥有宿主机的所有权限,包括访问 Docker daemon。但是使用该方式会让容器获得更高的权限,安全风险较大,因此建议慎重使用。
docker run --privileged -v /:/host -v /var/run/docker.sock:/var/run/docker.sock <image>
方法二:使用环境变量
在启动容器时,可以使用环境变量来指定 Docker daemon 的地址,从而避免容器在 /var/run/docker.sock
上寻找 Docker daemon 的进程。
docker run -v /:/host -e DOCKER_HOST=unix:///host/var/run/docker.sock <image>
方法三:换用 TCP 连接方式
不使用 Unix Socket 而使用 TCP 连接的方式也可以解决这个问题。需要在启动 Docker daemon 时添加 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
参数,然后在容器中使用 DOCKER_HOST
环境变量来指定使用 TCP 连接 Docker daemon。
docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock docker run -e DOCKER_HOST=172.xx.xx.xx:2375 <image>
结论
容器使用宿主 Docker 报错的问题是由于容器中进程在寻找 Docker daemon 的进程时的路径问题导致的。本文介绍了三种解决方法:使用 --privileged
rrreee
/var/run/docker.sock
, aber dieses Verzeichnis existiert nicht im Container, daher wird dieser Fehler auftreten. 🎜🎜Lösung🎜Methode 1: Verwenden Sie den Parameter --privileged
🎜Verwenden Sie beim Starten des Containers den Parameter --privileged
, um den Container zuzulassen um einen Host zu haben Alle Berechtigungen des Hosts, einschließlich Zugriff auf den Docker-Daemon. Durch die Verwendung dieser Methode erhält der Container jedoch höhere Berechtigungen und birgt größere Sicherheitsrisiken. Daher wird empfohlen, sie mit Vorsicht zu verwenden. 🎜rrreeeMethode 2: Umgebungsvariablen verwenden
🎜Beim Starten des Containers können Sie Umgebungsvariablen verwenden, um die Adresse des Docker-Daemons anzugeben und so zu vermeiden, dass sich der Container in/var/run/docker befindet .sock
Finden Sie den Prozess des Docker-Daemons. 🎜rrreeeMethode 3: Wechseln Sie zur TCP-Verbindung
🎜Die Verwendung einer TCP-Verbindung anstelle von Unix Socket kann dieses Problem ebenfalls lösen. Sie müssen beim Starten des Docker-Daemons den Parameter-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
hinzufügen und dann verwenden DOCKER_HOST in der Umgebungsvariablen
des Containers, um die Verwendung von TCP für die Verbindung mit dem Docker-Daemon anzugeben. 🎜rrreee🎜Fazit🎜🎜Das Problem der gemeldeten Fehler, wenn der Container den Host Docker verwendet, wird durch das Pfadproblem verursacht, wenn der Prozess im Container nach dem Prozess des Docker-Daemons sucht. In diesem Artikel werden drei Lösungen beschrieben: die Verwendung des Parameters --privileged
, die Verwendung von Umgebungsvariablen und das Ändern der Verbindungsmethode des Docker-Daemons. Dieses Problem kann leicht gelöst werden, indem die geeignete Methode entsprechend der tatsächlichen Situation ausgewählt wird. 🎜Das obige ist der detaillierte Inhalt vonSo beheben Sie den Fehler, wenn der Container den Host-Docker verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Stock Market GPT
KI-gestützte Anlageforschung für intelligentere Entscheidungen

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



DockerisaplatformForpacking, Versand, AndrunningApplicationssinlightweight, IsolatedContainerthatsharethehostoskernel, im Gegensatz zuvirtualMachines

DockerforwindowsseSalinuxvmorwsl2ToruncontainersBecausewindowSlacksnatelinuxKernelfeature; 1) itautautomaticManateAlightweightLinuxvm (oruseswsl2) Withyper-VtohostthockerdaMand-Ankain-Anbieter; 2) ThedockercloiNdesktopwader und -Container;

Verwenden Sie den Befehl DockerLogs, um Docker -Containerprotokolle anzuzeigen, und kombinieren Sie die Optionen und den Containernamen oder die ID. Die spezifischen Operationen sind wie folgt: 1. Verwenden Sie zuerst Dockerps, um den Containernamen oder die ID für Container zu erhalten und dann DockerLogsmy-Container auszuführen, um das Protokoll anzuzeigen; 2. Verwenden Sie die Option -F, um die Protokollausgabe in Echtzeit wie DockerLogs-FMY-Container zu verfolgen. 3. Zeigen Sie die letzten 50 Zeilen von Protokollen durch - -tail50 an, die in Kombination mit -F verwendet werden können; 4. Fügen Sie die Option -t hinzu, um den Zeitstempel jeder Zeile von Protokollen anzuzeigen, um die Fehlerbehebung zeitbezogene Probleme zu erleichtern. 5. Verwenden Sie -Since10m, um die Protokolle in den letzten 10 Minuten anzuzeigen und S, M, H -Einheiten oder RFC33339 -Formatzeit zu unterstützen

Der Schlüssel zum Schreiben einer Dockerfile liegt darin, jeden Befehl und ihre Schicht -Caching -Mechanismus zu verstehen. 1. Verwenden Sie aus, um das Grundbild anzugeben und bevorzugen leichte und sichere Bilder wie Knoten: 18-Alpine; 2. Verwenden Sie WorkDir, um das Arbeitsverzeichnis im Container auf /App festzulegen. A. Kopieren Sie die Datei kopieren. Es wird empfohlen, Package.json Schritt für Schritt zu kopieren, um den Cache zu verwenden. 4.. Verwenden Sie Run, um Abhängigkeiten zu installieren und Befehle zu verschmelzen, um Ebenen zu reduzieren, z. 5. Verwenden Sie CMD, um den Standard -Startbefehl festzulegen

DockerInspect ist der Hauptbefehl, um Containerdetails anzuzeigen. 1. Verwenden Sie DockerInspect, um die vollständigen Informationen des Containers zu erhalten, einschließlich Status, Netzwerk, Mount, Umgebungsvariablen usw.; 2. Verwenden Sie den Parameter -f, um bestimmte Felder wie IP -Adresse, laufende Status, Spiegelname, Mount -Volumen und Umgebungsvariablen zu extrahieren. 3.. Verwenden Sie Dockerlogs und Dockertop, um Containerprotokolle und -prozesse anzuzeigen, um die Diagnose zu unterstützen. 4. Es wird häufig verwendet, um das Netzwerk zu beheben, Moderationen zu überprüfen, den Gesundheitszustand und automatisierte Skripte zu überprüfen. In Kombination mit Dockerps-A finden Sie alle Container. Dieser Befehl ist das Kernwerkzeug für eingehende Debugging und automatisierte Vorgänge.

Mit kleineren Grundbildern, mehrstufigen Konstruktionen und angemessenen Schichten sind die Schlüssel zur Reduzierung der Docker-Bildergröße. 1. Priorität wird leichten Basisbildern wie Alpin, Schlank oder Entfesselt vorgegeben, was das Volumen erheblich verringern kann. 2. Übernehmen Sie mehrstufige Konstruktionen, um die Konstruktionsabhängigkeit von der Laufzeit zu trennen und zu vermeiden, dass Quellcode, Abhängigkeitspakete und Bauwerkzeuge in das endgültige Bild einbezogen werden. 3.. Ausführen von Anweisungen zusammenführen und Cache und temporäre Dateien in derselben Ebene reinigen, z. 4. Konfigurieren.Dockeringore -Dateien,

Verwenden Sie Dockerun, um Befehle in einem neuen Container auszuführen, und verwenden Sie Dockexexc, um Befehle in einem ausgeführten Container auszuführen. Die spezifischen Methoden sind: 1. verwenden Dockerrun, um einen neuen Container zu starten und Befehle wie Dockerrun-RMubuntuls/TMP auszuführen; 2. Verwenden Sie DockeKerexec, um Befehle in einem laufenden Container auszuführen, wie z. B. Dockexexecmy-nginx-servicepsaux, und interaktive Operationen müssen -it hinzufügen, wie z. B. Dockexexc-itmy-container/bin/bash; 3. Überschreiben Sie die Standardbefehle beim Starten des Containers wie DockerNnginx: lastnginx-t

Bydefault, dockkerContainersrunasroot, der whoamioridcommands.2.torunacommandasrootinanewContainer verwendet, verwendet anCherrunwithofficialImAghaTheFaultToroot, orexplicitlySpecify-urottooverridanonynon-Rootussersetings
