docker:latest 和 docker:dind 镜像区别

在CI流程中,常使用docker:dind启动Docker守护进程以执行dockerbuild和dockerpush等操作。docker:latest仅包含客户端,可挂载宿主机的docker.sock或与dind配合使用。docker:git则添加了git命令,便于CI中的版本控制。启动dind容器需要--privileged参数,且要注意TLS证书的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在编写 CI 时通过声明镜像作为 job 的执行环境,每个 job 都在一个纯净的容器中执行。有时,我们需要一个 docker 容器环境来执行 docker build、docker push 等操作。查看官方的 docker 镜像,我们发现存在两个主要的版本:docker:latest、docker:dind 和 docker:git。

docker:dind

该镜像包含 Docker 客户端(命令行工具)和 Docker daemon。
通过 docker history docker:dind 命令我们发现 docker:dind 是在 docker:latest 基础上又安装了 Docker daemon,并且最后两个构建命令为:

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 参数。
通过 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:dind 和 docker:latest 放入相同网络,并且指定 dind 容器在该网络中的别名为 docker,因为 latest 容器中默认设定的 daemon host 就叫 docker。

另外需要注意 证书 问题,新版本 Docker 客户端与 Docker daemon 通讯需要 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,方便 CI 时使用 Git。

参考链接

Docker Hub - docker

### Docker 运行时出现 'command not found' 的解决方案 当遇到 `docker: command not found` 错误时,通常是因为系统的环境变量未正确配置或者 Docker 服务未正常启动。以下是可能的原因以及对应的解决办法: #### 可能原因一:Docker 路径未加入到 PATH 环境变量中 如果 Docker 已经成功安装,但路径未被添加到系统的 PATH 环境变量中,则会触发此错误。可以通过手动验证 Docker 是否存在来确认。 ```bash which docker ``` 如果没有返回任何结果,则说明 Docker 不在当前的 PATH 中。可以尝试通过绝对路径调用 Docker 来测试其是否存在并可用。 ```bash /usr/bin/docker --version ``` 如果上述命令能够正常工作,则需要将 `/usr/bin/` 添加到用户的 PATH 环境变量中[^1]。 编辑 `.bashrc` 或者 `.zshrc` 文件,在文件末尾追加以下内容: ```bash export PATH=$PATH:/usr/bin/ ``` 保存后重新加载配置文件: ```bash source ~/.bashrc ``` #### 可能原因二:权限不足导致无法访问 Docker 命令 某些情况下,即使 Docker 正常安装,也可能因为权限问题而无法直接运行。这通常是由于用户不在 `docker` 组中引起的。 检查当前用户是否属于 `docker` 用户组: ```bash groups ``` 如果输出不包含 `docker`,则需要将当前用户添加到该组中: ```bash sudo usermod -aG docker $USER ``` 完成后注销并重新登录以使更改生效。再次尝试运行 Docker 命令以确认问题是否已解决[^4]。 #### 可能原因三:Docker 服务未启动 即便 Docker 成功安装,但如果服务未启动也会引发类似的错误消息。此时应检查 Docker 服务的状态: ```bash systemctl status docker ``` 如果状态显示为 inactive,则需启动 Docker 服务: ```bash sudo systemctl start docker ``` 为了确保每次开机自动启用 Docker 服务,还可以设置自启功能: ```bash sudo systemctl enable docker ``` #### 可能原因四:GitLab CI/CD 配置中的依赖缺失 对于 GitLab CI/CD 场景下发生的 `docker: command not found` 报错,可能是构建环境中缺少必要的工具链支持。例如,Runner 所使用的镜像并未预装 Docker[^3]。 修改 `.gitlab-ci.yml` 文件,指定一个带有 Docker 支持的基础镜像,比如官方推荐的 `docker:latest` 或其他兼容版本: ```yaml image: docker:latest services: - docker:dind before_script: - apk add --no-cache python3 py-pip - pip install docker-compose ``` 注意此处还引入了 `docker:dind`(Docker-in-Docker),用于提供嵌套容器的支持。 --- ### 总结 以上列举了几种常见场景及其对应处理方式。具体操作取决于实际部署环境与需求。务必逐一排查直至找到根本原因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值