Docker Pull: TLS-Handshake-Timeout

13

Ich bekomme dies konsequent (Ubuntu 16.04 LTS):

$ docker pull nginx
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

Allerdings Curl TLS funktioniert gut (abgesehen von dem Auth-Fehler):

$ curl https://registry-1.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}

Und sogar ein kleines Golang-Programm (um Docker nachzuahmen) funktioniert einwandfrei:

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    resp, err := http.Get("https://registry-1.docker.io/v2/")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println("Got: ", string(body))
}

Der PCAP für die TLS-Zeitüberschreitungsanforderung des Dockers:

reading from file docker-timeout.pcap, link-type LINUX_SLL (Linux cooked)
00:38:54.782452 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [S], seq 26945613, win 29200, options [mss 1460,sackOK,TS val 1609360 ecr 0,nop,wscale 7], length 0
00:38:54.878630 IP registry-1.docker.io.https > my-ubuntu.52036: Flags [S.], seq 2700732154, ack 26945614, win 26847, options [mss 1460,sackOK,TS val 947941366 ecr 1609360,nop,wscale 8], length 0
00:38:54.878691 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [.], ack 1, win 229, options [nop,nop,TS val 1609384 ecr 947941366], length 0
00:38:54.878892 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609384 ecr 947941366], length 155
00:38:55.175931 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609459 ecr 947941366], length 155
00:38:55.475954 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609534 ecr 947941366], length 155
00:38:56.076327 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609684 ecr 947941366], length 155
00:38:57.280103 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609985 ecr 947941366], length 155
00:38:59.684095 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1610586 ecr 947941366], length 155
00:39:04.492102 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1611788 ecr 947941366], length 155
00:39:04.879468 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [F.], seq 156, ack 1, win 229, options [nop,nop,TS val 1611884 ecr 947941366], length 0
00:39:04.976015 IP registry-1.docker.io.https > my-ubuntu.52036: Flags [.], ack 1, win 105, options [nop,nop,TS val 947943890 ecr 1609384,nop,nop,sack 1 {156:157}], length 0
00:39:04.976073 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1611909 ecr 947943890], length 155
00:39:05.275922 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1611984 ecr 947943890], length 155
00:39:05.876104 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1612134 ecr 947943890], length 155

Was könnte möglicherweise schief gehen?

Willem
quelle
1
Ich habe mein dsl modem getauscht und das problem war weg ... ich vermute es war ein mtu problem.
Willem

Antworten:

14

net/http: TLS handshake timeoutbedeutet, dass Sie eine langsame Internetverbindung haben. Der Standardwert für das Verbindungszeitlimit ist für Ihre Umgebung zu niedrig. Leider hat Docker keine Einstellungen, mit denen Sie das Zeitlimit für die Verbindung ändern können. Sie können versuchen, Ihren eigenen Registrierungscache an einer anderen Stelle zu erstellen und Bilder daraus zu ziehen.

Azamat Hackimov
quelle
1
Gut speedtest.netund fast.comzeige meine Internetgeschwindigkeit ist 90 Mbit / s. Ist das langsam Ich ziehe python:2.7-slimBild. Ich kann hello-worldvom Hub ziehen, aber nicht vom Python. Es gibt mir den gleichen TLS handshake timeoutFehler.
Nikhil Chilwant
3
Bevor Leute anfangen, etwas Dramatisches zu tun, möchte ich bemerken: Ein Tippfehler im Bildnamen erzeugt ebenfalls den gleichen Fehler. Sehr anschaulich.
Barafu Albino
1
Ein TLS-Handshake-Timeout bedeutet meist nicht, dass die Internetverbindung zu langsam ist. Diese Meldung wird auch angezeigt, wenn der TLS-Handshake aus verschiedenen Gründen angehalten wird. Zum Beispiel, wenn eine Seite nicht mit einer bestimmten TLS-Version oder wegen eines Zertifikatproblems sprechen möchte.
Der Bndr
4

In meinem Fall war mein Server hinter dem Nat und Proxy und so eingestellt, dass er Proxy automatisch erkennt, was ich auf dem aktuellen Terminal getan habe. Ich habe Proxy-Einstellungen exportiert

