Витягнення докера: час очікування рукостискання TLS


14

Я розумію це послідовно (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

Однак TLS curl працює чудово (крім помилки auth):

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

І навіть невелика голанг-програма (імітувати докер) прекрасно працює:

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 для запиту на час очікування TLS докера:

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

Що може піти не так?


1
Я поміняв свій модем dsl, і проблеми вже не було ... підозрюю, що це проблема з mtu.
Віллем

Відповіді:


15

net/http: TLS handshake timeoutозначає, що у вас повільний зв’язок з Інтернетом. Значення тайм-ауту з'єднання за замовчуванням занадто мало для вашого оточення. На жаль, у докера немає налаштувань, які дозволять змінити час очікування з'єднання. Ви можете спробувати створити власний кеш реєстру десь в іншому місці і витягнути з нього зображення.


1
Ну, speedtest.netі fast.comпокажіть, що моя швидкість Інтернету - 90 Мбіт / с. Це повільно? Я тягну python:2.7-slimобраз. Я вмію витягувати hello-worldз концентратора, але не з пітона. Це дає мені таку ж TLS handshake timeoutпомилку.
Nikhil Chilwant

3
Перш ніж люди починають робити щось драматичне, я хочу зауважити: помилка друку в назві зображення також призводить до тієї ж помилки. Дуже описовий.
Барафу Альбіно

1
Тайм-аут рукостискання TLS здебільшого не означає, що з'єднання з Інтернетом має повільно. Це повідомлення також з’явиться, якщо рукостискання TLS припиниться з різних причин. Наприклад, якщо одна сторона не любить спілкуватися з певною версією TLS або через проблему з сертифікатом.
Бндр

4

У моєму випадку мій сервер був поза Nat і проксі і встановив автоматичне виявлення проксі, що я робив на поточному терміналі, у мене є параметри експорту проксі

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

У мене була однакова проблема, використовуючи docker run hello-worldперший раз, що призводить до завантаження зображення, використовуючи https://registry-1.docker.io/v2/, що закінчується

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

Години шукали в Інтернеті і з’ясували, що це відбувається у деяких користувачів з ubuntu 18.04 та поточним випуском докера, за проксі. Вирішення завдання полягає в тому, щоб видалити всю конфігурацію https-проксі, щоб залишити лише конфігурацію http-проксі, щоб змусити завантажувати http (не https).

Не знаю, яка реальна причина.

(до речі: у мене була однакова проблема "TLS рукостискання" з композитором і пакувальником. Це було через відсутність файлу cacert.pem, який не був наданий ubuntu за замовчуванням. Можливо, ця проблема з докером йде в той же напрямок ?)


3

Я відчуваю ту саму проблему. Тоді відповідь Азамата Гакімова вказала на мене в правильному напрямку. Моя машина дещо повільна, особливо під час завантаження, коли я хочу запустити послугу. Тому короткий тайм-аут починає і вбиває моє прохання.

Це моє вирішення:

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

Просто забийте сервер із запитом. Зазвичай другий для мене вдалий.


Не остаточне рішення, але добре, як тимчасове вирішення
Гонсало Као

2

Якщо ви використовуєте приватний реєстр, вам потрібно помістити сертифікат для цього під /etc/docker/certs.d/ ім'я реєстру /ca.crt

ім'я реєстру буде відповідно змінено

Крім того, будь ласка, змініть свій розмір MTU на 1300, це також було одне, що я зробив, щоб усунути помилку. Реєстр, який я вважаю, ви, можливо, вже зробили. Команда для зміни MTU

ip link set dev eth0 mtu 1300

MTU розмір важливо перевірити, щоб уникнути цієї помилки, якщо ви швидкість Інтернету дійсно хороша


Це гарна порада, але відсутність сертифіката призведе до x509: certificate signed by unknown authorityпомилки TLS handshake timeout.
wisbucky

0

Що для мене спрацювало - використовувати інший мережевий інтерфейс. Замість підключення через Ethernet (дротовий) я перейшов на wifi. Проблема вирішена.

Я, до речі, був на свіжому знімку Raspbian Stretch.


0

Жоден із наведених вище відповідей не може вирішити мою проблему, проте я виявив, що нижче https://github.com/helm/helm/isissue/5220 працює для мене!

Після цього змінити ІТ-приміщення моєї компанії знайшло рішення. Я використовував змінну середовища https_proxy з https: // url для нашого проксі. Це працює для більшості інструментів, які ми використовуємо, але не для керма чи новішої куби. Здається, вони мають проблеми з рукостисканням TLS. Ми перейшли з https: // до http: // url (наприклад, https_proxy = http: // myproxy ) і тепер все працює добре.


0

Ви можете отримати TLS handshake timeoutпомилку, якщо ваш проксі-демон dacker не налаштований правильно.

# 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 

Детальніше див. На https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.