Вопрос или проблема
Тип проблемы
— ошибка
При попытке загрузить контейнеры Docker я столкнулся с этой ошибкой:
Используется тег по умолчанию: latest
Ошибка ответа от демона: Получить https://registry-1.docker.io/v2/: net/http: запрос отменен во время ожидания соединения (время ожидания клиента превышено при ожидании заголовков)
## Версия ОС
Ubuntu 18.04 (bionic)
## Версия Docker
Клиент:
Версия: 18.09.4
Версия API: 1.39
Версия Go: go1.10.8
Git commit: d14af54266
Собрано: Ср Мар 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
Собрано: Ср Мар 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: true
Драйвер логирования: json-file
Драйвер Cgroup: cgroupfs
Плагины:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: неактивен
РUNTIME: runc
Стандартный RUNTIME: runc
Инициализационный бинарник: docker-init
Версия контейнера: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
Версия runc: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
Версия инициализации: fec3683
Параметры безопасности:
apparmor
seccomp
Профиль: по умолчанию
Версия ядра: 4.15.0-1035-oem
Операционная система: Ubuntu 18.04.2 LTS
OSType: linux
Архитектура: x86_64
ЦП: 12
Общая память: 31.05GiB
Имя: ###(удалено)###
ID: ###(удалено)###
Корневая папка Docker: /var/lib/docker
Режим отладки (клиент): false
Режим отладки (сервер): false
Регистры: https://index.docker.io/v1/
Метки:
Экспериментальный: false
Ненадежные реестры:
127.0.0.0/8
Живое восстановление включено: false
Лицензия продукта: Community Engine
ПРЕДУПРЕЖДЕНИЕ: Поддержка ограничения подкачки отсутствует
Вывод команды dig index.docker.io
с использованием 127.0.0.53 (по умолчанию в resolv.conf)
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> index.docker.io
;; глобальные опции: +cmd
;; Получен ответ:
;; ->>HEADER<<- opcode: QUERY, статус: NOERROR, id: 57173
;; флаги: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; 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
;; РАЗМЕР MSG получен: 212
Вывод команды dig index.docker.io
с использованием 8.8.8.8
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> index.docker.io
;; глобальные опции: +cmd
;; Получен ответ:
;; ->>HEADER<<- opcode: QUERY, статус: NOERROR, id: 37695
;; флаги: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; 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
;; РАЗМЕР MSG получен: 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, статус: NOERROR, id: 28068
;; флаги: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; 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
;; РАЗМЕР MSG получен: 214
Если вы не хотите менять DNS, вы все равно можете добавить один из указанных выше адресов в свой /etc/hosts
, это не будет сброшено при перезагрузке. Конечно, это помешает вам использовать другие сервера в кластере, и конкретный адрес, который вы выберете, может стать недействительным.
Если ваш стандартный DNS в resolv.conf
— 127.0.0.something, то ваша система, вероятно, настроена на использование управляемого NetworkManager dnsmasq
: DNS-запросы обрабатываются службой на вашей системе, которая пересылает их на различные DNS “под капотом”. Вы можете выяснить фактический используемый DNS (DNS настраивается для каждого сетевого интерфейса), используя:
nmcli dev show | grep DNS
А затем продолжить поиск медленного/недействительного DNS оттуда.
Ответ или решение
Ошибка при выполнении команды docker pull
: "request canceled while waiting for connection"
Введение
В рамках этой статьи мы детально разберем ошибку, возникающую при попытке загрузки контейнеров Docker, а именно сообщение:
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Клиент использует систему Ubuntu 18.04 и Docker версии 18.09.4. Данная проблема может возникать по ряду причин, связанных с сетевыми настройками, настройками DNS, а также возможными проблемами в работе самого Docker.
Анализ проблемы
-
Сетевые настройки и DNS
- Вы упомянули, что вы не используете прокси или VPN, что исключает одни из наиболее распространенных причин проблемы.
- Путем выполнения команды
dig index.docker.io
вы обнаружили, что DNS-сервер, используемый по умолчанию (127.0.0.53
), ведет к более длительному времени отклика по сравнению с DNS-сервером Google (8.8.8.8
). Это может указывать на проблемы с локальным DNS-кешированием или с самим DNS-сервером, активируемым NetworkManager.
-
Тестирование DNS
- Разница в ответах
dig
с использованием разных DNS-серверов подтверждает, что решение вашей проблемы связано с неправильной конфигурацией DNS. В этом случае использование DNS Google (8.8.8.8) обеспечивает более быстрое и надёжное разрешение имени хоста.
- Разница в ответах
-
Настройка DNS в системе
- Изменения в
/etc/resolv.conf
, в том числе добавлениеnameserver 8.8.8.8
, как временное решение, могут привести к возвращению старых настроек при перезагрузке или изменении конфигурации сети. Это связано с тем, что файл управляется NetworkManager или другими демонами, такими какsystemd-resolved
.
- Изменения в
Решения
1. Настройка DNS с помощью NetworkManager
Чтобы изменить настройки DNS, которые управляются NetworkManager, выполните следующие шаги:
- Откройте конфигурацию вашего сетевого подключения:
nm-connection-editor
- Выберите ваше подключение и перейдите на вкладку "IPv4".
- В поле "DNS-серверы" укажите
8.8.8.8
. - Сохраните изменения и перезагрузите подключение.
2. Использование /etc/hosts
Если вы хотите использовать статическое разрешение для index.docker.io
, вы можете добавить одну из IP-адресов, полученных с помощью команды dig
, в файл /etc/hosts
. Это, однако, не рекомендуется для общих сценариев, поскольку IP-адреса могут изменяться:
52.207.42.240 index.docker.io
3. Устранение проблем с dnsmasq
Если вы используете dnsmasq
, вам следует убедиться, что он корректно настроен. Проверьте, какие DNS-серверы он использует и попробуйте отключить dnsmasq
, чтобы временно проверить, решит ли это проблему:
sudo systemctl stop dnsmasq
После этого ещё раз попробуйте выполнить команду docker pull
.
Заключение
Ошибка при загрузке Docker-контейнеров "request canceled while waiting for connection" может быть вызвана множеством факторов, наиболее распространённым из которых является неправильная конфигурация DNS. Перепроверяя настройки и переключая DNS-серверы, вы можете значительно улучшить производительность и стабильность подключения к Docker Hub. Попробуйте предложенные решения, чтобы устранить возникшую проблему. Если вы продолжаете сталкиваться с трудностями, возможно, стоит рассмотреть возможность более детального изучения сетевых конфигураций или обращения к вашему интернет-провайдеру за дополнительной поддержкой.