使用Jenkins构建Docker镜像

Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时Jenkins能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。并且Jenkins提供了大量的插件,能够完成各种任务。

今天我需要使用Jenkins构建一个Docker镜像,然后自动push到docker registry中。到了docker registry中,后面测试人员就可以把镜像发布到测试环境,测试如果没有问题就可以发布到线上环境。

下面先介绍Jenkins构建docker镜像,在使用Jenkins构建Docker镜像之前,最好先看一下Docker:使用Dockerfile构建Nginx镜像 http://www.ywnds.com/?p=7611
安装Jenkins
添加Jenkins的源(repository)
sudo wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

安装JDK
yum install java-1.8.0-openjdk -y 或者tar包安装都一样
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

yum install jenkins -y
rpm -qi jenkins | grep Version
Version : 2.132
启动Jenkins
service jenkins start (start,stop,restart)
到此,Jenkins就安装完成了,然后就可以启动Jenkins。
Jenkins默认监控端口8080,查看Jenkins进程。

Jenkins文件说明
/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里。

ll /usr/lib/jenkins/
total 66980
-rw-r--r-- 1 root root 68586722 Dec 26 00:56 jenkins.war

ll /usr/lib/jenkins/
total 66980
-rw-r--r-- 1 root root 68586722 Dec 26 00:56 jenkins.war
/etc/sysconfig/jenkins:jenkins配置文件,其”端口”,”JENKINS_HOME”等都可以在这里配置。

grep -v "^#" /etc/sysconfig/jenkins | grep -v "^$"
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_ARGS=""

grep -v "^#" /etc/sysconfig/jenkins | grep -v "^$"
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_ARGS=""
/var/lib/jenkins/:默认的JENKINS_HOME。

ll /var/lib/jenkins/
total 32
-rw-r--r-- 1 jenkins jenkins 1575 Dec 27 20:09 config.xml
-rw-r--r-- 1 jenkins jenkins 159 Dec 27 20:09 hudson.model.UpdateCenter.xml
-rw------- 1 jenkins jenkins 1712 Dec 27 20:09 identity.key.enc
-rw-r--r-- 1 jenkins jenkins 4 Dec 27 20:09 jenkins.install.UpgradeWizard.state
drwxr-xr-x 2 jenkins jenkins 6 Dec 27 20:08 jobs
drwxr-xr-x 3 jenkins jenkins 18 Dec 27 20:09 logs
-rw-r--r-- 1 jenkins jenkins 907 Dec 27 20:09 nodeMonitors.xml
drwxr-xr-x 2 jenkins jenkins 6 Dec 27 20:09 nodes
drwxr-xr-x 2 jenkins jenkins 6 Dec 27 20:08 plugins
-rw-r--r-- 1 jenkins jenkins 129 Dec 27 20:08 queue.xml.bak
-rw-r--r-- 1 jenkins jenkins 64 Dec 27 20:08 secret.key
-rw-r--r-- 1 jenkins jenkins 0 Dec 27 20:08 secret.key.not-so-secret
drwx------ 4 jenkins jenkins 4096 Dec 27 20:09 secrets
drwxr-xr-x 2 jenkins jenkins 97 Dec 27 20:09 updates
drwxr-xr-x 2 jenkins jenkins 23 Dec 27 20:09 userContent
drwxr-xr-x 3 jenkins jenkins 18 Dec 27 20:09 users

ll /var/lib/jenkins/
total 32
-rw-r--r-- 1 jenkins jenkins 1575 Dec 27 20:09 config.xml
-rw-r--r-- 1 jenkins jenkins 159 Dec 27 20:09 hudson.model.UpdateCenter.xml
-rw------- 1 jenkins jenkins 1712 Dec 27 20:09 identity.key.enc
-rw-r--r-- 1 jenkins jenkins 4 Dec 27 20:09 jenkins.install.UpgradeWizard.state
drwxr-xr-x 2 jenkins jenkins 6 Dec 27 20:08 jobs
drwxr-xr-x 3 jenkins jenkins 18 Dec 27 20:09 logs
-rw-r--r-- 1 jenkins jenkins 907 Dec 27 20:09 nodeMonitors.xml
drwxr-xr-x 2 jenkins jenkins 6 Dec 27 20:09 nodes
drwxr-xr-x 2 jenkins jenkins 6 Dec 27 20:08 plugins
-rw-r--r-- 1 jenkins jenkins 129 Dec 27 20:08 queue.xml.bak
-rw-r--r-- 1 jenkins jenkins 64 Dec 27 20:08 secret.key
-rw-r--r-- 1 jenkins jenkins 0 Dec 27 20:08 secret.key.not-so-secret
drwx------ 4 jenkins jenkins 4096 Dec 27 20:09 secrets
drwxr-xr-x 2 jenkins jenkins 97 Dec 27 20:09 updates
drwxr-xr-x 2 jenkins jenkins 23 Dec 27 20:09 userContent
drwxr-xr-x 3 jenkins jenkins 18 Dec 27 20:09 users

