docker in docker的使用場景

docker in docker的原理

真正的docker in docker的原理還是比較簡單的,可以參考wrapdocker源碼,其實就是掛載cgroup、tmpfs、securityfs、cgroup的SUBSYS、關掉不需要的文件描述符、最後啓動dockerd。wrapdocker源碼裏註釋寫得比較清楚。

場景 :

(1) 當宿主主機上跑動的幾個容器A,B,C是平等關係 ,且它們都需要或者可能需要向外暴露端口或者服務時,此時的場景,使用宿主主機已經有的docker服務足矣。

(2) 

如果在dockerA裏,有需要用到docker的命令,比如app B需要一個配套的docker應用與之配合,它只需要借用一下宿主主機的docker服務,再創建一個容器即可,其實這個容器掛在宿主主機上,也無所謂。只是將appB

與配套的docker應用看作一套完整的佈署在dockerA裏的環境即可。 比如 mycat.offline.bin在dockerA里布署 就很方便,會有很多的端口不會佔用宿主主機的端口,隱藏在dockerA內;而只暴露了一個redis docker在宿主主機的docker環境裏。 如下圖一;對應本文的“移花接木”法。

(3) 如下圖二。 如果類似 ics.bin這樣的應用,它需要在dockerA裏創建很多的docker容器環境 ,如果還採用(2)的模式,就與直接在宿主主機沒有區別了,佔有了主機的諸多端口及docker 環境(image,容器實例),污染了主機的環境,這個環境裏諸多的kafak redis等端口與服務 ,都不需要讓外界知道,只需要暴露必須的 8899 , 50000等即可,這樣就要用到真正的docker in docker ,即dind了。 

在容器內部使用宿主機的 docker(移花接木)

https://www.cnblogs.com/kirito-c/p/11357522.html

https://www.jianshu.com/p/43ffba076bc9

原理:

默認情況下,Docker守護進程會生成一個 socket(/var/run/docker.sock)文件來進行本地進程通信,因此只能在本地使用 docker 客戶端或者使用 Docker API 進行操作。
sock 文件是 UNIX 域套接字,它可以通過文件系統(而非網絡地址)進行尋址和訪問。

因此只要以數據卷的形式將 docker 客戶端和上述 socket 套接字掛載到容器內部,就能實現 "Docker in Docker",在容器內使用 docker 命令了

通過類似docker run -v /var/run/docker.sock:/var/run/docker.sock的命令將宿主機 docker.sock 文件掛載到容器, 並且直接掛載宿主機的/usr/bin/docker, 這樣容器內就不需安裝 Docker 程序。
當容器內使用docker命令時,實際上調用的是宿主機的docker daemon和docker命令。
也就是說,容器內實際並未運行 docker server,但是能夠通過宿主機執行docker任務,從而實現輕量級 docker in docker
需要特別說明的是,真正執行 docker 命令的是跑在宿主機上的 docker-engine(服務器),因此這並不是真正的 "Docker in Docker".


必須以 root 用戶啓動!(或者其他有權限讀寫 /var/run/docker.sock 的用戶)然後,在容器內就能正常使用 docker 命令,或者訪問宿主機的 docker api 了。

docker run -itd --name cent4 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -p 18080:8080 --user root centos:7

dind 模式

https://hub.docker.com/_/docker

而此模式下,試驗後發現宿主系統要是centos7比較好, centos8以上,好像有問題。 具體參考官網說明 

https://blog.csdn.net/networken/article/details/108218569

docker in docker的原理是掛載cgroup、tmpfs、securityfs、cgroup的SUBSYS、關掉不需要的文件描述符、最後啓動dockerd。

官方提供了2種類型的docker in docker鏡像

  • docker:latest 只包含docker客戶端
  • docker:dind 包含docker客戶端和docker引擎

 

參考文章:

https://blog.csdn.net/freewebsys/article/details/79756488

https://www.cnblogs.com/anliven/p/13551614.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章