Вопрос или проблема
Запуск этой команды завершается неудачей:
docker run --privileged --rm docker:dind docker run hello-world
Сообщение об ошибке:
docker: ошибка при подключении: Head "http://docker:2375/_ping": dial tcp: lookup docker on 8.8.8.8:53: такой хост не найден.
Однако это выполняется успешно:
docker run --privileged --rm -d --name test docker:dind
docker exec -it test sh
> docker run hello-world
Несколько вопросов:
- В чем причина этой ошибки?
- Как это исправить? Либо напрямую, либо обернув в другой образ docker (что работает).
Спасибо!
Ответ или решение
Запуск DinD без exec: решение проблемы
Запуск команды Docker-in-Docker (DinD) может быть сложным, особенно если вы сталкиваетесь с проблемами при взаимодействии контейнеров. В данной ситуации, возникает ошибка, когда вы пытаетесь выполнить следующую команду:
docker run --privileged --rm docker:dind docker run hello-world
Ошибка и причина
Ошибка, которую вы получаете:
docker: error during connect: Head "http://docker:2375/_ping": dial tcp: lookup docker on 8.8.8.8:53: no such host.
говорит о том, что контейнер DinD (Docker-in-Docker) не может подключиться к своему внутреннему Docker API по адресу http://docker:2375
. Это происходит по нескольким причинам:
-
Отсутствие DNS-имени: Контейнер запускается с именем
docker
, и он ожидает, что Docker Daemon будет доступен по этому имени. Однако с текущей командой контейнер не может разрешить имяdocker
, поскольку он работает в изолированной среде. -
Неверные параметры при запуске: Вы пытаетесь запустить команду внутри контейнера DinD непосредственно, что приводит к тому, что он не инициализирует свои собственные демоны и сети должным образом.
Как исправить ошибку
Существует несколько способов обхода данной проблемы. Вы можете выбрать один из следующих методов:
1. Использование docker exec
Как вы уже заметили, команда с docker exec
работает корректно:
docker run --privileged --rm -d --name test docker:dind
docker exec -it test sh
> docker run hello-world
Этот метод позволяет сначала запустить контейнер DinD в фоновом режиме, а затем выполнить команду внутри него, что дает доступ к внутреннему Docker Daemon.
2. Запуск DinD с настроенным API
Если вы хотите запустить DinD без использования docker exec
, вам нужно будет настроить Docker Daemon внутри контейнера так, чтобы он слушал на 0.0.0.0:2375
, а не на docker:2375
. Для этого вы можете использовать следующий подход:
docker run --privileged --rm -p 2375:2375 docker:dind --host=tcp://0.0.0.0:2375
Затем вы можете запустить:
docker run -e DOCKER_HOST=tcp://<host_ip>:2375 hello-world
Здесь <host_ip>
— это IP-адрес вашего хоста.
Примечание
Запуск Docker Daemon без шифрования и аутентификации может создать серьезные проблемы с безопасностью. Убедитесь, что у вас есть меры защиты, такие как VPN или ограничение доступа по IP.
Заключение
Сложности, возникающие при запуске Docker-in-Docker, часто связаны с сетью и конфигурацией сервисов. Использование docker exec
является простым и эффективным способом избежать этих проблем. Если же требуется запуск без exec
, настройте Docker Daemon для работы с соответствующими параметрами для доступа внешних приложений. Не забывайте уделять внимание безопасности, особенно при работе с открытыми Docker API.