Когда мы пишем 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.