Как справиться с этой ошибкой при выполнении команды Docker pull (Linux) “запрос отменен во время ожидания соединения (Client.Timeout превышен во время ожидания заголовков)”?

Вопрос или проблема

Когда пытаюсь загрузить контейнеры Docker, сталкиваюсь с этой ошибкой:

Используется тег по умолчанию: latest
Ошибка от демона: Get https://registry-1.docker.io/v2/: net/http: запрос отменен в ожидании подключения (Client.Timeout превысил время ожидания заголовков)

Версия ОС

Ubuntu 18.04 (bionic)

Версия Docker

Клиент:
Версия:           18.09.4
API версия:       1.39
Версия Go:        go1.10.8
Git commit:       d14af54266
Сборка:             Wed Mar 27 18:35:44 2019
OS/Arch:           linux/amd64
Экспериментально:  false
Сервер: Docker Engine - Community
Движок:
Версия:          18.09.4
API версия:      1.39 (минимальная версия 1.12)
Версия Go:       go1.10.8
Git commit:      d14af54
Сборка:            Wed Mar 27 18:01:48 2019
OS/Arch:          linux/amd64
Экспериментально:  false

Шаги для воспроизведения.

docker pull hello-world

Я не за прокси или VPN (что, как кажется, является проблемой в других постах, которые я видел об этой ошибке)

Я пытался найти исправление, но безрезультатно. service docker restart не решает проблему. Я обнаружил, что добавление nameserver 8.8.8.8 в /etc/resolv.conf временно решает проблему, но resolv.conf автоматически перезаписывается/обновляется до старой версии, поэтому это не идеальное решение. Я смог загружать образы Docker из Docker Hub на этом компьютере и в моей текущей сети в прошлом, поэтому, возможно, некоторые настройки были изменены, что вызвало эту проблему.

Если это имеет значение, вот вывод из docker info:

Контейнеров: 2
Работает: 0
Приостановлено: 0
Остановлено: 2
Образов: 9
Версия сервера: 18.09.4
Драйвер хранения: overlay2
Поддерживающая файловая система: extfs
Поддержка d_type: true
Нативный Overlay Diff: true
Драйвер логирования: json-file
Драйвер Cgroup: cgroupfs
Плагины:
Том: local
Сеть: мост host macvlan null overlay
Лог: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: неактивный
Среды выполнения: runc
Среда выполнения по умолчанию: runc
Бинарный файл инициализации: docker-init
Версия containerd: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
Версия runc: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
Версия инициализации: fec3683
Опции безопасности:
apparmor
seccomp
Профиль: по умолчанию
Версия ядра: 4.15.0-1035-oem
Операционная система: Ubuntu 18.04.2 LTS
Тип ОС: linux
Архитектура: x86_64
CPU: 12
Общая память: 31.05GiB
Имя: ###(скрыто)###
ID: ###(скрыто)###
Корневая директория Docker: /var/lib/docker
Режим отладки (клиент): false
Режим отладки (сервер): false
Реестр: https://index.docker.io/v1/
Метки:
Экспериментально: false
Небезопасные реестры:
127.0.0.0/8
Включен режим Live Restore: false
Продуктовая лицензия: Community Engine
ПРЕДУПРЕЖДЕНИЕ: Не поддерживается ограничение SWAP

Вывод из dig index.docker.io с использованием 127.0.0.53 (по умолчанию в resolv.conf)

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> index.docker.io
;; общие опции: +cmd
;; Получен ответ:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57173
;; флаги: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; PSEUDOSECTION OPT:
; EDNS: версия: 0, флаги:; udp: 65494
;; ВОПРОС РАЗДЕЛ:
;index.docker.io.       IN  A

;; ОТВЕТ РАЗДЕЛ:
index.docker.io.    300 IN  CNAME   elb-io.us-east-1.aws.dckr.io.
elb-io.us-east-1.aws.dckr.io. 899 IN    CNAME   us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com.
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 59 IN A 52.207.42.240
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 59 IN A 3.91.211.1
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 59 IN A 52.54.178.62

;; Время запроса: 404 мс
;; СЕРВЕР: 127.0.0.53#53(127.0.0.53)
;; КОГДА: Пон 15 апр 09:36:42 MDT 2019
;; РАЗМЕР СООБЩЕНИЯ  получено: 212

Вывод из dig index.docker.io с использованием 8.8.8.8:

; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> index.docker.io
;; общие опции: +cmd
;; Получен ответ:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37695
;; флаги: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; PSEUDOSECTION OPT:
; EDNS: версия: 0, флаги:; udp: 512
;; ВОПРОС РАЗДЕЛ:
;index.docker.io.       IN  A

;; ОТВЕТ РАЗДЕЛ:
index.docker.io.    133 IN  CNAME   elb-io.us-east-1.aws.dckr.io.
elb-io.us-east-1.aws.dckr.io. 837 IN    CNAME   us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com.
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 56 IN A 52.207.42.240
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 56 IN A 3.91.211.1
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 56 IN A 52.54.178.62

;; Время запроса: 19 мс
;; СЕРВЕР: 8.8.8.8#53(8.8.8.8)
;; КОГДА: Пон 15 апр 09:49:22 MDT 2019
;; РАЗМЕР СООБЩЕНИЯ  получено: 212

Скорее всего, это не проблема с вашей установкой Docker.

Если изменение DNS на 8.8.8.8 решает проблему, возможно, вы получаете другой адрес от 8.8.8.8, чем от вашей обычной службы DNS. Вы можете использовать dig, чтобы получить адрес с обоими конфигурациями:

