1. 場景
請參考docker in docker 文章
2. DinD
我們將采用主機Docker守護程序作為外部守護程序,Docker守護程序作為內部守護程序在容器內運行。運行DinD的一個重要方面是處理Docker守護進程存儲的配置和管理。
3.Case 1: Pods and DooD
Kubectl create -f dood.yaml
apiVersion: v1 kind: Pod metadata: name: dood spec: containers: - name: docker-cmds image: docker:1.12.6 command: ['docker', 'run', '-p', '80:80', 'httpd:latest'] resources: requests: cpu: 10m memory: 256Mi volumeMounts: - mountPath: /var/run name: docker-sock volumes: - name: docker-sock hostPath: path: /var/run
Pod將創建一個將在Pod外部運行的容器。通過使用DooD運行容器,您會為生成的容器丟失以下內容:
- Pod Networking - 無法使用Pod IP訪問容器。
- Pod生命周期 - 在Pod終止時,此容器將繼續運行,尤其是在容器以
-d
flag 啟動時。 - Pod清理 - pod終止后不會清理圖形存儲。
- 調度和資源利用 - Pod請求的Cpu和內存僅用於Pod,而不是從Pod生成的容器。此外,生成的容器不會繼承對Pod設置的CPU和內存的限制。
4. Case 1: Pods and DinD
apiVersion: v1 kind: Pod metadata: name: dind spec: containers: - name: docker-cmds image: docker:1.12.6 command: ['docker', 'run', '-p', '80:80', 'httpd:latest'] resources: requests: cpu: 10m memory: 256Mi env: - name: DOCKER_HOST value: tcp://localhost:2375 - name: dind-daemon image: docker:1.12.6-dind resources: requests: cpu: 20m memory: 512Mi securityContext: privileged: true volumeMounts: - name: docker-graph-storage mountPath: /var/lib/docker volumes: - name: docker-graph-storage emptyDir: {}
5. 解決方案
我們在這里退一步吧。你真的想要Docker-in-Docker嗎?或者你只是希望能夠從CI系統運行Docker(特別是:構建,運行,有時推送容器和圖像),而這個CI系統本身就在容器中?
我敢打賭,大多數人都想要后者。您想要的只是一個解決方案,以便像Jenkins這樣的CI系統可以啟動容器。
最簡單的方法是將Docker套接字暴露給CI容器,方法是將其與-v
標志綁定。
簡單地說,當您啟動CI容器(Jenkins或其他)時,不要與Docker-in-Docker一起攻擊某些東西,而是啟動它:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
現在這個容器可以訪問Docker套接字,因此可以啟動容器。除了不啟動“子”容器,它將啟動“兄弟”容器。
嘗試使用docker
官方圖像(包含Docker二進制文件):
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-ti docker
這看起來像Docker-in-Docker,感覺就像Docker-in-Docker,但它不是Docker-in-Docker:當這個容器創建更多容器時,這些容器將在頂級Docker中創建。您將不會遇到嵌套副作用,並且將在多個調用之間共享構建緩存。
⚠️這篇文章的舊版本建議將docker
二進制文件從主機綁定到容器。這不再可靠,因為Docker Engine不再作為(幾乎)靜態庫分發。
如果您想使用Jenkins CI系統中的Docker,您有多種選擇:
- 使用基本映像的打包系統安裝Docker CLI(即如果您的映像基於Debian,請使用.deb包),
- 使用Docker API。
參考:https://www.jianshu.com/p/3b6c6c94b745
參考:http://dockone.io/article/2758
參考:https://applatix.com/case-docker-docker-kubernetes-part/
參考:https://container-solutions.com/running-docker-in-jenkins-in-docker/
參考:https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
參考:https://applatix.com/case-docker-docker-kubernetes-part-2/
參考:https://hub.docker.com/_/docker/
參考:https://github.com/jpetazzo/dind
參考:https://www.codercto.com/a/33822.html
參考:https://hub.docker.com/_/docker/?tab=description
參考:https://blog.csdn.net/xts_huangxin/article/details/51502878
參考:https://www.jianshu.com/p/43ffba076bc9