docker:latest 和 docker:dind 镜像区别

咱们在编写 CI 时经过声明镜像做为 job 的执行环境,每一个 job 都在一个纯净的容器中执行。有时,咱们须要一个 docker 容器环境来执行 docker builddocker push 等操做。查看官方的 docker 镜像,咱们发现存在两个主要的版本:docker:latestdocker:dinddocker:gitgit

docker:dind

该镜像包含 Docker 客户端(命令行工具)和 Docker daemon。docker

经过 docker history docker:dind 命令咱们发现 docker:dind 是在 docker:latest 基础上又安装了 Docker daemon,而且最后两个构建命令为:shell

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 daemon。想要正确启动容器里的 Docker daemon 而且进入容器须要分步进行:安全

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

启动 docker:dind 容器时,参数 --privileged 必须加上,不然 Docker daemon 启动时会报错。网络

docker:latest

该镜像只包含 Docker 客户端,须要有 Docker daemon 支持,能够使用 docker:dind 的,也能够挂载宿主机的 /var/run/docker.sock工具

该镜像启动不须要 --privileged 参数。ui

经过 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                  
...

启动方式一:挂载宿主机 sock 文件

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

启动方式二:配合 docker:dind

docker:dinddocker:latest 放入相同网络,而且指定 dind 容器在该网络中的别名为 docker,由于 latest 容器中默认设定的 daemon host 就叫 docker日志

另外须要注意 证书 问题,新版本 Docker 客户端与 Docker daemon 通信须要 TLS 证书保证通信安全,docker:dind 容器会生成证书到环境变量 DOCKER_TLS_CERTDIR 指定的目录,需将证书挂载并提供给 docker:latest 容器使用。code

$ 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,方便 CI 时使用 Git。

参考连接

相关文章
相关标签/搜索