点击上方
蓝字·关注我们
Docker in Docker(DinD) 是一种容器虚拟化嵌套技术,它允许用户在容器内部运行 Docker 容器,层层嵌套,从而实现更复杂的容器化操作和构建环境 。
背 景
Containerd的由来
方案说明
如上图,我们大致会执行以下步骤:
1. 运行Docker daemonset,将K8S Node的/var/run/docker-ci映射到容器的/var/run/docker目录
2. 将K8S Node的/var/run/docker-ci中的docker.sock和docker映射到Jenkins Slave中
操作步骤
apiVersion: apps/v1kind: DaemonSetmetadata:name: docker-ci # 因为是用来做docker镜像构建的,所以我把他命名为docker-cinamespace: default # 命名空间,我是放在default命名空间下,可以自行修改spec:selector:matchLabels:app: docker-citemplate:metadata:labels:app: docker-cispec:initContainers:- name: init-sysctlimage: busyboxcommand:- rm- '-f'- /var/run/docker.sock # 启动前,删除一下docker.sock,防止因异常原因退出留有残留文件,影响docker启动resources: {}volumeMounts:- name: hostmountPath: /var/run # 将宿主机卷挂载到init容器terminationMessagePath: /dev/termination-logterminationMessagePolicy: FileimagePullPolicy: AlwayssecurityContext:privileged: true # 赋予容器特权containers:- name: docker-ciimage: 'docker:20.10.24-dind' # Docker-in-Docker镜像command:- dockerd- --host=unix:///var/run/docker.sock- --host=tcp://0.0.0.0:8000securityContext:privileged: true # 赋予容器特权resources:limits:cpu: '2'memory: 4Girequests:cpu: 300mmemory: 500MivolumeMounts:- mountPath: /var/runname: host # 将宿主机卷挂载到主容器lifecycle:postStart: # 添加postStart钩子exec:command:- sh- -c- |if [ -e /var/run/docker/docker ]; thenrm -f /var/run/docker/dockerficp -a /usr/local/bin/docker /var/run/docker/volumes:- name: hosthostPath:path: /var/run/docker-ci # 创建一个目录,避免将/var/run的所有文件挂载到容器中
好了,接下来就是修改Jenkins的配置,我们在需要用到docker指令的容器配置模版加上docker二进制和docker.sock的映射即可,如
- name: "jnlp"image: "jenkins/jnlp-slave:3.27-1"args: "^${computer.jnlpmac} ^${computer.name}"resourceRequestCpu: "100m"resourceLimitCpu: "500m"resourceRequestMemory: "500Mi"resourceLimitMemory: "2048Mi"workspaceVolume:emptyDirWorkspaceVolume:memory: falsevolumes:- hostPathVolume:hostPath: "/var/run/docker-ci/docker.sock"mountPath: "/var/run/docker.sock"- hostPathVolume:hostPath: "/var/run/docker-ci/docker/docker"mountPath: "/usr/bin/docker"
完成上述步骤,就可以在发布流程中使用docker指令了。
总 结
虽然DinD可以完美解决我的难题,但是也存在弊端,如安全性问题、容器不稳定等,都是我们需要关注的,这期就分享到这里,谢谢!
本篇文章来源于微信公众号: SRE运维手记