/var/lib/jenkins/jobs/${project_name}/workspace/:Jenkins项目的工作空间,存储从Git或SVN下载的内容,${project_name}就是其项目名称。

/var/log/jenkins/jenkins.log Jenkins日志文件。

配置Jenkins构建镜像
如果没有特别配置端口,使用http://<ip address>:8080/登录Jenkins,并进行相关配置(插件安装、权限配置、View/Job创建等等)。

第一次登陆Jenkins时需要解锁,把如下秘钥填写进去即可。
cat /var/lib/jenkins/secrets/initialAdminPassword
a737ebbbfece4e6991cf70d45a299ed5

然后设置一下用户密码,就正式进入到了Jenkins配置界面。

首先,需要安装一些必要的插件SCM Sync Configuration Plugin ,(gitlab)GitHub plugin ,GIT plugin ,GIT client plugin,在系统管理->插件管理里面安装,安装结束后重启jenkins即可。

然后创建一个项目为nginx。

然后配置一下源码管理,Git地址:https://github.com/dongwenpeng/nginx

就下面几个文件,主要是dockerfile,然后提供了一些nginx配置文件以及web文件。
-rw-r--r-- 1 jenkins jenkins 744 Dec 27 20:22 default.conf
-rw-r--r-- 1 jenkins jenkins 338 Dec 27 20:22 dockerfile
-rw-r--r-- 1 jenkins jenkins 593 Dec 27 20:22 nginx.conf
drwxr-xr-x 3 jenkins jenkins 16 Dec 27 20:22 web
-rw-r--r-- 1 jenkins jenkins 644118 Dec 27 20:22 web.zip

如下配置,也可以使用你本地的Git仓库:

主要就是构建脚本了。

脚本内容
#!/bin/sh
#
DATE=date +%m%d%H%M
DIR="/var/lib/jenkins/jobs/nginx/workspace"

sudo /bin/docker build -t nginx_$DATE $DIR | tee $DIR/Docker_build_result.log

RESULT=$(cat $DIR/Docker_build_result.log | tail -n 1)

if [["$RESULT" != Successfully]];then
exit -1
fi

注意:这里说明几点,第一git没有的就安装 yum -y install git
/var/lib/jenkins/jobs/nginx/workspace这里的路径少了个workspace需要创建
chown -R jenkins:jenkins workspace/
之后要重启Jenkins。

