(一)Docker-in-Docker on Kubernetes


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終止時,此容器將繼續運行,尤其是在容器以-dflag 啟動時
  • 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM