Docker pull: timeout della stretta di mano TLS


14

Lo capisco costantemente (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

Comunque curl TLS funziona bene (a parte l'errore di autenticazione):

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

E anche un piccolo programma Golang (per imitare la finestra mobile) funziona bene:

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))
}

Il pcap per la richiesta di timeout TLS docker:

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

Cosa potrebbe andare storto?


1
Ho scambiato il mio modem dsl e il problema era sparito ... Sospetto che fosse un problema mtu.
Willem,

Risposte:


14

net/http: TLS handshake timeoutsignifica che hai una connessione internet lenta. Il valore predefinito del timeout della connessione è troppo piccolo per il tuo ambiente. Purtroppo la finestra mobile non ha alcuna impostazione che consente di modificare il timeout della connessione. Puoi provare a creare la tua cache del registro da qualche altra parte e estrarre immagini da essa.


1
Bene, speedtest.nete fast.commostra che la mia velocità di internet è di 90 Mbit / s. È lento? Sto tirando l' python:2.7-slimimmagine. Sono in grado di estrarre hello-worlddall'hub ma non quello di Python. Mi dà lo stesso TLS handshake timeouterrore.
Nikhil Chilwant,

3
Prima che le persone inizino a fare qualcosa di drammatico, voglio sottolineare: avere un refuso nel nome dell'immagine produce anche lo stesso errore. Molto descrittivo.
Barafu Albino,

1
Un timeout dell'handshake TLS per lo più non significa che la connessione a Internet rallenti. Questo messaggio verrà visualizzato anche se l'handshake TLS si interrompe per diversi motivi. Ad esempio, se a una parte non piace parlare con una specifica versione TLS o a causa di un problema con il certificato.
Il Bndr il

4

Nel mio caso il mio server era dietro nat e proxy e impostato per rilevare automaticamente il proxy cosa ho fatto sul terminale corrente ho impostazioni di esportazione proxy

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

3

Ho avuto un problema uguale, usando la docker run hello-worldprima volta, che ha come risultato il download di un'immagine usando https://registry-1.docker.io/v2/, che alla fine

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

Cercando sul web per ore e ho scoperto che ciò accade ad alcuni utenti con ubuntu 18.04 e l'attuale versione mobile, dietro un proxy. Una soluzione alternativa è rimuovere tutta la configurazione del proxy https per lasciare solo la configurazione del proxy http, per forzare un download http (non https).

Non so quale sia la vera ragione.

(a proposito: ho avuto un uguale problema di "stretta di mano TLS" con compositore e packagist. Questo era a causa di un file cacert.pem mancante, che non era fornito da Ubuntu di default. Forse questo problema docker sta andando nella stessa direzione ?)


2

Se si utilizza un registro privato, è necessario inserire il certificato per quella sotto /etc/docker/certs.d/ RegistryName /ca.crt

registryname cambierà di conseguenza

Inoltre, si prega di cambiare la dimensione MTU a 1300, questa è stata anche una cosa che ho fatto per risolvere l'errore. Registro uno credo che potresti aver già fatto. Comando per cambio MTU

ip link set dev eth0 mtu 1300

La dimensione dell'MTU è importante per evitare questo errore se la velocità di Internet è davvero buona


Questo è un buon consiglio, ma non avere il certificato comporterebbe un x509: certificate signed by unknown authorityerrore, no TLS handshake timeout.
Wisbucky,

2

Ho lo stesso problema. Quindi la risposta di Azamat Hackimov mi ha indicato la giusta direzione. La mia macchina è piuttosto lenta, specialmente all'avvio, quando voglio avviare il servizio. Pertanto il breve timeout si avvia e uccide la mia richiesta.

Questa è la mia soluzione alternativa:

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

Basta martellare il server con la richiesta. Di solito il secondo ha successo per me.


Non una soluzione definitiva ma buona come soluzione temporanea
Gonzalo Cao

0

Ciò che ha funzionato per me è stato usare un'interfaccia di rete diversa. Invece di connettermi tramite Ethernet (cablato), sono passato al wifi. Problema risolto.

A proposito, ero su una nuova installazione di Raspbian Stretch.


0

Nessuna delle risposte precedenti può risolvere il mio problema, tuttavia ho scoperto che di seguito https://github.com/helm/helm/issues/5220 funziona per me!

Dopo tale modifica, l'appartamento IT della mia azienda ha trovato una soluzione. Ho usato la variabile di ambiente https_proxy con https: // url al nostro proxy. Questo funziona per la maggior parte degli strumenti che stiamo usando, ma non per il timone o il kube più recente. Sembrano avere alcuni problemi con l'handshake TLS. Siamo passati da https: // a http: // url (ad esempio https_proxy = http: // myproxy ) e ora tutto funziona bene.


0

È possibile ottenere l' TLS handshake timeouterrore se il proxy del daemon docker non è configurato correttamente.

# 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 

Per maggiori dettagli, consultare https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.