Pull do Docker: tempo limite do handshake TLS

13

Eu entendo isso 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

No entanto, o TLS curl funciona bem (além do erro de autenticação):

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

E mesmo um pequeno programa golang (para imitar o docker) funciona bem:

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

O pcap para a solicitação de tempo limite TLS do 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

O que poderia estar dando errado?

Willem
fonte
1
Troquei meu modem dsl e o problema desapareceu ... suspeito que tenha sido um problema de mtu.
Willem

Respostas:

14

net/http: TLS handshake timeoutsignifica que você tem uma conexão lenta à Internet. O valor padrão do tempo limite da conexão é muito pequeno para o seu ambiente. Infelizmente, o docker não possui configurações que permitam alterar o tempo limite da conexão. Você pode tentar criar seu próprio cache de registro em outro lugar e extrair imagens dele.

Azamat Hackimov
fonte
1
Bem, speedtest.nete fast.commostrar que a velocidade da minha internet é de 90 Mbit / s. Isso é lento? Estou puxando python:2.7-slimimagem. Eu sou capaz de puxar hello-worlddo hub, mas não o python. Isso me dá o mesmo TLS handshake timeouterro.
Nikhil Chilwant
3
Antes que as pessoas comecem a fazer algo dramático, quero comentar: ter um erro de digitação no nome da imagem também produz o mesmo erro. Muito descritivo.
Barafu Albino
1
Um tempo limite do handshake do TLS não significa que a conexão com a Internet esteja lenta. Essa mensagem também será exibida se o handshake TLS parar por diferentes motivos. Por exemplo, se um lado não gosta de conversar com uma versão específica do TLS ou devido a um problema de certificado.
The Bndr 30/01/19
4

No meu caso, meu servidor estava atrás do nat e do proxy e configurado para detectar automaticamente o que eu fiz no terminal atual, tenho configurações de proxy de exportação

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
fonte
3

Eu tive um problema igual, usando a docker run hello-world1ª vez, o que resulta no download de uma imagem usando https://registry-1.docker.io/v2/, que termina em

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

Pesquisando na web por horas e descobrimos que isso acontece em alguns usuários com o ubuntu 18.04 e a versão atual do docker, atrás de um proxy. Uma solução alternativa é remover toda a configuração do proxy https para deixar apenas a configuração do proxy http e forçar um download http (não https).

Não sei qual é o verdadeiro motivo.

(a propósito: eu tive um problema igual de "TLS handshake" com o compositor e o packagist. Isso ocorreu devido a um arquivo cacert.pem ausente, que não era fornecido pelo ubuntu por padrão. Talvez esse problema do docker esteja indo na mesma direção ?)

The Bndr
fonte
2

Se você estiver usando um registro particular, precisará colocar o certificado para isso em /etc/docker/certs.d/ registryname /ca.crt

registryname mudará de acordo

Além disso, altere o tamanho da MTU para 1300, isso também foi uma coisa que fiz para resolver o erro. Primeiro registro, acredito que você já tenha feito. Comando para alteração de MTU

ip link set dev eth0 mtu 1300

É importante verificar o tamanho da MTU para evitar esse erro se a velocidade da Internet é realmente boa

rebelião
fonte
Essa é uma boa dica, mas não ter o certificado resultaria em um x509: certificate signed by unknown authorityerro, não TLS handshake timeout.
wisbucky
2

Eu experimentei o mesmo problema. Então a resposta de Azamat Hackimov me apontou na direção certa. Minha máquina está um pouco lenta, especialmente no momento da inicialização, quando desejo iniciar o serviço. Portanto, o curto tempo limite entra em ação e mata minha solicitação.

Esta é minha solução alternativa:

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

Simplesmente martele o servidor com solicitação. Normalmente, o segundo é bem sucedido para mim.

Geléia
fonte
Não uma solução definitiva, mas bom como uma solução temporária
Gonzalo Cao
0

O que funcionou para mim foi usar uma interface de rede diferente. Em vez de conectar através de Ethernet (com fio), mudei para wifi. Problema resolvido.

A propósito, eu estava em uma nova instalação do Raspbian Stretch.

bandaangosta
fonte
0

Nenhuma das respostas acima pode resolver meu problema, no entanto, descobri que abaixo https://github.com/helm/helm/issues/5220 funciona para mim!

Após essa alteração, o departamento de TI da minha empresa encontrou uma solução. Eu usei a variável de ambiente https_proxy com https: // url em nosso proxy. Isso funciona para a maioria das ferramentas que estamos usando, mas não para o leme ou o kube mais recente. Eles parecem ter alguns problemas com o handshake TLS. Mudamos de https: // para um http: // url (por exemplo, https_proxy = http: // myproxy ) e agora tudo funciona bem.

Fei
fonte
0

Você pode obter o TLS handshake timeouterro se o proxy do daemon do docker não estiver configurado corretamente.

# 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 obter mais detalhes, consulte https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

wisbucky
fonte