使用jenkins+docker-compose实现springboot与vue3项目自动化部署

发布于:2025-06-26 ⋅ 阅读:(14) ⋅ 点赞:(0)

前言

前面使用Jenkins+docker+shell脚本可以方便的实现单体应用部署,但如果是微服务架构,工程包较多,若是为每一个服务都建一个Jenkins job 会变得很繁琐,这个时候就需要用到docker-compose 容器编排工具,它可以只需一行命令就能帮我们完成多个服务的构建、推送、重启。

考虑到如果有多个服务需要部署到多台服务器,如果每台服务器都采用发送jar包再构建镜像的方式会产生许多重复工作,因此这种情况应该使用jenkins构建镜像->推送到私库->服务器拉取->docker-compose启动 如此流程来完成部署。

准备工作

需要安装如下软件:

  1. Jenkins (包括git/svn、publish over ssh 这个插件,jenkins安装教程很多此处不再赘述)

  2. docker

  3. Node JS (可选,仅部署前端vue项目时需要安装)

  4. docker compose

准备工作指路:

jenkins: Download and deploy 直接启动war包或者使用docker安装

docker: Install Docker Desktop on Linux

Node Js:Node.js

docker compose: GitHub - docker/compose: Define and run multi-container applications with Docker

或者直接使用curl下载安装,以CentOs为例执行如下代码:

1、下载docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2、增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

3、添加软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4、确认版本
$ docker-compose --version

sudo curl \
    -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

安装docker私库

为了使服务一次打包多次部署,需要安装docker私库来保存镜像

首先建好映射目录的文件夹:

mkdir /data/registry

执行docker命令启动私库镜像:

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest 

添加docker配置:

注意:如果是通过内网访问就配内网IP否则 配公网IP

vi /etc/docker/daemon.json
添加如下:

"insecure-registries": ["192.168.2.200:5000"]

如果需要设置账号密码:

docker run --rm --entrypoint htpasswd  httpd:2 -Bbn yourUserName yourPwd >> ./auth/htpasswd  

一般在内网环境部署私库,拉取推送也是全程内网,所以可装可不装

默认私库无法删除镜像,执行如下命令添加配置:

sudo docker exec -it registry /bin/sh
cd /etc/docker/registry
vi config.yml
加入
  delete:                                                                                                                                                                          
    # To allow image delete                                                                                                                                                        
    enabled: true 

SpringBoot项目自动部署

编写 dockerfile

首先需要编写Dockerfile,在项目根目录新建Dockerfile文件,告诉docker-compose如何构建镜像:

FROM openjdk:8
#FROM 使用java环境镜像
#设置挂载目录,使用项目名作为日志文件夹,所有项目的日志统一都是spring.log,因此使用文件夹区分
VOLUME /usr/docker/logs

#将该项目的JAR添加到镜像中
ADD spring-boot-1.1.0.jar app.jar

#配置该项目要映射出去的端口
EXPOSE 8080

#jar运行命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar","--server.port=8080"]

注意修改spring-boot-1.1.0.jar为项目中实际的jar文件名,环境变量在maven打包阶段就要设置好,而不是通过启动命令spring.profiles.active=dev 这样来设置。

编写docker-compose.yml

同样在项目根目录新建docker-compose.yml文件,粘入如下内容:

version: '2'
services:
  manage-system:
    build:
      context: ./  #项目的目录,./表示就是当前目录
    restart: on-failure
    container_name: manage-system
    image: 192.168.0.100:5000/project/manage-system:latest
    hostname: manage-system
    ports:
      - 8085:8085
    networks:
      - mynetworks
      
networks:
  mynetworks:
    external: true  #使用已有的,如去掉,则会每次重启时都重新创建

以上是单个项目的部署配置,且其它的如redis、mysql、kafka等依赖服务已存在的情况下,仅配置一个即可,如果希望一行命令将后台服务、mysql、redis等全部一并创建并启动,则配置如下:

version: '2'
services:
  manage-system:
    build:
      context: ./  #项目的目录,./表示就是当前目录
    restart: on-failure
    container_name: manage-system
    image: 192.168.0.199:5000/projec/manage-system:latest #ip改为自己私库ip
    hostname: manage-system
    ports:
      - 8085:8085
    networks:
      - mynetworks
    depends_on:  #该服务需要依赖redis与mysql
      - redis
      - mysql

  mysql:
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: '%'
      TZ: Asia/Shanghai
    restart: always
    container_name: mysql
    image: mysql
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --default-authentication-plugin=caching_sha2_password
    ports:
      - 3306:3306
    networks:
      - mynetworks

  redis:
    image: redis:5.0
    ports:
      - 6379:6379
    restart: always
    container_name: redis
    hostname: redis
    networks:
      - mynetworks


networks:
  mynetworks:
    driver: bridge

以上是完整的配置,如需要构建自己的镜像,则配置build.context,并编写dockerfile,如使用官方镜像直接启动,则配置image: 镜像名 即可。

配置jenkins

安装插件(可选)

首先确保安装了publish over ssh插件,安装方法为jenkins主页->左边菜单Manage Jenkins -> Manage Plugins->点击可选插件->搜索:Publish Over SSH -> 安装此插件

新建Jenkins job

1、配置源码管理,比如这里使用的是svn,点击subversion ,填入svn地址和账号密码

2、Build 项,Root POM填写pom.xml,如不在根目录,填写完整目录,Goals and options填写maven打包命令,如:clean package -Dmaven.test.skip=true -e -Ptest

3、Post Steps选择Run only if build succeeds or is unstable (构建成功则继续执行)

4、点击Add post build step,选择Execute shell,填写如下代码:

cd manage-system
docker-compose build
docker push 192.168.1.199:5000/project/manage-system:latest

