Docker pull: TLS handshake timeout

14

Saya mendapatkan ini secara konsisten (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

Namun curl TLS berfungsi dengan baik (terlepas dari kesalahan auth):

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

Dan bahkan program golang kecil (untuk meniru buruh pelabuhan) berfungsi dengan baik:

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

PCap untuk permintaan batas waktu TLS buruh pelabuhan:

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

Apa yang mungkin salah?

Willem
sumber
1
Saya bertukar modem dsl saya dan masalahnya hilang ... Saya menduga itu adalah masalah mtu.
Willem

Jawaban:

14

net/http: TLS handshake timeoutberarti Anda memiliki koneksi internet yang lambat. Nilai default batas waktu koneksi terlalu kecil untuk lingkungan Anda. Sayangnya buruh pelabuhan tidak memiliki pengaturan yang memungkinkan Anda mengubah batas waktu koneksi. Anda dapat mencoba membuat cache registri Anda sendiri di tempat lain dan menarik gambar darinya.

Azamat Hackimov
sumber
1
Nah, speedtest.netdan fast.comtunjukkan kecepatan internet saya adalah 90 Mbit / s. Apakah itu lambat? Saya menarik python:2.7-slimgambar. Saya dapat menarik hello-worlddari hub tetapi bukan yang python. Ini memberi saya TLS handshake timeoutkesalahan yang sama .
Nikhil Chilwant
3
Sebelum orang mulai melakukan sesuatu yang dramatis saya ingin berkomentar: memiliki kesalahan ketik nama gambar juga menghasilkan kesalahan yang sama. Sangat deskriptif.
Barafu Albino
1
Batas waktu jabat tangan TLS sebagian besar tidak berarti, koneksi internet melambat. Pesan ini juga akan muncul, jika jabat tangan TLS berhenti karena berbagai alasan. Misalnya, jika satu sisi tidak suka berbicara dengan versi TLS tertentu atau karena masalah sertifikat.
Bndr
4

Dalam kasus saya server saya berada di belakang nat dan proksi dan diatur untuk mendeteksi proxy secara otomatis apa yang telah saya lakukan pada terminal saat ini saya memiliki pengaturan proxy ekspor

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

Saya memiliki Masalah yang sama, dengan menggunakan docker run hello-worldwaktu 1, yang menghasilkan pengunduhan gambar menggunakan https://registry-1.docker.io/v2/, yang berakhir dengan

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

Mencari di web selama berjam-jam dan menemukan, bahwa ini terjadi pada beberapa pengguna dengan ubuntu 18.04 dan rilis docker saat ini, di belakang proxy. Solusinya adalah menghapus semua konfigurasi https-proxy agar hanya meninggalkan konfigurasi http-proxy, untuk memaksa unduhan http (bukan https).

Tidak tahu, apa alasan sebenarnya.

(Omong-omong: Saya memiliki masalah "TLS handshake" yang sama dengan komposer dan pembuat paket. Ini karena file cacert.pem yang hilang, yang tidak disediakan oleh ubuntu secara default. Mungkin masalah docker ini mengarah ke arah yang sama ?)

Bndr
sumber
2

Jika Anda menggunakan registri pribadi, Anda harus menempatkan sertifikat di bawah /etc/docker/certs.d/ registryname /ca.crt

registryname akan berubah

Juga, tolong ubah ukuran MTU Anda menjadi 1300, ini juga satu hal yang saya lakukan untuk menyelesaikan kesalahan. Registry yang saya yakin Anda mungkin sudah melakukannya. Perintah untuk perubahan MTU

ip link set dev eth0 mtu 1300

Ukuran MTU penting untuk diperiksa untuk menghindari kesalahan ini jika kecepatan internet Anda benar-benar baik

pemberontakan
sumber
Itu tip yang bagus, tetapi tidak memiliki sertifikat akan menghasilkan x509: certificate signed by unknown authoritykesalahan, tidak TLS handshake timeout.
wisbucky
2

Saya mengalami masalah yang sama. Kemudian jawaban Azamat Hackimov menunjuk saya ke arah yang benar. Mesin saya agak lambat, terutama saat boot, ketika saya ingin meluncurkan layanan. Karena itu, batas waktu yang singkat itu menendang dan membunuh permintaan saya.

Ini adalah solusi saya:

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

Cukup palu server dengan permintaan. Biasanya yang kedua berhasil untuk saya.

Selai
sumber
Bukan solusi pasti tapi bagus sebagai solusi sementara
Gonzalo Cao
0

Apa yang berhasil bagi saya adalah menggunakan antarmuka jaringan yang berbeda. Alih-alih terhubung melalui ethernet (kabel), saya beralih ke wifi. Masalah terpecahkan.

Ngomong-ngomong, saya baru saja menginstal Peregangan Raspbian.

bandaangosta
sumber
0

Tidak ada jawaban di atas yang dapat menyelesaikan masalah saya, namun saya menemukan bahwa di bawah ini https://github.com/helm/helm/issues/5220 cocok untuk saya!

Setelah itu perubahan apartemen IT perusahaan saya telah menemukan solusi. Saya menggunakan variabel lingkungan https_proxy dengan https: // url ke proxy kami. Ini berfungsi untuk sebagian besar alat yang kami gunakan tetapi tidak untuk helm atau kubus yang lebih baru. Mereka tampaknya memiliki beberapa masalah dengan jabat tangan TLS. Kami beralih dari https: // ke http: // url (mis. Https_proxy = http: // myproxy ) dan sekarang semuanya berfungsi dengan baik.

Fei
sumber
0

Anda bisa mendapatkan TLS handshake timeoutkesalahan jika proxy daemon buruh pelabuhan Anda tidak dikonfigurasi dengan benar.

# 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 

Untuk detail lebih lanjut, lihat https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

wisbucky
sumber