Docker pull: tiempo de espera de apretón de manos TLS

14

Me sale esto consistentemente (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

Sin embargo, curl TLS funciona bien (aparte del error de autenticación):

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

E incluso un pequeño programa golang (para imitar docker) funciona bien:

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

El pcap para la solicitud de tiempo de espera TLS de 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

¿Qué podría estar yendo mal?

Willem
fuente
1
Cambié mi módem dsl y el problema desapareció ... Sospecho que era un problema de mtu.
Willem

Respuestas:

14

net/http: TLS handshake timeoutsignifica que tienes una conexión a internet lenta. El valor predeterminado del tiempo de espera de conexión es demasiado pequeño para su entorno. Lamentablemente, Docker no tiene ninguna configuración que le permita cambiar el tiempo de espera de la conexión. Puede intentar crear su propio caché de registro en otro lugar y extraer imágenes de él.

Azamat Hackimov
fuente
1
Bueno, speedtest.nety fast.commostrar mi velocidad de internet es de 90 Mbit / s. ¿Eso es lento? Estoy tirando de la python:2.7-slimimagen. Soy capaz de extraer hello-worlddel concentrador, pero no de Python. Me da el mismo TLS handshake timeouterror.
Nikhil Chilwant
3
Antes de que la gente comience a hacer algo dramático, quiero comentar: tener un error tipográfico en el nombre de la imagen también produce el mismo error. Muy descriptivo.
Barafu Albino
1
Un tiempo de espera de apretón de manos TLS en su mayoría no significa que la conexión a Internet sea lenta. Este mensaje también aparecerá si el protocolo de enlace TLS se detiene por diferentes razones. Por ejemplo, si a un lado no le gusta hablar con una versión específica de TLS o por un problema de certificado.
El Bndr
4

En mi caso, mi servidor estaba detrás de la nat y el proxy y estaba configurado para detectar automáticamente el 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
Mansur Ali
fuente
3

Tuve un problema igual, al usar la docker run hello-worldprimera vez, lo que resulta en descargar una imagen usando https://registry-1.docker.io/v2/, que termina

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

Buscando en la web durante horas y descubrió que esto sucede en algunos usuarios con ubuntu 18.04 y la versión actual de Docker, detrás de un proxy. Una solución alternativa es eliminar toda la configuración del proxy https para dejar solo la configuración del proxy http, para forzar una descarga http (no https).

No sé, cuál es la verdadera razón.

(por cierto: tuve un problema igual de "TLS handshake" con el compositor y el empaquetador. Esto se debió a la falta de un archivo cacert.pem, que no fue proporcionado por ubuntu por defecto. Tal vez este problema del acoplador va en la misma dirección ?)

El bndr
fuente
2

Si está utilizando un registro privado, es necesario colocar el certificado para que bajo /etc/docker/certs.d/ registryname /ca.crt

nombre de registro cambiará en consecuencia

Además, cambie el tamaño de su MTU a 1300, esto también fue una cosa que hice para resolver el error. Registro uno, creo que ya lo habrás hecho. Comando para cambio de MTU

ip link set dev eth0 mtu 1300

Es importante verificar el tamaño de MTU para evitar este error si la velocidad de Internet es realmente buena

rebelión
fuente
Ese es un buen consejo, pero no tener el certificado daría lugar a un x509: certificate signed by unknown authorityerror, no TLS handshake timeout.
wisbucky
2

Experimento el mismo problema. Entonces la respuesta de Azamat Hackimov me señaló en la dirección correcta. Mi máquina es algo lenta, especialmente en el momento del arranque, cuando quiero iniciar el servicio. Por lo tanto, el breve tiempo de espera entra en acción y mata mi solicitud.

Esta es mi solución:

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

Simplemente martille el servidor con solicitud. Por lo general, el segundo es exitoso para mí.

Mermelada
fuente
No es una solución definitiva, pero bueno como una solución temporal
Gonzalo Cao
0

Lo que funcionó para mí fue usar una interfaz de red diferente. En lugar de conectarme a través de Ethernet (por cable), cambié a wifi. Problema resuelto.

Por cierto, estaba en una nueva instalación de Raspbian Stretch.

bandaangosta
fuente
0

Ninguna de las respuestas anteriores puede resolver mi problema, sin embargo, encontré que a continuación https://github.com/helm/helm/issues/5220 funciona para mí!

Después de ese cambio, el departamento de TI de mi empresa ha encontrado una solución. Usé la variable de entorno https_proxy con https: // url para nuestro proxy. Esto funciona para la mayoría de las herramientas que estamos utilizando, pero no para Helm o el nuevo Kube. Parecen tener algunos problemas con el apretón de manos TLS. Cambiamos de https: // a una http: // url (por ejemplo, https_proxy = http: // myproxy ) y ahora todo funciona bien.

Fei
fuente
0

Puede obtener el TLS handshake timeouterror si su proxy de Docker Daemon no está configurado correctamente.

# 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 

Para obtener más detalles, consulte https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Wisbucky
fuente