DooD:Docker+Jenkins

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DooD:Docker+Jenkins相关的知识,希望对你有一定的参考价值。

参考技术A 第一次发布博客。希望可以给需要的朋友们一些帮助。

本文基于64位的CentOS 7.2系统,内核版本如下:

Docker版本如下:

如需安装Docker,请点击: 安装Docker

如需安装Docker加速器,请点击: 配置Docker加速器

其实就是运行一个Jenkins镜像的docker容器,这种方式使用socket套接字(一般默认是/var/run/docker.sock文件)和宿主机进行交互,只限于本地通信。不会去监听任何端口。在创建Jenkins镜像时,可以给jenkins用户赋予sudo权限来调用docker命令;或者将jenkins用户加入到docker组,就可以直接在容器中调用docker命令,下文会分别讲到两种情况的Dockerfile的写法。不过相比较于不同的宿主机docker组的不同,使用sudo更具有普适性和可移植性。

顾名思义,就是在Docker容器中重新安装一个Docker应用。容器中安装Docker和宿主机安装的Docker是完全没有关联的两个程序。一般情况下,我们想要的只是一个运行于docker的CI/CD环境,我们需要容器内外只有一个docker engine。 DinD显然比我们想要的要复杂的多,而且可能还有一些意想不到的问题会出现。

更详细的了解,请参考下面两篇文章:

https://zhuanlan.zhihu.com/p/27208085

https://github.com/jpetazzo/dind

Docker还可以对外暴露Remote API,通过http/https就可以与docker engine进行通信,因为打开Remote API相应的要对外暴露端口,所以相对来说是不安全的。

在Jenkins容器中可以通过配置相应的Docker plugin,并在“系统管理”——>“系统设置”——>“云”中增添响应的Remote API信息。

详细信息请参考:

https://docs.docker.com/engine/security/https/

进过对比,我使用的是第一种方式:DooD。

注意点:请确保宿主机的doeker server已经开启本地套接字访问和远程通信

默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker API进行操作。

如果想在其他主机上操作Docker主机,就需要让Docker守护进程监听一个端口,这样才能实现远程通信。

目前开启本地套接字访问和远程通信有以下两种方式:

把以下内容添加进json文件中,注意添加前请确认2375端口是否被占用!!!

如下图所示:

以上两种方式都可以通过下面的方式验证 docker remote API的2375端口是否开启

netstat -apn | grep 2375

在本地宿主机上新建一个Jenkins镜像数据的挂载目录,进行Jenkins数据的备份和持久化;因为Jenkins镜像中的Dockerfile中/var/jenkins_home权限为1000:1000,所以此处我们需要修改宿主机上的挂载目录权限,否则会出现权限不足的问题。注意:如果在生产中这样使用,一开始需要给/var/jenkins分配一个合理的容量,否则随着jenkins构建的增多会出现空间不足等问题。如下图:

第一种:在docker容器中,jenkins用户使用sudo执行docker命令

第二种:在docker容器中,jenkins用户可直接使用docker命令

我选用的是第二种,但是因为所在宿主机的不同,docker_gid会有所差异,建议使用第一种方式。

在上一步构建好的Dockerfile所在目录,执行下面的命令构建Jenkins镜像

使用上一步构建好的镜像,启动Jenkins容器,命令如下

