本文共 4937 字,大约阅读时间需要 16 分钟。
开发人员提交代码到Git版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;Jenkins在Docker主机创建容器并发布。
角色 | IP |
---|---|
Git/Registry | 192.168.56.11 |
Docker | 192.168.56.12 |
Jenkins/Docker | 192.168.56.13 |
如果公司内部有直接克隆就可以
git clone git@192.168.0.31:/home/git/solo.git
部署传送门:
[root@linux-node1 ~]# vim /etc/sysconfig/docker# Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled --insecure-registry 192.168.56.11:5000'
yum install -y yum-utils device-mapper-persistent-data lvm2`
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce -y`
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io` #因为默认源会去国外获取数据,所以会慢可以超时,这是我们就需要配置加速器指向国内源https://www.daocloud.io/
# systemctl start docker# systemctl enable docker
JAVA程序必须有JDK环境才可以运行,为了减少镜像大小及提高性能,这里直接把JDK放到宿主机上,容器以挂载形式使用。
#rz 把tar包上传,解压后放到指定目录rz....... tar -zxvf jdk-8u60-linux-x64.tar.gzmv jdk1.8.0_60 /usr/local/jdk1.8
# cat DockerfileFROM centos:7#他的妈妈是谁MAINTAINER www.aliangedu.com#他的爸爸是谁ENV VERSION=8.5.33#tomcat版本ENV JAVA_HOME /usr/local/jdk#jdk 绝对路径RUN yum install wget -y#运行的命令RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \ tar zxf apache-tomcat-${VERSION}.tar.gz && \ mv apache-tomcat-${VERSION} /usr/local/tomcat && \ rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \ mkdir /usr/local/tomcat/webapps/ROOTEXPOSE 8080#程序使用的端口CMD /usr/local/tomcat/bin/catalina.sh run#执行tomcat目录下的启动脚本,这里面遇到坑,就是-v 将宿主机jdk目录挂在到容器/usr/local/jdk 时候,因为镜像按照dockerfile去打,那么在执行命令的时候就会找不到路径,所以我临时删除了,EXPOSE与CMD 2行,然后重新打包,使用 -p 指定端口,然后进入容器,手工启动tomcat的方式,进行
docker build -t 192.168.56.11:5000/tomcat-85:latest -f dockerfile . #最后这个点。代表当前路径,在制作镜像时,会记录上下文内容
root@node02 scripts]# docker push 192.168.56.11:5000/tomcat-85:latest
[root@node02 scripts]# docker run -it -d -p 8080:8080 -v /usr/local/jdk1.8:/usr/local/jdk 192.168.56.11:5000/tomcat-8:latest[root@3addff07c464 ROOT]# echo "123" >index.jsp
指定JDK、Maven路径,Git保持默认:
主页面 -> 系统管理 ->管理插件:
安装SSH与Git Parameter插件。插件说明:》SSH:用于SSH远程Docker主机执行Shell命令》Git Parameter:动态获取Git仓库Branch、Tag
3,配置SSH插件
第一步:先创建一个用于连接Docker主机的凭证 (有权限的用户)主页面 -> 凭据 -> 系统 -> 右击全局凭据 -> 添加凭据:输入连接Docker主机的用户名和密码:第二步:添加SSH远程主机主页面 -> 系统管理 -> 系统设置 -> SSH remote hosts:# git clone https://github.com/b3log/solo# cd solo移除旧的推送地址,添加新的:# git remote remove origin # git remote add origin git@gitlab.example.com:qqq/solo.git提交代码到Git仓库并创建tag:# touch src/main/webapp/a.html# git add .# git commit -m “a”创建标签:# git tag 1.0.0推送到Git服务器:# git push origin 1.0.0
登陆gitlab查看solo项目:
clean package -Dmaven.test.skip=ture利用pom.xml文件构建项目。在Jenkins本机镜像构建与推送到镜像仓库,并SSH远程连接到Docker主机使用推送的镜像创建容器:
REPOSITORY=192.168.56.11:5000/solo:${Tag}# 构建镜像cat > Dockerfile << EOFFROM 192.168.56.11:5000/tomcat-8:latestRUN rm -rf /usr/local/tomcat/webapps/ROOTCOPY target/*.war /usr/local/tomcat/webapps/ROOT.warCMD ["/usr/local/tomcat/bin/catalina.sh", "run"]EOFdocker build -t $REPOSITORY .# 上传镜像docker push $REPOSITORY
REPOSITORY=192.168.56.11:5000/solo:${Tag}# 部署sudo docker rm -f blog-solo |truesudo docker image rm $REPOSITORY |truesudo docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk -p 8080:8080 $REPOSITORY# -d 后台运行 ,-v 挂在目录,-p 映射端口,后面是镜像
注:容器名称blog-solo,暴露宿主机端口8080,即使用宿主机IP 192.168.56.12:8080 访问blog-solo项目。
blog-solo项目已配置完成,开始构建:点击左下角构建历史里,右击第一个查看控制台输出:
进入容器,切换到项目目录
vi WEB-INF/classes/latke.properties #### Server ##### Browser visit protocolserverScheme=http# Browser visit domain nameserverHost=192.168.56.12# Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!serverPort=8080
调整后,重启tomcat,再次验证,OK,结果如下:
至此,自动化CI环境搭建完成,你可以模拟提交代码并打tag测试自动化发布流程。
[root@node03 ~]# ll /var/run/docker.sock srw-rw---- 1 root docker 0 9月 4 21:55 /var/run/docker.sock
[root@node03 ~]# sudo groupadd docker ##groupadd:“docker”组已存在[root@node03 ~]# sudo gpasswd -a jenkins docker ##正在将用户“jenkins”加入到“docker”组中[root@node03 ~]# sudo service docker restart##重启服务[root@node03 ~]# newgrp - docker##重新加载group 组信息,一定要输入这条命令,否则无法加载最新组内容,因为有缓存
转载于:https://blog.51cto.com/qiuyt/2163950