在(Docker里的)Jenkins里运行Docker

简介: 本文讲的是在(Docker里的)Jenkins里运行Docker,【编者的话】在Docker中使用Docker有两种方式,区别在于环境是否与宿主隔离开来。本文以在Jenkins中使用Docker为例,说明如何通过加载宿主Docker socket和程序达成重用宿主镜像的目的。
本文讲的是在(Docker里的)Jenkins里运行Docker 【编者的话】在Docker中使用Docker有两种方式,区别在于环境是否与宿主隔离开来。本文以在Jenkins中使用Docker为例,说明如何通过加载宿主Docker socket和程序达成重用宿主镜像的目的。文章最后还讨论了这一方式面临的安全问题,务必在实际使用时加以考虑。

在本文中,我们将快速了解一下如何在一个容器里装载Docker sock以便创建其“兄弟”容器。我的一个同事称之为DooD(Docker-outside-of-Docker),以区别于DinD(Docker-in-Docker),后者是在容器中安装一个完整的隔离的Docker版本。DooD比DinD简单得多(至少在配置方面),尤其是能重用并缓存宿主上的镜像。反之,如果你想实现镜像对宿主的隐藏和隔离,则最好使用DinD。

为说明DooD的工作方式,我们将在一个Jenkins容器内使用DooD,从而能在Jenkins任务中创建并测试容器。我们希望使用Jenkins用户来创建这些容器,因此会比使用root用户稍微麻烦些。这有点很像Pini Reznik在“ 使用Docker、Mesos实现持续交付 ”中描述的技术,不过我们将使用 sudo 来避免Pini面临的将用户加入Docker组的问题。

我们使用官方Jenkins镜像作为基础,剩下的事情就很简单了。

创建一个包容以下内容的Dockerfile:

FROM jenkins:1.596

USER root
RUN apt-get update \
  && apt-get install -y sudo \
  && rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers

USER jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

我们需要赋予jenkins用户sudo权限以便能在容器内运行Docker命令。当然,也可以将jenkins用户加入到Docker组中来避免在所有Docker命令前使用‘sudo’,不过由于这个组gid的不同会造成不可移植(如Pini文中所述)。

最后两行用于处理 plugins.txt 文件中定义的插件。如果你不需要任何插件可以忽略这两行,不过我推荐至少包括如下内容:
$ cat plugins.txt
scm-api:latest
git-client:latest
git:latest
greenballs:latest

如果不想安装任何插件,可创建个空文件或将相关指令从Dockerfile中删除。本文并不需要上述插件。

现在来构建并运行容器,将Docker socket和程序映射进来。
$ docker build -t myjenk .
...
Successfully built 471fc0d22bff
$ docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -p 8080:8080 myjenk

现在你就有一个运行在 http://localhost:8080 的Docker实例可以用来运行Docker命令了。可通过如下步骤快速测试一下:
  • 在浏览器中打开Jenkins首页,并点击“创建一个新任务”链接。
  • 输入项目名称(比如“docker-test”),选择“构建一个自由风格的软件项目”并点击OK。
  • 在配置页面,点击“增加构建步骤”并选择“Execute shell”。
  • 在命令框里输入“sudo docker run hello-world”。
  • 点击“保存”。
  • 点击“立即构建”。

运气好的话,应出现一个绿(或蓝)球。点击这个球,并选择“Console Output”,你将看到类似如下内容:

jenkins3-1024x640.png

好极了!我们已经在Jenkins容器内成功运行了Docker命令。请注意,这里存在一个重大的安全问题:Jenkins用户对宿主具有root权限,比如Jenkins可以创建装载宿主任意目录的容器。因此,务必确保这个容器只对受信用户访问,并考虑使用VM来将Jekins与宿主其他部分隔离开。

还有其他的方式,主要是 Docker in Docker(DinD) 以及 使用HTTPS与Docker后台程序通讯 。DinD并不比使用特权模式的容器安全性高,不过确实能避免使用sudo。DinD最主要的劣势是你无法重用宿主缓存的镜像(不过如果需要为测试容器提供一个与宿主隔离的干净环境,这将很有用)。通过HTTPS暴露socket不需要sudo并且可以使用宿主的镜像,但因为打开了端口增加了攻击面,可以说是最不安全的。

我将在未来的文章中深入说明如何安全地设置HTTPS socket上的Docker。

原文链接:Running Docker in Jenkins (in Docker)(翻译:梁晓勇 审校:魏小红)

原文发布时间为:2015-06-11
本文作者:sean 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:在(Docker里的)Jenkins里运行Docker
目录
相关文章
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
1月前
|
Oracle 关系型数据库 数据库
|
1月前
|
Java Shell Docker
Docker启动后怎样运行jar包文件
Docker启动后怎样运行jar包文件
|
14天前
|
jenkins 测试技术 持续交付
软件测试|docker搭建Jenkins+Python+allure自动化测试环境
通过以上步骤,你可以在Docker中搭建起Jenkins自动化测试环境,实现Python测试的自动化执行和Allure报告生成。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
35 6
|
17天前
|
人工智能 Oracle jenkins
【Jenkins】新手安装、运行Jenkins(详细教学)
【Jenkins】新手安装、运行Jenkins(详细教学)
|
19天前
|
Linux Docker 容器
Linux彻底卸载Docker包括运行拉取的镜像
Linux彻底卸载Docker包括运行拉取的镜像
22 1
|
24天前
|
jenkins Java 持续交付
Docker搭建持续集成平台Jenkins最简教程
Jenkins 是一个广泛使用的开源持续集成工具,它能够自动化构建、测试和部署软件项目。在本文中,我们将使用 Docker 搭建一个基于 Jenkins 的持续集成平台。
108 2
|
26天前
|
Java 关系型数据库 数据库
Seata常见问题之docker运行报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
98 0
|
26天前
|
Nacos 数据库 Docker
nacos常见问题之docker部署的seata,成功注册到nacos运行报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
36 2
|
1月前
|
JavaScript Java jenkins
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
79 0