dig index.docker.io

; <<>> DiG 9.10.3-P4-Ubuntu <<>> index.docker.io
;; общие опции: +cmd
;; Получен ответ:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28068
;; флаги: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; PSEUDOSECTION OPT:
; EDNS: версия: 0, флаги:; udp: 4096
;; ВОПРОС РАЗДЕЛ:
;index.docker.io.               IN      A

;; ОТВЕТ РАЗДЕЛ:
index.docker.io.        926     IN      CNAME   elb-io.us-east-1.aws.dckr.io.
elb-io.us-east-1.aws.dckr.io. 926 IN    CNAME   us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com.
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 926 IN A 52.54.178.62
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 926 IN A 3.91.211.1
us-east-1-elbio-rm5bon1qaeo4-623296237.us-east-1.elb.amazonaws.com. 926 IN A 52.207.42.240

;; Время запроса: 2 мс
;; СЕРВЕР: 127.0.1.1#53(127.0.1.1)
;; КОГДА: Воскр 14 апр 09:15:20 CEST 2019
;; РАЗМЕР СООБЩЕНИЯ  получено: 214

Если вы не хотите изменять DNS, вы все еще можете добавить один из приведенных выше адресов в свой /etc/hosts, это не будет сброшено при перезагрузке. Конечно, это предотвращает использование других серверов в кластере, и выбранный адрес может стать недействительным.

Если ваш стандартный DNS в resolv.conf – это 127.0.0.что-то, ваша система, вероятно, настроена на использование NetworkManager-контролируемого dnmasq: DNS-запросы обрабатываются службой на вашей системе, которая пересылает их на различные DNS под капотом. Вы можете узнать фактически использованный DNS (DNS установлен для каждого сетевого интерфейса) с помощью:

nmcli dev show | grep DNS

А затем продолжайте искать медленный/недействительный DNS оттуда.

.

Ответ или решение

Теория (T): Проблема с Docker Pull

Ошибка при выполнении команды docker pull, сообщающая о превышении времени ожидания (Client.Timeout exceeded while awaiting headers), часто связана с сетевыми проблемами, особенно с DNS. DNS (Domain Name System) играет важную роль в преобразовании доменных имен в IP-адреса, и любая задержка или проблема в этой области может привести к сбоям, таким как описанные в вопросе.

Основные причины подобных ошибок могут быть следующими:

  1. DNS-проблемы: Устаревшие или медленные DNS-серверы могут медленно отвечать на запросы, что приводит к превышению времени ожидания.

  2. Сетевые проблемы: Нестабильный интернет или локальные сетевые ограничения также могут вызывать задержки.

  3. Конфигурация системы: Неправильные настройки сети на вашем устройстве, такие как использование внутреннего DNS-сервера, могут снижать скорость работы.

Пример (E): Анализ текущей ситуации

На основании предоставленной информации ясно, что изменение DNS на публичные серверы, такие как Google DNS (8.8.8.8), временно решает проблему. Это указывает на то, что ваш текущий DNS-сервер (вероятно, 127.0.0.53, управляемый через dnsmasq или NetworkManager) работает неэффективно или неправильно настроен.

Расположение данного DNS-сервера на 127.0.0.53 говорит о локальной обработке DNS-запросов, которая состоит в том, что ваш компьютер перенаправляет и обрабатывает DNS-запросы через локальный буферизующий сервер. Это иногда может быть причиной задержек, особенно если кэш серверов устарел или сбои в сетевой конфигурации.

Применение (A): Решение проблемы

Вот подробный план действий для устранения ошибки:

  1. Проверка и обновление системы:

    • Убедитесь, что ваше программное обеспечение (включая Docker и Ubuntu) актуально. Обновите Docker до последней стабильной версии. Старые версии могут содержать неполадки или иметь проблемы с совместимостью, которые были исправлены в более поздних обновлениях.
      sudo apt update && sudo apt upgrade
  2. Настройка DNS:

    • Если вы временно используете Google DNS для решения проблемы, рассмотрите более постоянные изменения сетевых настроек:
    • Отредактируйте NetworkManager для использования Google DNS напрямую:
      1. Откройте конфигурацию вашего сетевого подключения через NetworkManager.
      2. Найдите параметр DNS и измените его на 8.8.8.8 и 8.8.4.4.
      3. Перезапустите NetworkManager:
        sudo systemctl restart NetworkManager
    • Это сохранит настройки DNS после перезагрузки системы.
  3. Проверка производительности DNS:

    • Используйте dig для проверки времени ответа различных DNS-серверов:
      dig @8.8.8.8 index.docker.io
      dig @1.1.1.1 index.docker.io
  4. Изменение файла /etc/hosts (не рекомендуется для долгосрочного применения):

    • Как временное решение, можно добавить конкретный IP-адрес хоста Docker в файл /etc/hosts для обеспечения прямого доступа. Однако это может привести к проблемам при изменении IP-адресов.
      52.207.42.240 index.docker.io
  5. Диагностика сети:

    • Проверьте вашу сеть на наличие брандмауэра или других ограничений, которые могут блокировать или задерживать трафик Docker.
  6. Отладка системы:

    • Используйте nmcli для диагностики:
      nmcli dev show | grep DNS

Таким образом, разрешение проблемы с Docker Pull представляется в улучшении конфигурации DNS и настройке сетевых параметров. Вся предоставленная информация указывает на то, что проблема решаема с помощью оптимизации ваших текущих сетевых настроек и подтверждает, что сам Docker работает корректно.

Оцените материал
Добавить комментарий

Капча загружается...