背景:
在編寫 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:latest和docker:dind有什麼區別的詳細內容,更多請關注TW511.COM其它相關文章!