最近听到最多的词就是devops,能真正玩转devopo的个人觉得他真的是一个全能战士。现在很多公司都在推devops,devops到底是干啥的?我们也经常听到只言片语如:自动化运维,运维开发工程师,容器化虚拟化,敏捷开发,研发运营一体化等,觉得他们知流程管理,晓开发运维,悉技术框架总之很厉害得感觉。最近在学习devops容器化技术,下面以公司的项目为例记录下这几天学习docker在持续集成运用的过程。
一.持续集成方案图
二.服务器部署详情
在三台虚拟机上进行的,并在虚拟机上安装docker(yum install -y docker)
虚拟机 | 用途 | 搭建 |
centos7 192.168.137.3 | 私有docker镜像仓库 | 使用docker镜像搭建 |
centos7 192.168.137.4 | 应用服务器 | vmware虚拟机宿主机 |
centos7 192.168.137.5 | jenkins服务器 | 使用docker镜像搭建 |
三.服务器搭建
1.docker repository
通过docker pull repository下载仓库镜像
运行docker repository镜像:
docker run -d -p 5000:5000 --name myregistry -v /home/docker-registry:/var/lib/registry docker.io/registry
这里我将宿主机的/home/docker-registry映射到容器的/var/lib/registry,容器端口5000映射出来
2.jenkins
通过docker pull jenkins下载仓库镜像
运行jenkins镜像:
docker run -p 8080:8080 -v /usr/local/docker_volume/jenkins:/var/jenkins_home --name my_jenkins -d docker.io/jenkins
这里我将宿主机的/usr/local/docker_volume/jenkins映射到容器的/var/jenkins_home(容器中jenkins的目录,目的是方便以后迁移和手动安装jenkins工具),容器端口8080映 射出来
访问jenkins:http://192.168.137.5:8080
3.jenkins 配置环境
以公司spring boot项目为例配置maven和jdk
将maven和jdk1.8包放到宿主机目录/usr/local/docker_volume/jenkins,由于映射目录的原因容器/var/jenkins_home目录下也 会存在。
jdk和maven在jenkins全局工具配置如下:
setting中maven仓库地址也配置在映射目录下
/var/jenkins_home/.m2/repository
四.项目配置
1.构建配置
2.构建后操作配置
3.部署项目
这里是构建后的操作大致步骤就是通过docker.sh脚本进行如下操作:
a.生成新的项目docker镜像
b.停止并删除正在运行的项目容器
c.启动新版本的项目
d.push docker镜像版本到docker仓库
ssh server配置中的远程目录/home/docker目录下如下文件及文件夹
cortp-cortpweb-1.0.0.jar maven构建后的项目jar包
Dockerfile 用于构建镜像的dockerfile
docker.sh 处理脚本
jdk-8u152-linux-x64.tar.gz 镜像所需jdk
log 项目日志文件目录(将容器/log日志文件夹映射到这个目录下)
web 项目的静态资源目录(将其目录映射到容器目录中方便更新)
构建镜像的Dockerfile文件
#Dockerfile文件
FROM centos:latest #基础镜像
MAINTAINER modian([email protected])
ADD jdk-8u152-linux-x64.tar.gz /usr/local/jdk8 #配置容器jdk
ENV JAVA_HOME /usr/local/jdk8/jdk1.8.0_152
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH :$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin
#基础镜像同步当前日期
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ADD cortp-cortpweb-1.0.0.jar app.jar #拷贝项目jar包为app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar","--spring.profiles.active=sit"] #运行项目jar包
docker.sh脚本文件
#!/bin/bash
Build_id=$1 #构建id号
Container_name=spring-boot #容器名
Image_name=centos/$Container_name #镜像名
#build images
docker build . -t $Image_name:$Build_id #生成镜像
#delet container and run
docker ps -a | grep spring-boot #下面的if判断删除现有正在运行的容器
ret=$?
if [ $ret -eq 0 ];then
docker stop $Container_name
container_id=`docker ps -a | grep spring-boot | awk -F " " '{print $1}'`
docker rm $container_id
fi
docker run -itd -p 8081:8081 -v /home/docker/web:/usr/local/java/web -v /home/docker/log:/log --name $Container_name $Image_name:$Build_id
#push docke registry
docker push $Image_name #push 镜像到仓库
这里其实只是一个简单的持续化集成的小试验,真正持续化集成和交付还需要一个更有效且完整的方案,现在比较成熟的大公司用的vSphere虚拟化技术+docker容器化技术+容器编排工具等