首頁  >  文章  >  運維  >  docker:latest和docker:dind有什麼差別

docker:latest和docker:dind有什麼差別

王林
王林轉載
2020-10-20 17:31:554611瀏覽

docker:latest和docker:dind有什麼差別

背景:

在編寫 CI 時透過宣告鏡像作為 job 的執行環境,每個 job 都在一個純淨的容器中執行。

有時,我們需要一個 docker 容器環境來執行 docker build、docker push 等操作。查看官方的 docker 映像,我們發現有兩個主要的版本:docker:latest、docker:dind 和 docker:git。

(推薦教學:docker教學

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有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除