Docker  彭东稳  1年前 (2016-12-27)  10709次浏览  已收录  0个评论

一、介绍Jenkins

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

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

上图就是我生产使用方式,其中Jenkins master使用docker的好处就是方便后面迁移,而Jenkins slave不适用docker的原因就是在docker中再次安装docker进行镜像构建太麻烦了,索性直接使用主机。而registry部分有两个节点,他们之间的数据使用DRBD同步,外借助于haproxy+keepalived实现registry的高可用。

下面先介绍Jenkins构建docker镜像,在使用Jenkins构建Docker镜像之前,最好先看一下Docker:使用Dockerfile构建Nginx镜像。更有助于理解。

二、安装Jenkins

1. 添加Jenkins的源(repository)

 
1
2
$ 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

2. 安装JDK

 
1
$ yum install java-1.8.0-openjdk -y
 
1
2
3
4
$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)

3. 安装Jenkins

 
1
$ yum install jenkins -y
 
1
2
$ rpm -qi jenkins | grep Version
Version     : 2.38

到此,Jenkins就安装完成了。然后就可以启动Jenkins。

 
1
$ systemctl start jenkins

Jenkins默认监控端口8080。

 
1
2
3
4
$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      22047/java

启动如果出现错误:”Starting Jenkins -bash: /usr/bin/Java: No such file or directory”,表示Jenkins找不到java。这时就需要编译配置文件/etc/init.d/jenkins,把java路径加上即可。

三、Jenkins文件说明

/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里。

 
1
2
3
$ 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”等都可以在这里配置。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ 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时需要解锁,把如下秘钥填写进去即可。

 
1
2
$ cat /var/lib/jenkins/secrets/initialAdminPassword
a737ebbbfece4e6991cf70d45a299ed5

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

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

然后创建一个项目为nginx。

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

就下面几个文件,主要是dockerfile,然后提供了一些nginx配置文件以及web文件。

 
1
2
3
4
5
-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仓库:

主要就是构建脚本了。

脚本内容

 
1
2
3
4
5
6
7
8
9
10
11
12
#!/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

配置结束后,保存。

五、配置jenkins用户

此时还不能立即构建,因为jenkins触发脚本并不是root用户,因此需要将jenkins免密码,并将用户加入到docker组。

 
1
2
3
$ cat /etc/sudoers.d/jenkins
Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD: ALL

第一行表示仅jenkins用户不需要控制终端,不然在Jenkins脚本中无法使用sudo。

 
1
$ usermod -G docker jenkins

六、开始构建镜像

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

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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主机看看镜像是否完成。

 
1
2
3
4
$ 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

可以看到已经构建完成了,下面直接启动此镜像。

 
1
$ docker run --name nginx -p 80:80 -d nginx_12272051
 
1
2
3
$ 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)

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

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

  1. Docker 结合Jenkins 构建持续集成环境

    Docker 结合Jenkins  构建持续集成环境 Jenkins : 一个开源的持续集成工具, 提供软件版本发布.自动测试等一系列流程及丰富的插件 Maven: 一个自动化构建工具, 通过一段描述 ...

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

    很早之前写过一篇jenkins集成docker的文章,使用的是CloudBees Docker Build and Publish plugin插件.这篇文章是直接使用shell脚本做的,主要是这次有 ...

  3. docker使用dockerfile 构建redis镜像

    FROM redis WORKDIR /data VOLUME /data EXPOSE RUN echo "success---------success" ENTRYPOINT ...

  4. docker多段构建nessus镜像

    1.构建基础镜像,主要做安装和获取注册号: FROM ubuntu:16.04 ADD Nessus-8.11.0-debian6_amd64.deb /tmp/Nessus-8.11.0-debia ...

  5. 方法1:使用Jenkins构建Docker镜像 --SpringCloud

    前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...

  6. 方法2:使用Jenkins构建Docker镜像 --SpringCloud

    前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...

  7. Docker从零构建php-nginx-alpine镜像

    虽然之前也曾用docker环境运行了一些项目,但对于镜像这块还不是很理解,且鉴于网上现成的镜像都包含太多用不到的库,所以决定从零开始构建一个自己的镜像. alpine linux为基础镜像 docke ...

  8. Docker 使用Dockerfile构建redis镜像

    Dockerfile实现: FROM centos: MAINTAINER hongdada "hongdaqi159505@gmail.com" WORKDIR /home RU ...

  9. Docker 使用Dockerfile构建tomcat镜像

    Dockerfile概念: 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题. ...

随机推荐

  1. CF 910 C. Minimum Sum

    链接 [http://codeforces.com/group/1EzrFFyOc0/contest/910/problem/C] 题意 给你n个字符串,每个字符串的字符是a~j,每个字符都可以是0~ ...

  2. 个人博客作业Week2(9月30日)

    一.是否需要有代码规范 1.这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 这些规范并不是一开始就有的,也不是由某个人规定的,代码规范是程序员们在不断地编程实践过 ...

  3. 团队作业M1反思

    经过这两个多月以来的软件工程的学习,还有团队项目的经历,总结反思如下: 首先,一个月的软件工程团队项目的进行让我对软件开发有了比较实际的认识,以前我们的编程多是个人编程,两人编程,程序难度低,代码量少 ...

  4. Scrum Meeting 9

                第九次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  5. OSG 改变窗口大小

    viewer.realize();//需要realize,否则窗口为null osgViewer::GraphicsWindow *pWnd = dynamic_cast<osgViewer:: ...

  6. 【Deep Hash】NINH

    [CVPR 2015] Simultaneous Feature Learning and Hash Coding with Deep Neural Networks [paper] Hanjiang ...

  7. linux 单引号,双引号,反引号的小总结。

    还是老惯例说说事情的起因,由于最开始对linux下面的各种引号并不是特别敏感,导致有一天我在添加数据库字段的时候出现的错误,当时出现错误的原因是我在最外层使用了单引号进行包裹,然后一句话里面需要转意的 ...

  8. Java代码redis基础操作

    maven依赖包: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...

  9. BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA

    给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义dept ...

  10. BZOJ2017[USACO 2009 Nov Silver 1.A Coin Game]——DP+博弈论

    题目描述 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 <= N <= 2,000)枚硬币的堆栈放在地上,从堆顶数起的第I枚硬币的 ...