Назад | Перейти на главную страницу

Docker pull: таймаут рукопожатия TLS

Я получаю это последовательно (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

Однако curl TLS работает нормально (кроме ошибки аутентификации):

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

И даже небольшая программа golang (имитирующая докер) отлично работает:

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 для запроса тайм-аута docker 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

Что могло пойти не так?

net/http: TLS handshake timeout означает, что у вас медленное интернет-соединение. Значение таймаута соединения по умолчанию слишком мало для вашей среды. К сожалению, в докере нет настроек, позволяющих изменить время ожидания соединения. Вы можете попробовать создать свой собственный кеш реестра где-нибудь еще и вытащить из него изображения.

У меня такая же проблема. Тогда ответ Азамата Хакимова указал мне правильное направление. Моя машина несколько медленная, особенно во время загрузки, когда я хочу запустить службу. Поэтому короткий тайм-аут срабатывает и убивает мой запрос.

Это мой обходной путь:

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

Просто забейте сервер запросом. Обычно у меня получается второй.

У меня была такая же проблема, используя docker run hello-world 1-й раз, что приводит к загрузке изображения с помощью 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 по умолчанию. Возможно, эта проблема с докером идет в том же направлении ?)

Если вы используете частный реестр, вам необходимо разместить сертификат для этого в /etc/docker/certs.d/имя в реестре/ca.crt

имя в реестре соответственно изменится

Также, пожалуйста, измените свой MTU размер до 1300, это тоже было то, что я сделал, чтобы исправить ошибку. Первый реестр, я думаю, вы уже сделали. Команда на изменение MTU

ip link set dev eth0 mtu 1300

Размер MTU важно проверить, чтобы избежать этой ошибки, если у вас действительно хорошая скорость интернета

В моем случае мой сервер находился за 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

Ни один из приведенных выше ответов не может решить мою проблему, однако я обнаружил, что ниже https://github.com/helm/helm/issues/5220 работает для меня!

После этого изменения ИТ-подразделение моей компании нашло решение. Я использовал переменную окружения https_proxy с https: // url для нашего прокси. Это работает для большинства инструментов, которые мы используем, но не для helm или новой версии kube. Кажется, у них естьНекоторые проблемы с рукопожатием TLS. Мы перешли с https: // на http: // url (например, https_proxy =http: // myproxy) и теперь все работает нормально.

Для меня сработало использование другого сетевого интерфейса. Вместо подключения через Ethernet (проводной) я перешел на Wi-Fi. Задача решена.

Кстати, у меня была свежая установка Raspbian Stretch.

Вы можете получить TLS handshake timeout ошибка, если ваш прокси-сервер демона докеров настроен неправильно.

# 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

В моем случае я просто меняю подключение к Интернету на другое соединение. Оказывается, мой нынешний интернет-провайдер работает медленно