[英]GitLab Docker-in-Docker: how does Docker client in job container discover Docker daemon in `dind` service container?
我有一个正在 GKE 上运行的 GitLab CI/CD 管道。
管道中的一项作业使用 Docker-in-Docker 服务容器,以便 Docker 命令可以在作业容器内运行:
my_job:
image: docker:20.10.7
services:
- docker:dind
script:
- docker login -u $USER -p $PASSWORD $REGISTRY
- docker pull ${REGISTRY}:$TAG
# ...more Docker commands
一切正常,但我想知道为什么。 my_job
容器中的 Docker 客户端如何知道它需要与运行在 Docker-in-Docker 服务容器内的 Docker 守护进程通信,它又如何知道该守护进程的主机和端口?
真的没有“发现”过程。 必须通过配置(例如DOCKER_HOST
)告知 docker 客户端有关守护程序主机的信息。 否则,客户端将采用默认配置:
DOCKER_HOST
配置,则使用它。 否则:unix:///var/run/docker.sock
),则使用默认套接字。tcp://docker:2375
tcp://docker:2376
您可以在docker
dockerfile 入口点中明确看到此逻辑。
docker 客户端可以配置多种方式,但 GitLab CI 和官方docker
映像中最常见的方式是通过DOCKER_HOST
环境变量。 如果您在 YAML 中没有看到此变量,它可能被设置为项目或组设置,或者可能在运行器配置中设置,或者依赖于上述默认行为。
根据您的运行器配置( config.toml
),您的工作也有可能根本没有使用docker:dind
服务守护程序。 例如,如果您的跑步者有一个将 docker 套接字( /var/run/docker.sock
)安装到作业容器中并且没有DOCKER_HOST
(或等效)配置的volumes
规范,那么您的作业可能甚至没有使用该服务,因为它将使用已安装的套接字(根据上面的配置逻辑)。 您可以在您的工作中运行docker info
,以确保这种方式或其他方式。
附加参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.