Ihre strace
Ausgabe legt stark nahe, dass der Docker-Client nicht mit dem Docker-Dämon kommunizieren kann, der standardmäßig einen Socket bei erstellt /var/run/docker.sock
.
Der Docker-Daemon soll ein Systemdienst sein (auf systemd, bei /lib/systemd/system/docker.service
der Socket-Konfiguration unter /lib/systemd/system/docker.socket
), kann jedoch unabhängig gestartet werden, /usr/bin/docker daemon
gefolgt von optionalen Optionen.
Sie sollten strace
den Dämon und nicht den Client verwenden .
Verwendung strace
auf dem Docker-Daemon
Rufen Sie die Prozess-ID Ihres Docker-Daemons ab. Jeder dieser Befehle würde die PID in einer aufgerufenen Variablen speichern
$DOCKER_PID
.Direkt aus der Steckdose:
DOCKER_PID=$(sudo lsof -Ua /var/run/docker.sock | awk '/^docker/ ' | head -1)
systemd:
DOCKER_PID=$(systemctl show -p MainPID docker.service | awk -F'=' '')
Andere:
DOCKER_PID=$(ps aux | grep 'docker daemon' | grep -v 'grep' | awk '' | head -1)
Verwenden Sie
strace
auf dem Docker-Daemon jetzt die PID:sudo strace -vvvfts1000 -p $DOCKER_PID
Führen Sie in einem separaten Terminal einen Befehl aus, der normalerweise im Docker-Client hängt.
docker version
Sehen Sie sich den
strace
Docker-Dämon an, um zu sehen, was am hörenden Ende des Sockets geschieht.
Interpretation der strace
Ausgabe
Das soll der Daemon beim Ausführen tun docker version
:
Lesen Sie, was der Kunde gesendet hat:
[pid 14291] 12:34:36 <... read resumed> "GET /v1.22/version HTTP/1.1\r\nHost: \r\nUser-Agent: Docker-Client/1.10.3 (linux)\r\n\r\n", 4096) = 81
Sammeln Sie Informationen zum System:
[pid 14291] 12:34:36 uname() = 0
Antworten Sie dem Kunden mit Informationen zum System:
[pid 14291] 12:34:36 write(3, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nServer: Docker/1.10.3 (linux)\r\nDate: Mon, 13 Jun 2016 17:34:36 GMT\r\nContent-Length: 194\r\n\r\n{\"Version\":\"1.10.3\",\"ApiVersion\":\"1.22\",\"GitCommit\":\"20f81dd\",\"GoVersion\":\"go1.6.1\",\"Os\":\"linux\",\"Arch\":\"amd64\",\"KernelVersion\":\"4.4.0-22-generic\",\"BuildTime\":\"Wed, 20 Apr 2016 14:19:16 -0700\"}\n", 334) = 334
Der Client (
docker version
) zeigt dann die Informationen an, die der Server zurückgegeben hat:Server: Version: 1.10.3 API version: 1.22 Go version: go1.6.1 Git commit: 20f81dd Built: Wed, 20 Apr 2016 14:19:16 -0700 OS/Arch: linux/amd64
In Ihrem Problem hat Ihr Docker-Dämon anscheinend nicht Schritt 3 ausgeführt, da der Client sonst die Antwort gesehen hätte, der Client aber nichts erhalten hat.
Sie sollten diese Informationen verwenden können, um herauszufinden, warum der Docker-Dämon nicht auf Anforderungen des Clients antwortet.
Mögliche Ursachen
Die von Ihnen bereitgestellten Informationen reichen nicht aus, um die Ursache für das Unvermögen Ihres Docker-Clients zu ermitteln, eine Antwort vom Docker-Dämon zu erhalten, aber hier sind einige Tipps:
- Läuft der Docker-Daemon?
- Was passiert, wenn Sie den Docker-Dämon im Vordergrund starten ?:
sudo docker daemon
- Hört der Docker-Daemon auf den Socket
/var/run/docker.sock
?sudo lsof -p $DOCKER_PID
sollte/var/run/docker.sock type=STREAM
irgendwo " " angezeigt werden. - Gibt es Sicherheitsrichtlinien, die im Client oder Dämon etwas blockieren könnten? Unter Linux können SELinux und AppArmor Verwirrung stiften, da für sie festgelegte Richtlinien den Zugriff verweigern.
- In dem
strace
von dem Dämon, wenn Sie nicht über eine HTTP - GET - Anforderung von dem Client erhalten, bedeutet dies, dass der Server nicht etwas aus der Fassung erhalten hat. - Wenn Sie dies
docker version
imstrace
Daemon getan haben und feststellen, dass keinuname()
Anruf erfolgt ist, hat der Daemon nicht einmal versucht, Informationen über das System abzurufen. - Wenn Sie den
write()
Aufruf imstrace
Daemon sehen, bedeutet dies, dass der Daemon geantwortet hat, der Client ihn jedoch nicht gesehen hat. - Möglicherweise ist dies ein bekanntes Problem in der von Ihnen verwendeten älteren Docker-Version. Versuchen Sie ein Upgrade.