Docker pull: Thời gian bắt tay TLS


13

Tôi nhận được điều này một cách nhất quán (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

Tuy nhiên, TLS curl hoạt động tốt (ngoài lỗi auth):

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

Và thậm chí một chương trình golang nhỏ (để bắt chước docker) hoạt động tốt:

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 cho yêu cầu hết thời gian chờ TLS của 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

Điều gì có thể xảy ra?


1
Tôi đã trao đổi modem dsl của mình và sự cố đã biến mất ... Tôi nghi ngờ đó là sự cố mtu.
Willem

Câu trả lời:


14

net/http: TLS handshake timeoutcó nghĩa là bạn có kết nối internet chậm. Giá trị mặc định của thời gian chờ kết nối quá nhỏ đối với môi trường của bạn. Thật không may, docker không có bất kỳ cài đặt nào cho phép bạn thay đổi thời gian chờ kết nối. Bạn có thể cố gắng tạo bộ nhớ cache đăng ký của riêng mình ở một nơi khác và kéo hình ảnh từ nó.


1
Chà, speedtest.netfast.comcho thấy tốc độ internet của tôi là 90 Mbit / s. Có chậm không Tôi đang kéo python:2.7-slimhình ảnh. Tôi có thể kéo hello-worldtừ trung tâm nhưng không phải là con trăn. Nó cho tôi cùng một TLS handshake timeoutlỗi.
Nikhil Chilwant

3
Trước khi mọi người bắt đầu làm một điều gì đó kịch tính, tôi muốn nhận xét: có một lỗi đánh máy trong tên hình ảnh cũng tạo ra lỗi tương tự. Rất mô tả.
Barafu Albino

1
Thời gian chờ bắt tay TLS hầu như không có nghĩa, kết nối internet bị chậm. Thông báo này cũng sẽ xuất hiện, nếu bắt tay TLS dừng lại vì những lý do khác nhau. Ví dụ: nếu một bên không muốn nói chuyện với một phiên bản TLS cụ thể hoặc do vấn đề chứng chỉ.
Bndr

4

Trong trường hợp của tôi, máy chủ của tôi đứng sau nat và proxy và được đặt thành tự động phát hiện proxy những gì tôi đã làm trên thiết bị đầu cuối hiện tại tôi có cài đặt proxy xuất

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

Tôi đã có một vấn đề tương đương, bằng cách sử dụng docker run hello-worldlần đầu tiên, dẫn đến việc tải xuống một hình ảnh bằng cách sử dụng https://registry-1.docker.io/v2/, kết thúc bằng

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

Tìm kiếm trên web hàng giờ và phát hiện ra rằng điều này xảy ra ở một số người dùng với Ubuntu 18.04 và bản phát hành docker hiện tại, đằng sau một proxy. Giải pháp thay thế là xóa tất cả cấu hình proxy https để chỉ còn lại cấu hình proxy http, để buộc tải xuống http (không phải https).

Không biết, lý do thực sự là gì.

. ?)


2

Nếu bạn đang sử dụng sổ đăng ký riêng, bạn cần đặt chứng chỉ cho mục đó trong /etc/docker/certs.d/ registryname /ca.crt

tên đăng ký sẽ thay đổi tương ứng

Ngoài ra, vui lòng thay đổi kích thước MTU của bạn thành 1300, đây cũng là một điều tôi đã làm để khắc phục lỗi. Đăng ký một tôi tin rằng bạn có thể đã thực hiện. Lệnh thay đổi MTU

ip link set dev eth0 mtu 1300

Kích thước MTU rất quan trọng để kiểm tra để tránh lỗi này nếu tốc độ internet của bạn thực sự tốt


Đó là một mẹo tốt, nhưng không có chứng chỉ sẽ dẫn đến một x509: certificate signed by unknown authoritylỗi, không TLS handshake timeout.
wvducky

2

Tôi gặp vấn đề tương tự. Sau đó, câu trả lời của Azamat Hackimov đã chỉ cho tôi đi đúng hướng. Máy của tôi hơi chậm, đặc biệt là lúc khởi động, khi tôi muốn khởi chạy dịch vụ. Do đó, thời gian chờ ngắn ngủi và giết chết yêu cầu của tôi.

Đây là cách giải quyết của tôi:

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

Đơn giản chỉ cần đập máy chủ với yêu cầu. Thông thường thứ hai là thành công đối với tôi.


Không phải là một giải pháp dứt khoát nhưng tốt như một cách giải quyết tạm thời
Gonzalo Cao

0

Điều làm việc cho tôi là sử dụng một giao diện mạng khác. Thay vì kết nối qua ethernet (có dây), tôi chuyển sang wifi. Vấn đề được giải quyết.

Nhân tiện, tôi đã cài đặt Raspbian Stretch.


0

Không có câu trả lời nào ở trên có thể giải quyết vấn đề của tôi, tuy nhiên tôi thấy rằng bên dưới https://github.com/mus/mus/issues/5220 hoạt động với tôi!

Sau đó, bộ phận CNTT của công ty tôi đã tìm ra giải pháp. Tôi đã sử dụng biến môi trường https_proxy với https: // url cho proxy của chúng tôi. Điều này hoạt động cho hầu hết các công cụ chúng tôi đang sử dụng nhưng không phải cho helm hoặc kube mới hơn. Họ dường như có một số vấn đề với cái bắt tay TLS. Chúng tôi đã chuyển từ https: // sang http: // url (ví dụ: https_proxy = http: // myproxy ) và bây giờ mọi thứ đều hoạt động tốt.


0

Bạn có thể gặp TLS handshake timeoutlỗi nếu proxy daemon docker của bạn không được cấu hình đúng.

# 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 

Để biết thêm chi tiết, hãy xem https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.