zoukankan      html  css  js  c++  java
  • (一)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

  • 相关阅读:
    程序员的自我修养(序)-量子
    我的IT生活-量子
    量子地图
    再出发
    新的一年快开始了,学点新东西吧,从React开始(一)
    ECMAScript 6 Features 中文版
    必须清零
    彩印网的第一阶段即将收官
    终于感觉掌握了一门重要的技术
    程序员的命运之轮
  • 原文地址:https://www.cnblogs.com/shix0909/p/11119055.html
Copyright © 2011-2022 走看看