Jenkins 集成docker 插件,实现热spring项目部署
流程图
jenkins 全局配置
- jdk 配置(yum 安装)
- git 配置(yum 安装)
- maven 配置,需要自行下载解压
- docker 配置(yum安装)
- Jenkins 系统配置
- docker 服务配置(需要先开启docker外部访问端口)
- 开启docker外部访问端口
- vim /lib/systemd/system/docker.service
- 在 ExecStart 行增加 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 最终如下:
ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
--init-path=/usr/libexec/docker/docker-init-current \
--seccomp-profile=/etc/docker/seccomp.json \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY \
$REGISTRIES
修改后 重启docker:
1、重启守护进程
systemctl daemon-reload
2、重启docker
service docker restart
3、用浏览器访问验证
http://ip:2375/images/json
搭建Docker Registry (私有仓库,用于存储docker images)
docker pull registry
创建本地用于存放镜像的目录,然后映射到仓库的目录中
cd /usr
mkdir docker-registry
docker run -d -v /usr/docker-registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
vim /etc/docker/daemon.json
添加如下配置 { "insecure-registries" : ["10.10.10.224:5000"] }
重启docker使之生效
systemctl daemon-reload
systemctl restart docker
项目配置
-
jenkins 新建一个 maven 项目
-
配置项目构建历史保存设置(建议加上此配置,否则历史编译文件会占用服务器空间)
-
配置项目仓库地址,我采用了git账号密码的方式,当然也可以使用 ssh 方式拉取源码
-
项目编译设置
- 跳过测试环节 clean package -Dmaven.test.skip=true
- 跳过测试环节 clean package -Dmaven.test.skip=true
-
docker image编译,及push 配置
-
执行脚本如下:针对不同的项目只需要修改上部定义的三个变量加映射端口的配置
BUILD_ID=DONTKILLME
IMAGE_NAME=10.10.10.224:5000/docker.io/eureka
TAG=latest
CONTAINER_NAME=eureka
#判断是否存在已启动的容器,有则停止并删除
CONTAINER_ID=`sudo docker ps | grep ${CONTAINER_NAME} | awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then
sudo docker stop $CONTAINER_ID
sudo docker rm $CONTAINER_ID
else #如果容器启动时失败了,就需要docker ps -a才能找到那个容器
CONTAINER_ID=`sudo docker ps -a | grep ${CONTAINER_NAME} | awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then # 如果是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的
sudo docker rm $CONTAINER_ID
fi
fi
# 删除历史 image
IMAGE_ID=`sudo docker images | grep ${IMAGE_NAME} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
sudo docker rmi ${IMAGE_ID}
fi
echo "----------------pull docker.io/eureka:latest---------------------"
sudo docker pull ${IMAGE_NAME}:${TAG}
echo "----------------run docker.io/eureka:latest---------------------"
sudo docker run -d -p 8761:8761 --name ${CONTAINER_NAME} ${IMAGE_NAME}:${TAG}
- 附上项目的 Dockerfile 脚本 (JVM 参数可根据实际需求自行调整,我的配置只可参考)
FROM openjdk:8-jre-alpine
ENV LANG en_US.UTF-8
ENV JAVA_OPTS "-XX:InitialHeapSize=521m -XX:MaxHeapSize=521m -XX:NewSize=362m -XX:MaxNewSize=362m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10 -XX:ThreadStackSize=1m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/"
WORKDIR /app
RUN rm -rf /etc/localtime && ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/
ENV APP_NAME dg-eureka.jar
ENV APP_PATH target
# 将当前项目的jar包添加到容器中
ADD "$APP_PATH/$APP_NAME" "$APP_NAME"
EXPOSE 8761
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom -jar /app/$APP_NAME"]
至此,咱们的项目已经配置完成,可以正常的拉取、编译、docker build、push
然后通过ssh插件在其他服务器进行 docker pull,docker run 启动项目