Fellow Travellers

Docker+Jenkins实现自动化部署

于佳鑫
字数统计: 2.5k阅读时长: 11 min
2018/12/24 Share

1、使用dockerfile构建镜像

1.1 创建目录

1
mkdir -p ~/docker_jdk1.8/	# 创建一个存放dockerfile和jdk的地方

1.2 下载JDK8,将其copy到刚刚创建的目录中

1.3 创建dockerfile

#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

1.4 执行命令,构建镜像

1
docker build -t='jdk1.8' .	# 构建镜像,并给镜像起名为jdk1.8

1.5 查看刚刚创建的镜像

1
docker images

1.6 创建容器

1
docker run -it jdk1.8 /bin/bash

2、创建docker的私有仓库

2.1 拉取私有仓库的镜像

1
sudo docker pull registry

2.2 创建私有仓库容器

1
sudo docker run -di --name registry -p 5000:5000 registry

2.3 查看仓库

打开浏览器 输入地址http://10.211.55.7:5000/v2/_catalog看到 {“repositories”:[]} 表示私有仓库搭建成功并且内容为空

image-20181121174957109

3、上传镜像到仓库

3.1 修改本地(还有私有仓库)的docker的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
### linux

# 打开daemon.json
vi /etc/docker/daemon.json
# 在后面追加下面内容
{"insecure‐registries":["10.211.55.7:5000"]} # 私有仓库的地址


{
"registry-mirrors": ["https://l7s5cnt9.mirror.aliyuncs.com"],
"insecure-registries":["10.211.55.7:5000"]
}

mac版docker

image-20181121154309423

3.2 将本地镜像标记为私有仓库的镜像

1
docker tag jdk1.8 10.211.55.7:5000/jdk1.8

3.3 上传镜像

1
docker push 10.211.55.7:5000/jdk1.8

4、docker的maven插件

部署有两种方法:
(1)手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至JDK容器。
(2)通过Maven插件自动部署。

4.1 修改私服服务器上的配置文件

1
vi /lib/systemd/system/docker.service	# 其中ExecStart=后添加配置 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

image-20181121173141435

重启docker,重启私有仓库

1
sudo systemctl restart docker

4.2 在项目的pom.xml文件中添加下面的插件

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
<build>
<finalName>ly-config</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>10.211.55.7:5000/${project.artifactId}:${project.version}</imageName>
<baseImage>frolvlad/alpine-oraclejdk8:slim</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
<!--{ "insecure-registries":["myregistry.example.com:5000"] }-->
</resource>
</resources>
<dockerHost>http://10.211.55.7:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>

4.3 使用命令行,将项目打包成镜像,并上传到私有仓库上

1
mvn clean package docker:build -DpushImage

运行时抛出的异常:

