




















在 Gitlab Pipeline 里我们经常要将代码打包为 docker image 并推送到镜像仓库,而为了完成 docker push 动作需要定义 service: ['docker:dind'],不然 docker push 无法成功
典型的流水线例子如下:
yaml
stages:
- create-image
build-image-job:
stage: create-image
image: docker
services:
- docker:dind
script:
- echo $CI_REGISTRY_PASSWORD | docker Login -U $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
- docker build -t $$CI_REGISTRY_IMAGE/myapp:1.2-
- docker push $$CI_REGISTRY_IMAGE/myapp:1.2-
- docker images为什么非得定义 services 呢?
这里先从Docker的 C/S 架构讲起
Docker 采用典型的 C/S(客户端/服务器)架构
aiignore
┌─────────────────┐ REST API ┌─────────────────────────────┐
│ Docker 客户端 │<─────────────────── │ Docker 服务器 │
│ (docker CLI) │ HTTP/UNIX Socket │ (Docker Daemon) │
└─────────────────┘ │ ┌─────────────────────┐ │
│ │ Containers │ │
│ │ Images │ │
│ │ Networks │ │
│ │ Volumes │ │
│ └─────────────────────┘ │
└─────────────────────────────┘示例:运行容器:
docker run nginx
│
├─► 1. CLI 解析命令
│
├─► 2. 发送 API 请求到 daemon
│
├─► 3. Daemon 检查本地是否有镜像
│
├─► 4. 如无镜像则从仓库拉取
│
├─► 5. 创建并启动容器
│
└─► 6. 返回容器 ID 给客户端bash
# 指定 Docker daemon 地址
DOCKER_HOST=tcp://remote-host:2375
# 指定 TLS 设置
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/path/to/certs本地开发:
远程管理:
# 通过 TCP 连接远程 daemon
docker -H tcp://remote:2375 ps打开 https://hub.docker.com/_/docker 仔细阅读
发现 docker镜像 docker:28, docker:dind, docker:28-dind 是等价的
而 docker:cli, docker:28-cli 也是等价的,只不过 tag 不一样
进一步查看他们的 Dockerfile: docker:dind 和 docker:cli 直接扔给 Gemini 帮忙分析对比,对于 Docker28 版本的 Dockerfile 得出以下结论:
docker:cli:
docker:dind:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。