配置jenkins用户
此时还不能立即构建,因为jenkins触发脚本并不是root用户,因此需要将jenkins免密码,并将用户加入到docker组。(这里docker 没有也要安装 http://blog.51cto.com/10158955/2125450
cat /etc/sudoers.d/jenkins
Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD: ALL
第一行表示仅jenkins用户不需要控制终端,不然在Jenkins脚本中无法使用sudo。
usermod -G docker jenkins
(创建docker组 groupadd docker )

开始构建镜像
在jenkins的build记录中可以看到输出,由于jenkins会自动把github上的文件给下载下来放在workspace目录中。因此,触发脚本后,直接开始构建nginx镜像。
Started by user admin
Building in workspace /var/lib/jenkins/jobs/nginx/workspace

git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
git config remote.origin.url https://github.com/dongwenpeng/nginx # timeout=10
Fetching upstream changes from https://github.com/dongwenpeng/nginx
git --version # timeout=10
git fetch --tags --progress https://github.com/dongwenpeng/nginx +refs/heads/:refs/remotes/origin/
git rev-parse refs/remotes/origin/master^{commit} # timeout=10
git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision c0148c6714be8a64710d87e2ebc3395573dfcb0f (refs/remotes/origin/master)
git config core.sparsecheckout # timeout=10
git checkout -f c0148c6714be8a64710d87e2ebc3395573dfcb0f
git rev-list c0148c6714be8a64710d87e2ebc3395573dfcb0f # timeout=10
[workspace] $ /bin/sh /tmp/hudson3618361245563383297.sh
Sending build context to Docker daemon 557.1 kB
Sending build context to Docker daemon 1.114 MB
Sending build context to Docker daemon 1.671 MB
Sending build context to Docker daemon 2.228 MB
Sending build context to Docker daemon 2.785 MB
Sending build context to Docker daemon 3.273 MB
Step 1 : FROM nginx
latest: Pulling from library/nginx
Digest: sha256:2a07a07e5bbf62e7b583cbb5257357c7e0ba1a8e9650e8fa76d999a60968530f
Status: Downloaded newer image for nginx:latest
---> 19146d5729dc
Step 2 : MAINTAINER dkey
---> Using cache
---> 715cd864289f
Step 3 : ENV RUN_USER nginx
---> Using cache
---> 919de987c861
Step 4 : ENV RUN_GROUP nginx
---> Using cache
---> 12bb383d0cdc
Step 5 : ENV DATA_DIR /data/web
---> Using cache
---> 69561736d70e
Step 6 : ENV LOG_DIR /data/log/nginx
---> Using cache
---> c9be367631c7
Step 7 : RUN mkdir /data/log/nginx -p
---> Using cache
---> 137c4decd554
Step 8 : RUN chown nginx.nginx -R /data/log/nginx
---> Using cache
---> 4262ffbc2a5c
Step 9 : ADD web /data/web
---> ac936a598dc4
Removing intermediate container 1efe9556276a
Step 10 : ADD nginx.conf /etc/nginx/nginx.conf
---> 2b6f7ab35d9f
Removing intermediate container 12b1066d8808
Step 11 : ADD default.conf /etc/nginx/conf.d/default.conf
---> 619fc14e58bf
Removing intermediate container 362067e9bbce
Step 12 : EXPOSE 80
---> Running in ace973e663f0
---> 7982205f27dd
Removing intermediate container ace973e663f0
Step 13 : ENTRYPOINT nginx -g "daemon off;"
---> Running in 892e45827ff4
---> 63375850b045
Removing intermediate container 892e45827ff4
Successfully built 63375850b045
Finished: SUCCESS

构建完成后,可以去Jenkins主机看看镜像是否完成。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_12272051 latest 63375850b045 58 minutes ago 182.7 MB
nginx latest 19146d5729dc 6 days ago 181.6 MB

可以看到已经构建完成了,下面直接启动此镜像。
docker run --name nginx -p 80:80 -d nginx_12272051

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6ca642a3574 nginx_12272051 "/bin/sh -c ‘nginx -g" 18 seconds ago Up 17 seconds 0.0.0.0:80->80/tcp, 443/tcp nginx

推送到远程仓库

现在使用Jenkins构建Docker镜像已经没有问题了,下面就可以把Jenkins构建完的镜像直接推送到远程的registry中。关于构建私有docker registry可以看Docker:搭建私有仓库(Registry 2.4)http://www.ywnds.com/?p=7411

当远程仓库搞定后,其实Jenkins这边做的并不是太多,只需要把构建脚本修改一下,在构建完成后直接推送到远程仓库就OK了。

原文地址:http://blog.51cto.com/10158955/2146748

时间: 2024-11-05 13:43:11

使用Jenkins构建Docker镜像的相关文章

jenkins构建docker镜像上传到harbor并发布到kubernetes

很早之前写过一篇jenkins集成docker的文章,使用的是CloudBees Docker Build and Publish plugin插件.这篇文章是直接使用shell脚本做的,主要是这次有一个需求是检测harbor仓库里面是否已经存在要构建的镜像,如果存在就放弃构建,如果不存在则构建镜像并上传到harbor仓库,我这里是通过请求harbor的api来检测的. 整个过程大致分为四个步骤,画了一个简单图: 1.在jenkins上构建一个自由风格的软件项目. 2.源码管理使用git. 这里

构建Docker镜像实战之构建Tomcat9.0镜像(RPM一键安装Java环境)

构建Docker镜像实战之构建Tomcat9.0镜像(RPM一键安装Java环境) tomcat是一个免费开源的轻量级web服务器,在中小型企和并发访问量不高的场合普遍使用,是开发和调试JSP程序的首选.下面使用Dockerfile文件的方式来创建带有tomcat服务的Dockerfile镜像.(注:这里的Java环境是使用rpm一键式安装的且小编创建的是tomcat9.0的镜像) 下面直接开始实验 关闭防火墙及SELinux systemctl stop firewalld.service s

使用Dockerfile为SpringBoot应用构建Docker镜像

使用Dockerfile为SpringBoot应用构建Docker镜像 原创: 梦想de星空 macrozheng 6月17日 上次写过一篇使用Maven插件构建Docker镜像 ,讲述了通过docker-maven-plugin来构建docker镜像的方式,此种方式需要依赖自建的Registry镜像仓库.本文将讲述另一种方式,使用Dockerfile来构建docker镜像,此种方式不需要依赖自建的镜像仓库,只需要应用的jar包和一个Dockerfile文件即可. Dockerfile常用指令

构建Docker镜像仓库的另一选择:Nexus3 - DockOne.io

我们知道,构建企业内部私有Docker镜像仓库有很多选择,比如可以采用原生的Docker Registry服务,也可以部署更加专业的工具,例如SUSE team的Portus (https://github.com/SUSE/Portus)或VMware出品的Harbor(https://github.com/vmware/harbor).我们也就曾对Harbor这样的产品做过较为详细的分析(http://mp.weixin.qq.com/s/oQoLgNgnfM8TQHnDDOOIog).然而

Jenkins构建Docker容器

一.流程 SVN-->Jenkins-->build image-->run container 二.步骤 1.安装Jenkins 官网下载Jenkins安装包(jenkins.war),部署到tomcat即可. 2.初始配置 初始化配置按照建议安装必要插件即可,maven的同学需安装Maven Integration plugin,此处不需要. 3.构建Docker配置 1)点击"新建"-->输入item name-->"构建一个自由风格的项目

使用dockerfile构建docker镜像

一,简单介绍 docker镜像构建方式有两种方式,第一种是启动基础容器之后,进入容器安装所需要的文件,配置,变量等,完成后使用docker commit提交成为一个新的镜像,第二种则是通过编写dockerfile文件,进行镜像制作,使用docker  build命令进行镜像的构建.第一种方式可以看到镜像的生成过程,但是不便于自动化:第二种方式则比较直观,可以结合devops实现自动打包发布,本文则介绍如何利用dockerfile实现docker镜像的制作. Dockerfile描述了组装镜像的步

构建Docker镜像实战

简介 Nginx是一款轻量级的Web服务器,Tomcat是一款免费开源的轻量级web服务器,在中小型企业和并发访问量不高的场合使用,是开发和调试JSP程序的首选.MSQL是当下最流行的关系型数据库,以上这些都可以使用Dockerfile文件的方式来创建其Docker镜像. 构建nginx镜像 下载基础镜像 # docker pull centos 建立工作目录 # mkdir /nginx # cd /nginx/ 创建并编写Dockerfile文件 # vim Dockerfile //一定是

构建Docker镜像实战案例

Dockerfile介绍 Dockerfile是由一组指令组成的文件,每条指令对应linux中一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像. Dockerfile大致结构:基础镜像信息.维护者信息.镜像操作指令.容器启动时执行指令.每行支持一条指令,每条指令可以携带多个参数,支持以 # 开头的注释. Dockerfile操作指令: FROM 镜像 : 指定新的镜像所基于的镜像MAINTAINER 名字 :说明新镜像的维护人RUN 命令 : 在所基于的镜像上执行命令,并

构建Docker镜像:nginx

Dockerfile介绍 Dockerfile是由一组指令组成的文件,每条指令对应linux中一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像.Dockerfile大致结构:基础镜像信息.维护者信息.镜像操作指令.容器启动时执行指令.每行支持一条指令,每条指令可以携带多个参数,支持以 # 开头的注释.Dockerfile操作指令: FROM 镜像 : 指定新的镜像所基于的镜像MAINTAINER 名字 :说明新镜像的维护人RUN 命令 : 在所基于的镜像上执行命令,并提交