Разница между образами docker:latest и docker:dind

Docker

Когда мы пишем CI, мы объявляем образ средой выполнения задания, и каждое задание выполняется в чистом контейнере. Иногда нам нуженdockerсреда контейнера для выполненияdocker build,docker pushи так далее. ПроверятьОфициальный образ докера, мы обнаружили, что есть две основные версии:docker:latest,docker:dindа такжеdocker:git.

docker:dind

Этот образ содержит клиент Docker (инструмент командной строки) и демон Docker.

пройти черезdocker history docker:dindкоманда, которую мы находимdocker:dindвdocker:latestКроме того, установлен демон Docker и две последние команды сборки:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
66dc2d45749a        8 weeks ago         /bin/sh -c #(nop)  CMD []                       0B                  
<missing>           8 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["dockerd-entr…   0B                  
...

существуетrunКогда это зеркало используется, его нельзя указатьshпараметры CMD,dockerd-entrypoint.shКоманда получает этот параметр и не запускает демон Docker. Для правильного запуска демона Docker в контейнере и входа в контейнер требуется пошаговый процесс:

$ docker run -d --name dind --privileged docker:dind # 启动容器
$ docker logs -f dind # 查看启动日志
$ docker exec -it dind sh # 进入容器

запускатьdocker:dindконтейнер, параметр--privilegedЕго необходимо добавить, иначе демон Docker при запуске сообщит об ошибке.

docker:latest

Этот образ содержит только клиент Docker и должен поддерживаться демоном Docker.docker:dindДа, вы также можете смонтировать хост/var/run/docker.sock.

Зеркало не нужно запускать--privilegedпараметр.

пройти черезdocker history docker:latestCMD обнаружения команд по умолчаниюsh:

81f5749c9058        3 months ago        /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           3 months ago        /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B                  
...

Способ запуска 1: смонтировать файл sock хоста

$ docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock docker:latest

Способ запуска 2: сотрудничать с docker:dind

будетdocker:dindа такжеdocker:latestв ту же сеть и указатьdindКонтейнер имеет псевдоним в этой сети какdocker,так какlatestпо умолчанию в контейнереdaemon hostпросто позвониdocker.

Также обратите вниманиеСертификатПроблема в том, что новой версии клиента Docker и демону Docker требуется сертификат TLS для обеспечения безопасности связи.docker:dindКонтейнер сгенерирует сертификат для переменной средыDOCKER_TLS_CERTDIRУказанный каталог, сертификат необходимо смонтировать и предоставитьdocker:latestиспользование контейнера.

$ docker run --privileged --name some-docker -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 run --rm --network some-network \
    -e DOCKER_TLS_CERTDIR=/certs \
    -v some-docker-certs-client:/certs/client:ro \
    docker:latest

docker:git

docker:gitВключеноgitкомандаdocker:latest, что удобно для использования Git для CI.

Ссылка на ссылку