[英]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.