root@k8master:~/runner# export http_proxy="http://192.168.10.208:3128"
root@k8master:~/runner# docker pull gitlab/gitlab-runner:latest
latest: Pulling from gitlab/gitlab-runner
7b722c1070cd: Pull complete 
5fbf74db61f1: Pull complete 
ed41cb72e5c9: Pull complete 
7ea47a67709e: Pull complete 
ae336ceeca88: Pull complete 
f9f79780e6cf: Pull complete 
67e622273f37: Pull complete 
bc84c40af701: Pull complete 
69e36092e9de: Pull complete 
Digest: sha256:b1f5387942aaaf8c220f6613a1e96ba2cbcb6c58a5e47ca0df8ae3216720a15e
Status: Downloaded newer image for gitlab/gitlab-runner:latest
Mansur Ali
quelle
2

Wenn Sie eine private Registrierung verwenden, müssen Sie das unter /etc/docker/certs.d/ das Zertifikat platzieren Registry /ca.crt

registryname ändert sich entsprechend

Bitte ändern Sie auch Ihre MTU- Größe auf 1300. Dies war auch eine Sache, die ich getan habe, um den Fehler zu beheben. Ich glaube, Sie haben es bereits getan. Befehl zum MTU-Wechsel

ip link set dev eth0 mtu 1300

Die MTU-Größe muss überprüft werden, um diesen Fehler zu vermeiden, wenn die Internetgeschwindigkeit wirklich gut ist

Auflehnung
quelle
Das ist ein guter Tipp, aber das Fehlen des Zertifikats würde zu einem x509: certificate signed by unknown authorityFehler führen, nicht TLS handshake timeout.
wisbucky
2

Ich hatte ein gleiches Problem, indem ich das docker run hello-world1. Mal verwendete, was beim Herunterladen eines Bildes dazu führte https://registry-1.docker.io/v2/, welches Ende zu verwenden

docker: Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: net/http: TLS handshake timeout.

Durchsuchte das Web stundenlang und fand heraus, dass dies bei einigen Benutzern mit Ubuntu 18.04 und der aktuellen Docker-Version hinter einem Proxy passiert. Eine Problemumgehung besteht darin, die gesamte https-Proxy-Konfiguration zu entfernen, um nur die http-Proxy-Konfiguration zu belassen und einen http-Download (nicht https) zu erzwingen.

Ich weiß nicht, was der wahre Grund ist.

(Übrigens: Ich hatte ein gleiches "TLS-Handshake" -Problem mit Composer und Packagist. Dies lag an einer fehlenden cacert.pem-Datei, die standardmäßig nicht von Ubuntu bereitgestellt wurde. Vielleicht geht dieses Docker-Problem in die gleiche Richtung ?)

Der Bndr
quelle
2

Ich habe das gleiche Problem. Dann wies die Antwort von Azamat Hackimov mich in die richtige Richtung. Mein Computer ist etwas langsam, insbesondere beim Booten, wenn ich den Dienst starten möchte. Daher tritt die kurze Auszeit in Kraft und tötet meine Anfrage.

Dies ist meine Problemumgehung:

docker pull $IMAGE || docker pull $IMAGE ||  docker pull $IMAGE || docker pull $IMAGE

Hammer einfach den Server mit Aufforderung. Normalerweise ist der zweite für mich erfolgreich.

Marmelade
quelle
Keine endgültige Lösung, aber eine vorübergehende Lösung
Gonzalo Cao
0

Was für mich funktionierte, war die Verwendung einer anderen Netzwerkschnittstelle. Anstatt eine Verbindung über Ethernet (Kabel) herzustellen, wechselte ich zu WLAN. Problem gelöst.

Ich war übrigens auf einer neuen Installation von Raspbian Stretch.

bandaangosta
quelle
0

Keine der obigen Antworten kann mein Problem lösen, jedoch habe ich festgestellt, dass die unten stehende https://github.com/helm/helm/issues/5220 für mich funktioniert!

Nach dieser Änderung hat die IT-Abteilung meines Unternehmens eine Lösung gefunden. Ich habe die Umgebungsvariable https_proxy mit https: // URL zu unserem Proxy verwendet. Dies funktioniert für die meisten Tools, die wir verwenden, jedoch nicht für das Ruder oder den neueren Kubus. Sie scheinen einige Probleme mit dem TLS-Handshake zu haben. Wir haben von https: // zu einer http: // URL gewechselt (zB https_proxy = http: // myproxy ) und jetzt funktioniert alles einwandfrei .

Fei
quelle
0

Sie können den TLS handshake timeoutFehler erhalten, wenn Ihr Docker-Daemon-Proxy nicht richtig konfiguriert ist.

# verify docker daemon proxy configuration
/etc/systemd/system/docker.service.d/proxy.conf

# flush changes
sudo systemctl daemon-reload

# restart docker service
sudo systemctl restart docker 

Weitere Informationen finden Sie unter https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

weises Glück
quelle