Запуск DinD без exec

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

Запуск этой команды завершается неудачей:

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

Несколько вопросов:

  1. В чем причина этой ошибки?
  2. Как это исправить? Либо напрямую, либо обернув в другой образ 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. Это происходит по нескольким причинам:

  1. Отсутствие DNS-имени: Контейнер запускается с именем docker, и он ожидает, что Docker Daemon будет доступен по этому имени. Однако с текущей командой контейнер не может разрешить имя docker, поскольку он работает в изолированной среде.

  2. Неверные параметры при запуске: Вы пытаетесь запустить команду внутри контейнера 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.

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

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