Когда мы пишем 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:latest
CMD обнаружения команд по умолчанию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.