Docker +Jenkins实现微服务容器化部署

初识Docker

刚开始接触Docker,是在从传统行业转为互联网公司,项目的部署以及中间件的部署,基本都在Docker容器上;最早的时候所有的服务都是在若干台机器上,基本也都是集群部署,没有进行容器的统一管理,说实话那时候除了对虚拟机还有点概念,对容器化真没有概念,最早部署项目在linux环境下,通过shell脚本对项目进行打包、启动、服务关停、每次上线需要对生产环境的war包进行替换,重新编译,在进行启动,不同环境还要需要针对不同环境进行打包,比较麻烦;

慢慢的后来用上了Jenkins,一键式打包部署,就方便了很多,但是不同环境也需要来回切换;Docker容器化解决了,多个环境下,从开发到部署所有环境下的依赖包都在一起,在任何环境下都是可以运行的,使整个项目构建流程变的非常省时、省力;

虚拟化和容器化

  • 虚拟化:典型VMware虚拟机,节省了硬件资源,一台服务器上可以运行多台虚拟机,最早做银行的项目就是用的这些技术;
  • 容器化:docker与其说是应用层的容器化部署,其根本也是物理层的容器化,方便运维对多个服务进行统一容器化处理,每个容器也相当于一个很小的CentOS服务;

说的比较简单通俗,按照自己的理解方式,语言上可能不是很官方;

Docker file

关于Docker file其实就是将docker命令封装到文件里面,在生成镜像的时候将分别执行Docker file的命令,将服务部署到容器上;

目前基于项目情况,堆内存分配1G;

bash 复制代码
FROM anapsix/alpine-java:8_server-jre_unlimited
ENV JAVA_OPTS="\
-server -Xmx1024m -Xms1024m -Xmn512m -Xloggc:./gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M \
"
EXPOSE 8402
ADD Lxlxxx.jar app.jar
ADD ./agent/ /opt/
ENTRYPOINT ["java", "-Xmx2048m",  "-javaagent:/opt/skywalking-agent.jar",  "-Djava.security.egd=file:/dev/./urandom", "-jar","-Duser.timezone=GMT+8", "app.jar"]

Jenkins构建(CI/CD)

这是Jenkins构建项目的shell脚本,主要也是构建web镜像,Docker集成Jenkins做持续集成、持续部署,包括可以在每次commit、push代码的时候自动触发 Jenkins,给运维部署项目提供了很大的便利;

bash 复制代码
if docker stop Lxlxxx; then
echo "Lxlxxx 容器已停止"
else
echo "Lxlxxx 容器未运行"
fi

cd /home/data/Lxlxxx/
chmod +x ./*

#停止已建的容器,防止容器名,端口冲突
if docker rm -f Lxlxxx; then
echo "容器已删除,即将生成新容器"
else
echo "容器不存在,直接生成容器"
fi


#删除镜像
if docker rmi /Lxlxxx; then
echo "镜像已删除,即将生成新镜像"
else
echo "镜像不存在,直接生成镜像"
fi


cd /home/data/Lxlxxx     #到项目根目录
docker build -t /Lxlxxx .   #根据dockerfile生成web镜像

docker run -d -p 8460:8460 -e "SPRING_PROFILES_ACTIVE=test"  --name Lxlxxx --log-opt max-size=512m --log-opt max-file=3 --restart=always -v /etc/localtime:/etc/localtime -v /data/sourceDir/:/data/sourceDir/ -v /root/agent/:/root/agent/ -e JAVA_OPTS='-Xmx2048m' -it  -m 1536M --memory-swap 0 --net=host/Lxlxxx   #运行镜像生成容器

sleep 5

#/bin/bash
# 传入容器名称
RESULT_DATA="${jenkins_url}/job/${JOB_NAME}/${BUILD_NUMBER}/console"


containerName=Lxlxxx
# 查看进程是否存在
exist=`docker inspect --format '{{.State.Running}}' ${containerName}`

if [ "${exist}" = "true" ]; then
		curl 'https://省略号' \
   -H 'Content-Type: application/json' \
   -d "
    {
      \"msgtype\": \"markdown\",
      \"markdown\": {
        \"content\": \"【测试环境】\n>构建项目<font color='green'>:【${JOB_NAME}】</font>\n>分支:(${branch})成功。\n>详情:<font color='comment'>[查看控制台](${RESULT_DATA})</font>\"
      }
    }"
    else
	curl '省略号' \
   -H 'Content-Type: application/json' \
   -d "
    {
      \"msgtype\": \"markdown\",
      \"markdown\": {
        \"content\": \"【测试环境】\n>项目<font color='red'>:【${JOB_NAME}】</font>\n>分支:(${branch})构建失败。\n>详情:<font color='comment'>请联系运维处理,[查看控制台](${RESULT_DATA})</font>\"
      }
    }"
   
	
fi

docker ps

Docker compose

compose 是docker的容器编排功能,通俗的来讲就是将服务编排到多容器Docker上,相当于docker的集群模式,通过配置docker-compose.yml来实现,通过编排来实现服务的统一部署,这样就可以将服务和中间件服务构成一个服务群;

yaml 复制代码
version: '3.8' //版本号
services:
  rabbitmq:    //服务名
      image: rabbitmq:3-management //镜像
      restart: always   //自动重启
      ports:
        - 15673:15672
  registry:
    image: spring-boot-cloud/registry
    ports:
      - "8761:8761"
  config:
    image: spring-boot-cloud/config
    ports:
      - "8888:8888"
  monitor:
    image: spring-boot-cloud/monitor
    ports:
      - "8040:8040"
  zipkin:
    image: spring-boot-cloud/zipkin
    ports:
      - "9411:9411"
  gateway:
    image: spring-boot-cloud/gateway
    ports:
      - "8060:8060"
  auth-service:
    image: spring-boot-cloud/auth-service
    ports:
      - "5000:5000"
  serviceA:
    image: spring-boot-cloud/serviceA
  serviceB:
    image: spring-boot-cloud/serviceB

总结

在如今k8s盛行的年代,可以完整的对分布式系统进行支撑,也可以用k8s对docker集群进行管理,k8s和docker的区别在于,docker是一个开源的容器引擎,而k8s是集应用部署、运维、集群、开发、测试、监控等一体的管理工具;

相关推荐
摇滚侠3 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友6 小时前
什么是断言?
前端·后端·安全
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
yannan201903137 小时前
Docker容器
运维·docker·容器
i学长的猫7 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
用户21411832636028 小时前
别再为 Claude 付费!Codex + 免费模型 + cc-switch,多场景 AI 编程全搞定
后端
茯苓gao8 小时前
Django网站开发记录(一)配置Mniconda,Python虚拟环境,配置Django
后端·python·django
小宁爱Python8 小时前
Windows Docker Desktop占用C盘空间过大解决办法集合
运维·docker·容器
Cherry Zack8 小时前
Django视图进阶:快捷函数、装饰器与请求响应
后端·python·django