1
[ERROR] No plugin found for prefix 'docker' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/Users/x5456/Documents/Maven/repository), central (https://repo.maven.apache.org/maven2)] -> [Help 1]

解决方案:

image-20181121160950355

1
2
3
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>

重新执行上面命令即可。

问题2:连接不上2375接口

1
2
sudo systemctl stop firewalld.service 	# 停止firewall
sudo systemctl disable firewalld.service # 禁止firewall开机启动

image-20181121221217367

4.4 问题?

配置文件要怎么修改,无论怎么整,还是需要我们去里面手动修改(一部分)配置文件。

5、更加简单的构建镜像

我们可以使用Jenkins是我们构建镜像更加简单,我们可以将代码上传到git上,他会自动帮我们生成镜像,并上传到私服中

5.1 Jenkins简介

​ Jenkins,原名Hudson,2011年改为现在的名字,它 是一个开源的实现持续集成的 软件工具。官方网站:http://jenkins-ci.org/。
​ Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图 表的形式形象地展示项目构建的趋势和稳定性。
特点:

  • 易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额 外的安装,更无需安装数据库;
  • 易配置:提供友好的GUI配置界面;
  • 变更支持:Jenkins能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并 输出到编译输出信息中;
  • 支持永久链接:用户是通过web来访问Jenkins的,而这些web页面的链接地址都是 永久链接地址,因此,你可以在各种文档中直接使用该链接;
  • 集成E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果(据 我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程 中,干别的事情);
  • JUnit/TestNG测试报告:也就是用以图表等形式提供详细的测试报表功能;
  • 支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成;
  • 文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使 用了哪个版本的jars文件等构建记录;
  • 支持第三方插件:使得 Jenkins 变得越来越强大

5.2 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 下载jenkins镜像
docker pull jenkins/jenkins:lts

## 运行镜像
docker run --name myjenkins -p 8888:8080 -p 50000:50000 --env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins/jenkins:lts

# Maven容器卷版
docker run -v /Users/x5456/Documents/Maven:/Maven --name myjenkins222 -p 8888:8080 -p 50000:50000 --env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins/jenkins:lts


## 访问127.0.0.1:8888,初始化会要求输入密码
### 进入容器
docker exec -it 1be705cb1e9f /bin/bash
### 查看密码
cat /var/jenkins_home/secrets/initialAdminPassword

5.3 简单使用

1、安装Maven和Git插件

image-20181122143543443

image-20181122143746773

5.3.2 配置工具

image-20181122144005680

image-20181122144440331

git采用默认,maven采用自动下载,之后点击save

image-20181122144521097

5.3.3 上传maven仓库到容器中

1
2
# 将maven仓库copy到容器中
docker cp repository/ 1be705cb1e9f:/var/jenkins_home/.m2

5.3.4 开干

image-20181122144916977

image-20181122153144795

image-20181122145222548

image-20181122154027834

image-20181122154225596

image-20181122154250365

附:

1
2
3
4
5
6
7
8
9
10
## 查看私服上的镜像
http://10.211.55.7:5000/v2/_catalog
## 查看私服上镜像的标签
http://10.211.55.7:5000/v2/镜像名/tags/list
## docker拉去私服上的镜像
docker pull 10.211.55.7:5000/ly-config:1.0-SNAPSHOT
## 运行镜像
docker run -di -p 12000:12000 10.211.55.7:5000/ly-config:1.0-SNAPSHOT
## 访问查看
http://127.0.0.1:12000/item-dev.yml

使用的坑,要把项目中所有的127.0.0.1改为运行镜像机器的ip

6、根据公司实际情况实现自动化部署(2018年12月18日续写)

理想状态架构图:

4742055-9aa2fb7db42e4652

6.1 在dgp-server-service|web的pom.xml下添加下面插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<plugins>
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>10.211.55.7:5000/${project.artifactId}:${project.version}</imageName>
<baseImage>tomcat</baseImage>
<cmd>["catalina.sh", "run"]</cmd>
<resources>
<resource>
<targetPath>/usr/local/tomcat/webapps/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.war</include>
</resource>
</resources>
<dockerHost>http://10.211.55.7:2375</dockerHost>
</configuration>
</plugin>
</plugins>

对应的dockerfile

1
2
3
FROM tomcat
ADD /usr/local/tomcat/webapps/dgp-server-service.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]

6.2 上传到gitlab上

http://elb-zentao-361931552.cn-northwest-1.elb.amazonaws.com.cn:5335/yujx/dgpJZ-server-root.git

6.3 登陆到Jenkins

6.3.1 安装gitlab插件

6.3.2 添加任务

连接到gitlab

制定构建的pom.xml文件

构建成功后,自动部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo '================开始啦================'
## 连接到服务器
ssh root@10.211.55.8 -tt << remotessh

## 关闭容器,删除容器,删除镜像
docker stop dgp-server-service-jz
docker rm dgp-server-service-jz
docker rmi 10.211.55.7:5000/dgp-server-service:1.0-SNAPSHOT

echo '================连上了================'
## 拉取刚刚生成的镜像
docker pull 10.211.55.7:5000/dgp-server-service:1.0-SNAPSHOT

echo '================拉下来了================'
## 运行镜像
docker run -d -p 8081:8080 --name dgp-server-service-jz 10.211.55.7:5000/dgp-server-service:1.0-SNAPSHOT

echo '================运行了================'
## 退出ssh
exit
remotessh

使用之前需要设置免密登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## (Ubuntu)服务器端设置
x5456@ubuntu:~$ sudo passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
## 设置root可以ssh:https://blog.csdn.net/wy_97/article/details/78294562
vi /etc/ssh/sshd_config
###########修改这部分#############
# Authentication:
LoginGraceTime 120
#PermitRootLogin prohibit-password
PermitRootLogin yes
StrictModes yes
################################

