devops学习-Jenkins容器实现 DooD 模式

Docker 将容器与宿主机隔离开来,虽然保证了一定的安全性,但与前些天发布的 Kata Containers 相比,基于 cgroup 和 namespace 的 Docker 还是存在恶意用户通过”逃离”容器来获取使用宿主机内核的权限和共享容器。

而 Kata 试图为每个容器或 pod 提供各自的轻量级虚拟机和微型内核,旨在提供容器的速度,又兼具虚拟机的安全性。借助专用的微型内核,提供了比搭载在同一个内核上的容器更有效地隔离内存、I/O 和网络等功能的机制。

由于 Docker 容器无法直接调用执行宿主机的命令,尽管并不推荐容器做这些事,但有时候为了方便(特别是测试环境),就需要采取某些手段将宿主机暴露给容器使用了。

比如在运用 Docker 搭建 Jenkins CI 平台的时候,要想让 Jenkins 能够执行宿主机的 Docker 命令,要么是将宿主机作为 Slave 节点添加进去,要么是将宿主机的 socket 文件暴露给它使用,显然第二种方式更加便捷高效。

那么接下来就使用 DooD 模式,来让 Jenkins 拥有执行宿主机 Docker 命令的能力吧。

要想实现容器使用 docker 命令有两种方式,区别在于环境是否与宿主隔离开来,它们分别是 DinD 和 DooD,另外通过配置端口使用HTTP通信最不安全,因此不做描述。

DinD:DinD 即 Docker-in-Docker ,是指在容器中安装一个完整的隔离的 Docker ,并在启动容器时添加 –privileged 参数获取完整的 Root 权限。然而这种方法无法共享宿主机 cache,相当于和主机独立开来。

DooD:DooD 即 Docker-outside-of-Docker ,在启动容器时通过 -v /var/run/docker.sock:/var/run/docker.sock 将 sock 文件映射到容器当中,当容器使用 docker 命令的时候,这些操作都将转移到宿主机中进行实际操作

Docker 可以快速的部署 Jenkins-Master 节点,但在容器中又让 Jenkins 无法自由的操纵宿主机系统。因此让 Jenkins 去调用宿主机执行 Docker 命令最适合不过

可以直接 FROM 官方的 Jenkins 镜像,在此基础上修改,但我喜欢从头再来,于是从 Github 克隆一份自己修改

git clone https://github.com/jenkinsci/docker.git

我修改好的文件在

https://github.com/erlonglong/k8s/tree/master/devops/jenkins/docker

 

我用的是Dockefile-centos 

这里需要注意一下,需要自己提前下载最新版本的jenkins.war 

wget http://mirrors.jenkins.io/war/latest/jenkins.war

docker build -t doudou007/jenkins-master:v5 -f Dockerfile-centos .

 

posted @ 2019-07-24 11:27  屌丝的IT  阅读(564)  评论(0)    收藏  举报