首先cd进入项目的根目录(也是docker-compose.yml的目录),执行构建命令,然后使用push命令将镜像推送到私库

如果需要直接在本机部署则直接填写如下即可:

cd manage-system
docker-compose up -d

如直接部署在本机,配置到此就已经结束了,直接运行Jenkins Build Now即可,如是部署在其它服务器,则需要增加一步

5、如部署在其它服务器,则在构建后操作下点击Add post build step,选择Send files or execute commands over SSH,SSH Server Name一栏选择要部署的服务器,服务器连接配置在Manage Jenkins-> Configure System -> 找到SSH Servers ,配置远程连接服务器的信息。

回到jenkins job配置,Transfer Set Source files填写要发送到远程服务器的文件,这里可将docker-compose.yml发送过去,如填写:manage-system/docker-compose.yml

Exec command填写内容如下:

docker pull 192.168.1.199:5000/project/manage-system:latest
docker-compose up -d --no-build

–no-build 表示不构建,因为我们已经构建了该镜像并推送到私库了

至此spring boot项目的自动部署配置完成!

VUE前端项目部署

在项目根目录编写Dockerfile文件:

FROM nginx
MAINTAINER reiner
VOLUME /tmp
ENV LANG en_US.UTF-8
RUN echo "server {  \
                      listen       80; \
                      location   /manage-system/ { \
                      proxy_pass              http://192.168.1.199:8080/manage-system/; \
                      proxy_redirect          off; \
                      proxy_set_header        Host 192.168.1.199; \
                      proxy_set_header        X-Real-IP \$remote_addr; \
                      proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for; \
                  } \
                  
                  location / { \
                     root   /var/www/html/; \
                      index  index.html index.htm; \
                      if (!-e \$request_filename) { \
                          rewrite ^(.*)\$ /index.html?s=\$1 last; \
                          break; \
                      } \
                  } \
                  access_log  /var/log/nginx/access.log ; \
              } " > /etc/nginx/conf.d/default.conf \
    &&  mkdir  -p  /var/www \
    &&  mkdir -p /var/www/html

ADD dist/ /var/www/html/
EXPOSE 80
EXPOSE 443

修改其中的ip为实际项目的ip和地址

配置jenkins

老样子,新建jenkins job ,源码管理填写git或svn地址,

Build Steps点击新增Excute Shell,填写构建命令:

npm run build
docker build -t 192.168.1.199:5000/web/manage-system-front:latest .
docker push 192.168.1.199:5000/web/manage-system-front:latest

执行构建命令,再执行docker打包命令,docker会自动查找当前目前的Dockerfile文件并构建镜像。

如果是直接本机部署,则填写如下:

npm run build
docker build -t 192.168.1.199:5000/web/manage-system-front:latest .
docker run --name manage-system-front -p 80:80 -d 192.168.1.199:5000/web/manage-system-front:latest

本机部署配置到此结束,如需要发送到远程服务部署,则再增加一步。

构建后操作新增Send build artifacts over SSH,选择要部署的服务器,Transfer Set

Source files可填写docker-compose.yml文件的路径

前端项目的docker-compose.yml可参照springboot项目中的配置,这里我直接手动命令启动了,Exec command填写如下 :

docker pull 192.168.1.199:5000/web/manage-system-front:latest
docker run --name manage-system-front -p 80:80 -d 192.168.1.199:5000/web/manage-system-front:latest

结束!

一些常用镜像快速启动命令示例

docker容器管理界面
docker run -d -p 9000:9000 --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
--name portainer lihaixin/portainer
docker私库管理页面
docker run -d -p 7001:8080 --name registry-web --restart=always --link registry:registry -e registry_url=http://registry:5000/v2 -e registry_name=localhost:5000 hyper/docker-registry-web:latest
kafka
docker run -d --name kafka -p 9092:9092 -p 9093:9093 --link zookeeper  --network networks     -e ALLOW_PLAINTEXT_LISTENER=yes     -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093 -e KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://192.168.1.199:9093 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT -e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT    bitnami/kafka:3.4

kafka特别说明:

此配置在容器内部访问时使用kafka:9092或者内部ip:9092,外部访问时使用ip:9093,记得暴露9093

关于kafka lisner 说明可参考: Kafka Listeners - Explained

kafka ui页面
docker run --name=kafka-ui -d --network networks -e KAFKA_CLUSTERS_0_NAME=local-kafka -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092 -p 7002:8080 provectuslabs/kafka-ui:latest
jenkins
docker run -u root -d -p 7000:8080 -p 50000:50000 --name jenkins -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock  jenkins/jenkins
redis
docker run --restart=always -p 6379:6379 --name redis --network networks -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/conf/data:/data -d hub.c.163.com/library/redis /etc/redis/redis.conf --appendonly yes --requirepass 123456

补充:如连接redis时报no route host,执行如下:

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.18.0.0/16 accept' && firewall-cmd --reload
elasticsearch7
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch --network networks -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" elasticsearch:7.17.9
mysql8
docker run -v /data/mysql:/var/lib/mysql -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root123456 -d mysql
pluemelog
docker run -d -p8891:8891 --link kafka:kafka -e plumelog.model=kafka -e plumelog.es.esHosts=elasticsearch:9200 -e plumelog.kafka.kafkaHosts=kafka:9092  -e login.username=admin -e login.password=123456 --volume=/data/plumelog-server:/plumelog-server --network=networks --name=plumelog ylyue/plumelog:v3.5.1

注意各个容器想要相互互通需要容器在同一个虚拟网络(network),使用--network=networks 指定,处于同一虚拟网络才能通过容器名+端口访问.


网站公告

今日签到

点亮在社区的每一天
去签到