## 重启ssh服务
service ssh restart

## 进入jenkins容器
### 免密码登陆
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.211.55.8

## 之后,就可以 ssh root@10.211.55.8 登陆了

6.4 实现gitlab打tag时自动部署

下面这些没有测试成功,但大概找出了问题所在

  • 1。ip要是jenkins真正部署的地方的ip,感觉可以使用docker的–host来实现,但是我电脑是mac系统没办法测试。
  • 2。gitlab环境与我本地好像是不通的

这个ip要是Jenkins安装的那个环境(docker中)的ip

添加触发条件

出现的问题:

解决办法:参见博客 https://blog.csdn.net/xukangkang1hao/article/details/80756085

坑们:

1、web层打包失败的原因

1
2
3
4
5
6
7
8
9
<!-- web层打包失败的原因,为啥要引一个打war包的插件,maven不是自带吗 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration>
<!--<encoding>${project.build.sourceEncoding}</encoding>-->
</configuration>
</plugin>

2、服务器也需要配置3.1内个东西

问题:maven仓库中的更新问题?

附:

1
2
3
4
5
6
7
8
9
10
## 删除异常停止的docker容器
sudo docker rm `sudo docker ps -a | grep Exited | awk '{print $1}'`
## 删除名称或标签为none的镜像
sudo docker rmi -f `sudo docker images | grep '<none>' | awk '{print $3}'`


## 手动构建镜像的命令
sudo docker build -t dgp-server-web-jz .
## 运行容器
sudo docker run -d -p 8888:8080 dgp-server-web-jz

本部分参考博客:这个

CATALOG
  1. 1. 1、使用dockerfile构建镜像
    1. 1.1. 1.1 创建目录
    2. 1.2. 1.2 下载JDK8,将其copy到刚刚创建的目录中
    3. 1.3. 1.3 创建dockerfile
    4. 1.4. 1.4 执行命令,构建镜像
    5. 1.5. 1.5 查看刚刚创建的镜像
    6. 1.6. 1.6 创建容器
  2. 2. 2、创建docker的私有仓库
    1. 2.1. 2.1 拉取私有仓库的镜像
    2. 2.2. 2.2 创建私有仓库容器
    3. 2.3. 2.3 查看仓库
  3. 3. 3、上传镜像到仓库
    1. 3.1. 3.1 修改本地(还有私有仓库)的docker的配置文件
    2. 3.2. 3.2 将本地镜像标记为私有仓库的镜像
    3. 3.3. 3.3 上传镜像
  4. 4. 4、docker的maven插件
    1. 4.1. 4.1 修改私服服务器上的配置文件
    2. 4.2. 4.2 在项目的pom.xml文件中添加下面的插件
    3. 4.3. 4.3 使用命令行,将项目打包成镜像,并上传到私有仓库上
    4. 4.4. 4.4 问题?
  5. 5. 5、更加简单的构建镜像
    1. 5.1. 5.1 Jenkins简介
    2. 5.2. 5.2 安装
    3. 5.3. 5.3 简单使用
      1. 5.3.1. 1、安装Maven和Git插件
      2. 5.3.2. 5.3.2 配置工具
      3. 5.3.3. 5.3.3 上传maven仓库到容器中
      4. 5.3.4. 5.3.4 开干
  6. 6. 附:
    1. 6.0.1. 使用的坑,要把项目中所有的127.0.0.1改为运行镜像机器的ip
  • 7. 6、根据公司实际情况实现自动化部署(2018年12月18日续写)
    1. 7.1. 6.1 在dgp-server-service|web的pom.xml下添加下面插件
    2. 7.2. 6.2 上传到gitlab上
    3. 7.3. 6.3 登陆到Jenkins
      1. 7.3.1. 6.3.1 安装gitlab插件
      2. 7.3.2. 6.3.2 添加任务
  • 8. 6.4 实现gitlab打tag时自动部署
  • 9. 坑们:
    1. 9.1. 1、web层打包失败的原因
      1. 9.1.1. 2、服务器也需要配置3.1内个东西
  • 10. 问题:maven仓库中的更新问题?
  • 11. 附: