Почему настроенный контейнер docker не может подключиться к демону Docker по протоколу tcp:// docker:2375?

#docker #docker-in-docker

#docker #docker-in-docker

Вопрос:

Для целей CI / CD мне нужен docker в docker:

 docker network create some-network
docker volume create some-docker-certs-ca
docker volume create some-docker-certs-client
docker run --privileged --name some-dind -d --network some-network --network-alias docker -e DOCKER_TLS_CERTDIR=/certs -v some-docker-certs-ca:/certs/ca -v some-docker-certs-client:/certs/client docker:dind
 

Теперь, если я запущу docker: последнее изображение с -it опцией, я могу использовать docker в контейнере, как и ожидалось:

 docker run --rm -it --network some-network -e DOCKER_TLS_CERTDIR=/certs -v some-docker-certs-client:/certs/client:ro docker:latest sh

/ # docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
/ # 
 

Но мне нужно настроить docker: последнее изображение в Dockerfile:

 FROM docker:latest 

# install package1
# install package2
# install package3
  ...
# install package4
 

И создайте настроенный образ docker:

 docker build -t customized-docker .
 

Но когда я запускаю образ customized-docker с -it параметрами, он не может подключиться к демону docker:

 docker run --rm -it --network some-network -e DOCKER_TLS_CERTDIR=/certs -v some-docker-certs-client:/certs/client:ro customized-docker:latest sh

/ # docker ps
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
/ # 
 

В чем проблема? Могу ли я каким-либо образом использовать настроенный образ docker?

Редактировать: я нашел лучший способ сделать свой CI / CD без «docker в docker». Как упоминал Дэвид Мейз, в большинстве случаев нет необходимости использовать «docker в docker». Но мой вопрос все еще остается: почему контейнер docker: latest может подключаться к демону docker, но настроенный контейнер docker не может.

Комментарии:

1. docker:latest и docker:dind отличаются. Но использование DinD для вашей системы CI обычно не рекомендуется ; стандартная практика — вместо этого использовать сокет Docker хоста.

2. @DavidMaze Спасибо! Я знаю, что они разные! Но вы правы. Я нашел лучший способ без использования «docker в docker».

3. … вы пытаетесь использовать настроенный образ в качестве контейнерного демона Docker или просто для docker клиента командной строки, вызывающего другой контейнер DinD? Я думаю, что, возможно, я был сбит с толку, читая, как вы пытались использовать пользовательский образ.

4. Ваш пользовательский образ сбрасывается ENTRYPOINT ? Или USER ? В стандартном образе есть скрипт точки входа, который пытается выяснить, с чем он разговаривает; то, что вы видите ошибку для незашифрованного порта 2375, предполагает, что он не находит ваши сертификаты.

5. @DavidMaze На самом деле я не меняю ни одного из них. Я просто устанавливаю некоторые пакеты.