Вопрос или проблема
Когда пытаюсь загрузить контейнеры 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-адреса, и любая задержка или проблема в этой области может привести к сбоям, таким как описанные в вопросе.
Основные причины подобных ошибок могут быть следующими:
-
DNS-проблемы: Устаревшие или медленные DNS-серверы могут медленно отвечать на запросы, что приводит к превышению времени ожидания.
-
Сетевые проблемы: Нестабильный интернет или локальные сетевые ограничения также могут вызывать задержки.
-
Конфигурация системы: Неправильные настройки сети на вашем устройстве, такие как использование внутреннего DNS-сервера, могут снижать скорость работы.
Пример (E): Анализ текущей ситуации
На основании предоставленной информации ясно, что изменение DNS на публичные серверы, такие как Google DNS (8.8.8.8), временно решает проблему. Это указывает на то, что ваш текущий DNS-сервер (вероятно, 127.0.0.53
, управляемый через dnsmasq
или NetworkManager) работает неэффективно или неправильно настроен.
Расположение данного DNS-сервера на 127.0.0.53
говорит о локальной обработке DNS-запросов, которая состоит в том, что ваш компьютер перенаправляет и обрабатывает DNS-запросы через локальный буферизующий сервер. Это иногда может быть причиной задержек, особенно если кэш серверов устарел или сбои в сетевой конфигурации.
Применение (A): Решение проблемы
Вот подробный план действий для устранения ошибки:
-
Проверка и обновление системы:
- Убедитесь, что ваше программное обеспечение (включая Docker и Ubuntu) актуально. Обновите Docker до последней стабильной версии. Старые версии могут содержать неполадки или иметь проблемы с совместимостью, которые были исправлены в более поздних обновлениях.
sudo apt update && sudo apt upgrade
- Убедитесь, что ваше программное обеспечение (включая Docker и Ubuntu) актуально. Обновите Docker до последней стабильной версии. Старые версии могут содержать неполадки или иметь проблемы с совместимостью, которые были исправлены в более поздних обновлениях.
-
Настройка DNS:
- Если вы временно используете Google DNS для решения проблемы, рассмотрите более постоянные изменения сетевых настроек:
- Отредактируйте NetworkManager для использования Google DNS напрямую:
- Откройте конфигурацию вашего сетевого подключения через NetworkManager.
- Найдите параметр DNS и измените его на
8.8.8.8
и8.8.4.4
. - Перезапустите NetworkManager:
sudo systemctl restart NetworkManager
- Это сохранит настройки DNS после перезагрузки системы.
-
Проверка производительности DNS:
- Используйте
dig
для проверки времени ответа различных DNS-серверов:dig @8.8.8.8 index.docker.io dig @1.1.1.1 index.docker.io
- Используйте
-
Изменение файла /etc/hosts (не рекомендуется для долгосрочного применения):
- Как временное решение, можно добавить конкретный IP-адрес хоста Docker в файл
/etc/hosts
для обеспечения прямого доступа. Однако это может привести к проблемам при изменении IP-адресов.52.207.42.240 index.docker.io
- Как временное решение, можно добавить конкретный IP-адрес хоста Docker в файл
-
Диагностика сети:
- Проверьте вашу сеть на наличие брандмауэра или других ограничений, которые могут блокировать или задерживать трафик Docker.
-
Отладка системы:
- Используйте
nmcli
для диагностики:nmcli dev show | grep DNS
- Используйте
Таким образом, разрешение проблемы с Docker Pull представляется в улучшении конфигурации DNS и настройке сетевых параметров. Вся предоставленная информация указывает на то, что проблема решаема с помощью оптимизации ваших текущих сетевых настроек и подтверждает, что сам Docker работает корректно.