使用如下命令查看安装密码,也可直接去看容器里边对应位置的文件(/var/jenkins_home/secrets/initialAdminPassword),或者去宿主机挂载的目录下查看文件(/var/jenkins//secrets/initialAdminPassword)

5.1 docker-client版本问题

Q1:搭建的jenkins容器出现下列错误,在容器中无法正常运行docker命令,可能是docker client的版本问题。

我当时出现问题的版本如下:

A1:该问题,有两种解决办法:第一,卸载重新安装合适的版本,上图这个版本是我使用yum install 安装的版本;第二种,只需安装docker-client。

Docker官网: https://www.docker.com/

Docker社区: https://forums.docker.com/

DaoCloud: https://www.daocloud.io/

DockOne: http://dockone.io/

Jenkins Base Dockerfile Github: https://github.com/jenkinsci/docker/blob/master/Dockerfile

https://zhuanlan.zhihu.com/p/27208085

https://www.cnblogs.com/leolztang/p/6934694.html

https://blog.csdn.net/xinluke/article/details/52267995

https://www.cnblogs.com/leolztang/p/6934694.html

Jenkins系列之——前言 Jenkins初识

Jenkins系列之——第一章 Jenkins下载及安装
Jenkins系列之——第二章 Jenkins中Maven和JDK配置
Jenkins系列之——第三章 Jenkins编译的第一个项目
Jenkins系列之——第四章 Jenkins编译一个Web项目并远程发布到Tomcat
Jenkins系列之——第五章 Jenkins编译一个Spring Boot项目并通过SSH推送到远程

前言 Jenkins是什么?

Jenkins 是一个可扩展的持续集成引擎。

主要用于:

  • l 持续、自动地构建/测试软件项目。
  • l 监控一些定时执行的任务。

Jenkins拥有的特性包括:

  • l 易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。
  • l 易于配置-所有配置都是通过其提供的web界面实现。
  • l 集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
  • l 生成JUnit/TestNG测试报告。
  • l 分布式构建支持Jenkins能够让多台计算机一起构建/测试。
  • l 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
  • l 插件支持:支持扩展插件,你可以开发适合自己团队使用的工具。

1 Jenkins的由来

目前持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:

  • l 软件构建自动化 :配置完成后,CI系统会依照预先制定的时间表,或者针对某一特定事件,对目标软件进行构建。
  • l 构建可持续的自动化检查 :CI系统能持续地获取新增或修改后签入的源代码,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI系统会不断确认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在检查彼此相互依存的代码中变化情况需要花费的时间和精力(说直接一点也是钱啊,呵呵)。
  • l 构建可持续的自动化测试 :构建检查的扩展部分,构建后执行预先制定的一套测试规则,完成后触发通知(Email,RSS等等)给相关的当事人。
  • l 生成后后续过程的自动化 :当自动化检查和测试成功完成,软件构建的周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。这样,构件才能更迅速地提供给用户使用。

部署一个CI系统需要的最低要求是,一个可获取的源代码的仓库,一个包含构建脚本的项目。

下图概括了CI系统的基本结构

 

该系统的各个组成部分是按如下顺序来发挥作用的:

1. 开发者检入代码到源代码仓库。

2. CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。

3. CI系统会在对应的工作区内执行构建过程。

4. (配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。

5. (配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像Java.net、 SourceForge之类的网站。

6. CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件。

Jenkins是这么一个CI系统。之前叫做Hudson

以下是使用Jenkins一些理由:

  • l 是所有CI产品中在安装和配置上最简单的。
  • l 基于Web访问,用户界面非常友好、直观和灵活,在许多情况下,还提供了AJAX的即时反馈。
  • l Jenkins是基于Java开发的(如果你是一个Java开发人员,这是非常有用的),但它不仅限于构建基于Java的软件。
  • l Jenkins拥有大量的插件。这些插件极大的扩展了Jenkins的功能;它们都是开源的,而且它们可以直接通过web界面来进行安装与管理。

1.1 Jenkins的目标

Jenkins的主要目标是监控软件开发流程,快速显示问题。所以能保证开发人员以及相关人员省时省力提高开发效率。

CI系统在整个开发过程中的主要作用是控制:当系统在代码存储库中探测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么CI系统将通知相关人员,然后继续监视存储库。它的角色看起来是被动的;但它确能快速反映问题。

特别是它具有以下优点:

  • l Jenkins一切配置都可以在web界面上完成。有些配置如MAVEN_HOME和Email,只需要配置一次,所有的项目就都能用。当然也可以通过修改XML进行配置。
  • l 支持Maven的模块(Module),Jenkins对Maven做了优化,因此它能自动识别Module,每个Module可以配置成一个job。相当灵活。
  • l 测试报告聚合,所有模块的测试报告都被聚合在一起,结果一目了然,使用其他CI,这几乎是件不可能完成的任务。
  • l 构件指纹(artifact fingerprint),每次build的结果构件都被很好的自动管理,无需任何配置就可以方便的浏览下载。

以上是关于DooD:Docker+Jenkins的主要内容,如果未能解决你的问题,请参考以下文章