Administrator
Administrator
发布于 2025-12-01 / 9 阅读
1
0

Jenkins部署Maven和NodeJS项目

前言

为什么要部署CICD

开发Java项目时,手动“写代码→编译→打包→部署→测试”要重复做很多次,既浪费时间又容易出错(比如不同人电脑环境不一样)。Maven好比是“管理者”,能统一项目结构、自动下载依赖(比如项目需要的jar包);Jenkins是“自动化流水线”,能把“编译、打包、部署”这些重复工作交给机器做。本文就是教你用这两个工具,在3台服务器上实现电商项目(项目主页 | mall学习教程)的自动化部署。

一:开发相关概念

1. 什么是Maven

新手解读

不同开发工具(比如Eclipse和IDEA)的项目文件夹结构不一样,换工具就用不了。Maven规定了一套统一的项目结构,不管用什么工具打开都一样。它本质是Apache的自动化构建工具,专门帮Java项目做“找依赖、编译、打包”这些杂活。

2. Maven的作用

  1. 项目构建:自动执行“清理→编译→测试→打包”流程,每次构建结果都一样。

  2. 依赖管理:比如项目需要SpringBoot,Maven会自动从网上下载对应的jar包,不用手动找。

  3. 项目信息管理:用配置文件记录项目作者、版本等信息,生成统一报告。

  4. 插件扩展:可加装“代码检查”“测试报告生成”等插件。

  5. 多模块支持:大型项目拆分成多个小模块(比如商城的“订单模块”“商品模块”),Maven能统一管理。

  6. 持续集成:和Jenkins配合,实现代码提交后自动构建部署。

3. 什么是构建

新手解读

“构建”就是把你写的代码、配置文件、图片等“原材料”,加工成能在服务器上运行的“成品”的过程,主要步骤包括:

  • 清理:删除上次编译的旧文件。

  • 编译:把Java代码转成电脑能懂的字节码文件。

  • 测试:自动检测关键功能是否正常。

  • 报告:生成测试结果表格。

  • 打包:Java项目打成jar包,Web项目打成war包。

  • 安装:把打好的包存到本地仓库(自己电脑里)。

  • 部署:把包传到服务器上运行。

4. 自动化构建的意义

手动构建时,程序员可能每天花一半时间做“编译→打包→部署”,自动化后机器1分钟搞定,人能专心写代码。

5. Maven核心—pom文件

新手解读

pom.xml是Maven的“核心配置文件”,相当于项目的“说明书”,里面写了:项目名称、依赖的jar包(比如MySQL驱动)、打包方式、插件配置等。Maven全靠这个文件指挥工作。

6. Maven项目自动化部署流程

新手解读

  1. 程序员在本地(比如IDEA)写代码,提交到Gitlab(代码仓库)。

  2. Gitlab通知Jenkins:“有新代码提交了!”

  3. Jenkins从Gitlab拉取最新代码,用Maven打包成jar/war包。

  4. Jenkins把包传到Docker服务器,部署成可运行的容器。

  5. 测试、前端人员直接访问Docker服务器上的项目。

二:电子商城项目简介

1. mall商城项目简介

项目地址:https://www.macrozheng.com/

包括镜像在内的打包好的软件包:百度网盘-Mail软件包

mall是一个完整的电商系统,分“前台商城”(用户逛的页面,比如商品列表、购物车)和“后台管理”(管理员用的,比如改商品价格、看订单),用SpringBoot(后端)和Vue(前端)开发,所有功能都跑在Docker容器里,方便迁移和管理。

2. 服务器角色分配

主机名

IP地址

安装软件

作用

Gitlab

192.168.171.11

Gitlab

存代码的仓库(类似百度云盘存文件)

Jenkins

192.168.171.12

Jenkins、Maven

自动化构建部署的“指挥中心”

Docker

192.168.171.15

Docker

运行MySQL、Nginx、项目容器的服务器

3. 系统架构(简化版)

  • 后端:SpringBoot写的服务(订单、商品、搜索),跑在Docker容器里。

  • 前端:Vue写的网页,用Nginx提供访问入口。

  • 数据存储:MySQL存业务数据(订单、用户),Elasticsearch存搜索数据(商品搜索)。

  • 自动化:Jenkins从Gitlab拉代码,打包后传到Docker服务器部署。

编辑不易,请乐哥一罐可乐:

三:mall商城运行环境部署(Docker主机操作)

新手解读

这一步是在Docker服务器(192.168.171.15) 上搭基础环境:Docker本身、数据库、搜索工具、网页服务器。 数据卷说明:之前用“主机目录挂载”(比如/mydata/mysql),现在改用Docker数据卷(比如mysql_data)。数据卷是Docker自带的存储区域,好处是:不用记复杂的主机路径、容器删了数据还在、方便备份迁移。

1. Docker环境安装

运行主机:Docker服务器(192.168.171.15)

 # 安装Docker(CentOS系统为例)
 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 -y docker-ce docker-ce-cli containerd.io
 ​
 # 启动Docker并设置开机启动
 systemctl start docker
 systemctl enable docker
 ​
 # 设置主机名为docker(方便识别)
 hostnamectl set-hostname docker
 bash

2. 开启Docker远程管理API

新手解读

Jenkins需要远程操作Docker服务器构建镜像,所以要开API让Jenkins能连接。

运行主机:Docker服务器(192.168.171.15)

 # 编辑Docker服务配置文件
 vim /usr/lib/systemd/system/docker.service
 ​
 # 找到ExecStart行,修改为:
 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock
 ​
 # 重启Docker使配置生效
 systemctl daemon-reload
 systemctl restart docker
 ​
 # 验证端口是否开启(出现2375端口即成功)
 netstat -tnlp | grep 2375

3. MySQL安装(用数据卷存储)

运行主机:Docker服务器(192.168.171.15)

 # 1. 拉取MySQL 5.7镜像
 docker pull mysql:5.7
 ​
 # 2. 用数据卷启动MySQL(数据卷自动创建)
 docker run -p 3306:3306 --name mysql \
 -v mysql_log:/var/log/mysql \  # 日志数据卷
 -v mysql_data:/var/lib/mysql \  # 数据数据卷
 -v mysql_conf:/etc/mysql/conf.d/ \  # 配置数据卷
 -e MYSQL_ROOT_PASSWORD=root \  # 初始root密码
 -d mysql:5.7
 ​
 # 3. 上传mall.sql到Docker服务器(可通过SFTP工具上传,比如Xftp)
 # 假设文件传到/root目录下,拷贝到MySQL容器内
 docker cp /root/mall.sql mysql:/
 ​
 # 4. 进入MySQL容器
 docker exec -it mysql /bin/bash
 ​
 # 5. 登录MySQL(在容器内执行)
 mysql -uroot -proot --default-character-set=utf8
 ​
 # 6. 创建数据库并导入脚本(在MySQL命令行执行)
 create database mall character set utf8;
 use mall;
 source /mall.sql;
 ​
 # 7. 创建访问账号(允许远程连接,在MySQL命令行执行)
 grant all privileges on *.* to 'reader'@'%' identified by '123456';
 exit  # 退出MySQL
 ​
 # 8. 退出容器
 exit

4. Elasticsearch安装(商品搜索用)

运行主机:Docker服务器(192.168.171.15)

 # 1. 拉取Elasticsearch 7.17.3镜像
 docker pull elasticsearch:7.17.3
 ​
 # 2. 调整虚拟内存(否则启动失败)
 sysctl -w vm.max_map_count=262144
 ​
 # 3. 用数据卷启动Elasticsearch
 docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
 -e "discovery.type=single-node" \  # 单节点模式
 -e "cluster.name=elasticsearch" \
 -e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \  # 限制内存使用
 -v elasticsearch_plugins:/usr/share/elasticsearch/plugins \  # 插件数据卷(容器内路径: /usr/share/elasticsearch/plugins)
 -v elasticsearch_data:/usr/share/elasticsearch/data \  # 数据数据卷(容器内路径: /usr/share/elasticsearch/data)
 -d elasticsearch:7.17.3
 ​
 # 4. 授权数据卷目录(Docker主机上的数据卷实际路径)
 # 数据卷在主机的默认存储路径为:/var/lib/docker/volumes/[卷名]/_data/
 chmod 777 /var/lib/docker/volumes/elasticsearch_data/_data/
 ​
 # 5. 重启Elasticsearch确保权限生效
 docker restart elasticsearch
 ​
 # 6. 验证是否启动(返回JSON格式信息即成功)
 curl http://192.168.171.15:9200

安装IK分词器(基于数据卷挂载)

由于启动Elasticsearch时已将容器内的插件目录(/usr/share/elasticsearch/plugins)与Docker主机的elasticsearch_plugins数据卷绑定,因此只需将分词器解压到主机上的数据卷实际路径,即可自动同步到容器内。

1. 准备前提

  • 已完成上述Elasticsearch安装(确保容器正常运行);

  • 下载与Elasticsearch版本严格匹配的IK分词器:

    下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases,选择elasticsearch-analysis-ik-7.17.3.zip(必须与Elasticsearch版本一致);

  • 若已获取该安装包,可直接使用。

2. 上传分词器到服务器

通过SFTP工具(如Xftp)将下载的elasticsearch-analysis-ik-7.17.3.zip文件上传到Docker服务器的/root目录(或其他容易访问的目录)。

3. 安装解压工具(若未安装)

在Docker服务器终端执行以下命令安装unzip(用于解压zip文件):

 yum -y install unzip

4. 解压分词器到数据卷路径

执行以下命令,将分词器解压到elasticsearch_plugins数据卷在主机的实际路径下(自动同步到容器内插件目录):

 # 数据卷在主机的实际路径:/var/lib/docker/volumes/elasticsearch_plugins/_data/
 # 解压后会在该路径下创建analysis-ik目录,存放分词器文件
 unzip elasticsearch-analysis-ik-7.17.3.zip \
 -d /var/lib/docker/volumes/elasticsearch_plugins/_data/analysis-ik/

5. 验证分词器文件(可选)

执行以下命令检查解压结果(应显示分词器相关文件,如jar包、config目录等):

 ll /var/lib/docker/volumes/elasticsearch_plugins/_data/analysis-ik/

正常输出示例:

 [root@docker ~]# ll /var/lib/docker/volumes/elasticsearch_plugins/_data/analysis-ik/

6. 授权分词器目录(避免权限问题)

 # 确保容器内进程可访问分词器文件
 # 小芝士:在主机上对目录执行chmod授权,容器内的目录权限会同时被修改,两者是 “实时同步” 的。
 chmod -R 755 /var/lib/docker/volumes/elasticsearch_plugins/_data/analysis-ik/

7. 重启Elasticsearch生效

分词器需在容器启动时加载,因此重启容器使分词器生效:

 docker restart elasticsearch

关键注意事项

  1. 版本严格匹配:Elasticsearch与IK分词器版本必须完全一致(如7.17.3对应7.17.3),版本不匹配会导致容器启动失败;

  2. 数据卷路径对应:所有操作均针对主机上的/var/lib/docker/volumes/elasticsearch_plugins/_data/路径,而非容器内路径,数据卷会自动同步;

  3. 权限检查:若重启后Elasticsearch异常,可通过docker logs elasticsearch查看日志,若提示“权限拒绝”,重新执行步骤6的授权命令即可。

5. Nginx安装(前端网页服务器)

运行主机:Docker服务器(192.168.171.15)

 # 1. 拉取Nginx 1.22镜像
 docker pull nginx:1.22
 ​
 # 2. 用数据卷启动Nginx
 docker run -p 80:80 --name nginx \
 -v nginx_html:/usr/share/nginx/html \  # 网页文件数据卷
 -v nginx_logs:/var/log/nginx \  # 日志数据卷
 -d nginx:1.22
 ​
 # 3. 授权网页数据卷目录
 chmod -R 755 /var/lib/docker/volumes/nginx_html/_data/

四:利用Jenkins部署mall后台程序(Jenkins主机操作)

新手解读

这一步在Jenkins服务器(192.168.171.12) 上配置Maven,让Jenkins能拉取Gitlab的代码、打包后端项目,再传到Docker服务器部署。

1. 安装Maven

运行主机:Jenkins服务器(192.168.171.12)

 # 1. 安装JDK(Maven依赖Java)
 yum install -y java-17-openjdk java-17-openjdk-devel
 ​
 # 2. 下载Maven 3.8.6(可先通过浏览器下好再上传,或用wget)
 wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
 ​
 # 3. 解压并移动到指定目录
 tar zxvf apache-maven-3.8.6-bin.tar.gz
 mv apache-maven-3.8.6 /usr/local/maven
 ​
 # 4. 配置环境变量
 vim /etc/profile
 ​
 # 在文件末尾添加以下内容:
 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
 export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
 export PATH=$JAVA_HOME/bin:$PATH
 export MAVEN_HOME=/usr/local/maven
 export PATH=$PATH:$MAVEN_HOME/bin
 ​
 # 5. 生效环境变量
 source /etc/profile
 ​
 # 6. 验证Maven是否安装成功(显示版本即成功)
 mvn -version

2. 修改Maven阿里源(加速下载依赖)

运行主机:Jenkins服务器(192.168.171.12)

 # 编辑Maven配置文件
 vim /usr/local/maven/conf/settings.xml
 ​
 # 找到<mirrors>标签,替换为阿里源:
 <mirrors>
   <mirror>
     <id>aliyunmaven</id>
     <mirrorOf>*</mirrorOf>
     <name>阿里云公共仓库</name>
     <url>https://maven.aliyun.com/repository/public</url>
   </mirror>
 </mirrors>

3. Jenkins配置JDK和Maven

运行主机:Jenkins服务器(192.168.171.12)(网页操作)

  1. 打开Jenkins网页:http://192.168.171.12:8080(首次登录需输入初始密码,密码在/var/jenkins_home/secrets/initialAdminPassword)。

  2. 点击“Manage Jenkins”→“Global Tool Configuration”。

    image-20250923142305268

  3. 配置JDK

    • 取消“Install automatically”。

    • 别名填“jdk-17”。

    • JAVA_HOME填/usr/lib/jvm/java-17-openjdk

      image-20250923142603206

  4. 配置Maven

    • 取消“Install automatically”。

    • 名称填“maven-3.8.6”。

    • MAVEN_HOME填/usr/local/maven

      image-20250923142904439

  5. 点击“Save”保存。

4. Gitlab创建项目(Gitlab主机操作)

运行主机:Gitlab服务器(192.168.171.11)(网页操作)

  1. 打开Gitlab网页:http://192.168.171.11,登录后点击“New project”。

  2. 选择“Import project”→“Repository by URL”。

  3. 输入仓库URL:https://gitee.com/kgc-wjq/mall.git,项目名称填“mall”,可见性选“Private”,点击“Create project”。

    image-20250923143925571

  4. 导入成功后,进入项目→编辑pom.xml文件:

    • 找到<properties>标签,添加Docker服务器地址:

       <docker.host>http://192.168.171.15:2375</docker.host>

      image-20250923144222861

  5. 提交修改(点击“Commit changes”)。

  6. 复制项目HTTP地址:http://192.168.171.11/root/mall.git(后续Jenkins要用)。

pom.xml 是什么?

当 Jenkins 拉取 Gitlab 上的mall项目代码后,会用 Maven 执行打包命令(mvn clean package)。这个过程中,Maven 需要调用 Docker 插件(比如docker-maven-plugin)来构建项目的 Docker 镜像,并将镜像推送到你的 Docker 服务器(192.168.171.15)。

pom.xmlMaven 项目的核心配置文件,相当于项目的 “说明书” 或 “配置清单”,所有用 Maven 管理的 Java 项目(比如你部署的mall商城后端)都必须包含这个文件。

它的主要作用是告诉 Maven:

  • 项目的基本信息(名称、版本、作者等);

  • 项目依赖哪些第三方库(比如 SpringBoot、MySQL 驱动等,Maven 会自动下载这些依赖);

  • 项目打包方式(比如打成 jar 包还是 war 包);

  • 构建项目时需要用到的插件(比如编译代码的插件、生成 Docker 镜像的插件等)。

编辑pom.xml添加docker.host配置,是为了让 Maven 的 Docker 插件知道 Docker 服务器的地址,从而完成后续的镜像构建和部署操作。

5. Jenkins配置SSH连接Docker服务器

新手解读

Jenkins需要免密码连接Docker服务器,才能传文件和执行命令。

步骤1:Jenkins生成SSH密钥(运行主机:Jenkins服务器)

 # 生成密钥(一路按回车,不要设密码)
 ssh-keygen
 ​
 # 把公钥传到Docker服务器(输入Docker服务器root密码)
 ssh-copy-id root@192.168.171.15
 ​
 # 验证免密是否成功(不用输密码就能登录即成功)
 ssh root@192.168.171.15
 exit  # 退出Docker服务器

步骤2:Jenkins添加Docker服务器凭据(网页操作)

让 Jenkins 保存登录 Docker 服务器的账号密码,让后续的自动化部署能远程登录操控 Docker 服务器。

  1. Jenkins网页→“Manage Jenkins”→“Credentials”→“System”→“Global credentials”→“Add Credentials”。

    image-20250923150850648

  2. 类型选“Username with password”,用户名填“root”,密码填Docker服务器root密码,ID填“docker-auth”,描述填“Docker服务器凭据”,点击“Create”。

    image-20250923151112674

步骤3:Jenkins添加SSH Remote Hosts(网页操作)

让 Jenkins “记住” 如何通过 SSH 协议安全连接到你的 Docker 服务器(192.168.171.15),为后续自动化部署时远程操作 Docker 服务器做准备。

  1. “Manage Jenkins”→“System”→“SSH remote hosts”→“Add”。

  2. Hostname填192.168.171.15,Port填22,Credentials选“root (Docker服务器凭据)”,点击“Save”。

    image-20250923152302702

6. Jenkins新建后端部署任务(网页操作)

  1. Jenkins首页→“New Item”,任务名称填“mall-backend”,选择“构建一个maven项目”,点击“OK”。

  2. 源码管理

    • 选“Git”,Repository URL填http://192.168.171.11/root/mall.git

    • Branches to build填*/master(默认分支)。

      image-20250923152548371

  3. Build

    • Goals and options填clean package -Dmaven.test.skip=true(清理→打包→跳过测试)。

      image-20250923153553624

  4. Post Steps(构建后操作):

    image-20250923154832325

    • 点击“Add post-build step”→“Execute shell”,输入:

       # 把启动脚本传到Docker服务器(先把mall-sh文件夹传到Jenkins的/var/jenkins_home目录)
       # 在jenkins服务器上操作
       mkdir -p /var/jenkins_home/mall-sh
       cd !$
       rz
       ​
       # 将 Jenkins 服务器上存放的 3 个启动脚本所在的`mall-sh`文件夹,通过`scp`命令复制到 Docker 服务器的`/root`目录下。
       scp -r /var/jenkins_home/mall-sh root@192.168.171.15:/root
    • 再点击“Add post-build step”→“Execute shell script on remote host using ssh”:

      • SSH site选root@192.168.171.15:22

      • Command填:

         chmod +x /root/mall-sh/*  # 给脚本加执行权限
         /root/mall-sh/mall-admin.sh  # 启动后台管理服务
         /root/mall-sh/mall-search.sh  # 启动搜索服务
         /root/mall-sh/mall-portal.sh  # 启动前台服务
  5. 点击“Save”保存。

7. 执行构建并验证

  1. 进入“mall-backend”任务→点击“Build Now”,首次构建需下载依赖,耗时较长(确保网络正常)。

  2. 构建成功后,验证服务:

    • 后台管理API:http://192.168.171.15:8080/swagger-ui/

    • 搜索服务API:http://192.168.171.15:8081/swagger-ui/

    • 前台服务API:http://192.168.171.15:8085/swagger-ui/

五:利用Jenkins部署NodeJS前端应用(Jenkins主机操作)

新手解读

前端项目用NodeJS构建,步骤和后端类似:Jenkins拉取Gitlab的前端代码,用npm打包,再传到Docker服务器的Nginx数据卷里。

1. 安装NodeJS

运行主机:Jenkins服务器(192.168.171.12)

 # 1. 安装编译依赖
 yum -y install gcc gcc-c++ make
 ​
 # 2. 下载NodeJS 14.18.0(或通过浏览器下载)
 wget https://nodejs.org/dist/v14.18.0/node-v14.18.0-linux-x64.tar.gz
 ​
 # 3. 解压并创建软链接(方便全局使用)
 tar zxvf node-v14.18.0-linux-x64.tar.gz
 mv node-v14.18.0-linux-x64 /usr/local/nodejs14
 ln -s /usr/local/nodejs14/bin/* /usr/local/bin
 ​
 # 4. 验证安装(显示版本即成功)
 node -v  # 输出v14.18.0
 npm -v   # 输出6.14.15

2. Gitlab创建前端项目

运行主机:Gitlab服务器(192.168.171.11)(网页操作)

  1. 新建项目→“Import project”→“Repository by URL”。

  2. 输入仓库URL:https://gitee.com/kgc-wjq/mall-admin-web.git,项目名称填“mall-admin-web”,点击“Create project”。

  3. 编辑config/prod.env.js文件:

    image-20250923165701762

    • BASE_API改成后端API地址:http://192.168.171.15:8080

  4. 提交修改,复制项目HTTP地址:http://192.168.171.11/root/mall-admin-web.git

3. Jenkins新建前端部署任务(网页操作)

  1. Jenkins首页→“New Item”,任务名称填“mall-frontend”,选“Freestyle project”,点击“OK”。

  2. 源码管理

    • 选“Git”,Repository URL填http://192.168.171.11/root/mall-admin-web.git

    • Branches to build填*/master

  3. Build Steps

    • 点击“Add build step”→“Execute shell”,输入打包脚本:

       # 查看npm版本
       npm -v
       # 删除旧依赖和缓存
       rm -rf node_modules package-lock.json
       npm cache clear --force
       # 用腾讯云镜像加速(国内快)
       npm config set registry http://mirrors.cloud.tencent.com/npm/
       # 安装依赖
       npm install --unsafe-perm
       # 打包项目
       npm run build
       # 把打包后的文件传到Docker服务器的Nginx数据卷
       scp -r /root/.jenkins/workspace/mall-frontend/dist/* root@192.168.171.15:/var/lib/docker/volumes/nginx_html/_data/
  4. 构建后操作

    • 点击“Add post-build step”→“Send build artifacts over SSH”。

    • SSH Server选“mall”(之前配置的Docker服务器)。

    • Exec command填:chmod -R 755 /var/lib/docker/volumes/nginx_html/_data/(授权网页文件)。

      image-20250923170733703

  5. 点击“Save”保存。

4. 执行构建并验证

  1. 进入“mall-frontend”任务→“Build Now”。

  2. 构建成功后,访问前端页面:http://192.168.171.15,用默认账号admin、密码macro123登录,能看到商品列表即部署成功。

六:APP端测试

新手解读

APP端用HBuilder X模拟器测试,只需修改连接的后端地址为Docker服务器的前台API。

  1. 在Windows上安装HBuilder X,导入mall-app-web-1.0.0项目。

  2. 编辑utils/requestUtil.js文件:

    • config.baseUrl改成http://192.168.171.15:8085

  3. 点击“运行”→“运行到浏览器”→“Chrome”,浏览器切换到“手机模式”,即可看到APP界面。

三个脚本的具体作用(均在Docker服务器执行)

1. mall-admin.sh(后台管理服务启动脚本)

 #!/usr/bin/env bash
 app_name='mall-admin'
 ​
 # 停止并删除旧容器
 docker stop ${app_name}
 echo '----stop container----'
 docker rm ${app_name}
 echo '----rm container----'
 ​
 # 清理无用镜像
 docker rmi `docker images | grep none | awk '{print $3}'`
 echo '----rm none images----'
 ​
 # 使用数据卷启动新容器(日志存储到数据卷)
 docker run -p 8080:8080 --name ${app_name} \
 --link mysql:db \
 -e TZ="Asia/Shanghai" \
 -v /etc/localtime:/etc/localtime \
 -v mall_admin_logs:/var/logs \
 -d mall/${app_name}:1.0-SNAPSHOT
 echo '----start container----'

核心功能:启动商城的后台管理服务(管理员用于管理商品、订单等的系统),并确保与MySQL数据库关联,日志持久化到主机。

2. mall-portal.sh(前台服务启动脚本)

 #!/usr/bin/env bash
 app_name='mall-portal'
 ​
 # 停止并删除旧容器
 docker stop ${app_name}
 echo '----stop container----'
 docker rm ${app_name}
 echo '----rm container----'
 ​
 # 清理无用镜像
 docker rmi `docker images | grep none | awk '{print $3}'`
 echo '----rm none images----'
 ​
 # 使用数据卷启动新容器(日志存储到数据卷)
 docker run -p 8085:8085 --name ${app_name} \
 --link mysql:db \
 -e TZ="Asia/Shanghai" \
 -v /etc/localtime:/etc/localtime \
 -v mall_ortal_logs:/var/logs \
 -d mall/${app_name}:1.0-SNAPSHOT
 echo '----start container----'
 ​

核心功能:启动商城的前台服务(用户浏览商品、下单的系统),关联MySQL数据库,确保用户操作日志被持久化保存。

3. mall-search.sh(搜索服务启动脚本)

 #!/usr/bin/env bash
 app_name='mall-search'
 ​
 # 停止并删除旧容器
 docker stop ${app_name}
 echo '----stop container----'
 docker rm ${app_name}
 echo '----rm container----'
 ​
 # 清理无用镜像
 docker rmi `docker images | grep none | awk '{print $3}'`
 echo '----rm none images----'
 ​
 # 使用数据卷启动新容器(日志存储到数据卷)
 docker run -p 8081:8081 --name ${app_name} \
 --link mysql:db \
 --link elasticsearch:es \
 -e TZ="Asia/Shanghai" \
 -v /etc/localtime:/etc/localtime \ 
 -v mall_search-logs:/var/logs \
 -d mall/${app_name}:1.0-SNAPSHOT
 echo '----start container----'
 ​

核心功能:启动商品搜索服务(用户搜索商品时调用),同时关联MySQL(获取商品数据)和Elasticsearch(实现高效搜索),确保搜索日志被保存。

三、统一说明

  1. 脚本共性操作

    每个脚本都遵循“停止旧容器→删除旧容器→清理无用镜像→启动新容器”的流程,目的是确保每次部署都是最新版本,避免旧版本残留导致冲突。

  2. 数据卷适配建议

    若需将日志目录改为数据卷(而非主机目录),可将-v /mydata/app/${app_name}/logs:/var/logs替换为数据卷挂载,例如:

     -v mall_admin_logs:/var/logs  # 后台服务日志数据卷
     -v mall_portal_logs:/var/logs  # 前台服务日志数据卷
     -v mall_search_logs:/var/logs  # 搜索服务日志数据卷

    (需提前创建对应数据卷:docker volume create mall_admin_logs 等)

  3. 执行逻辑

    三个脚本依次启动后台、搜索、前台服务,共同构成完整的商城系统,用户通过前台访问,管理员通过后台管理,搜索功能依赖Elasticsearch提供支持。

新手常见问题

  1. Docker启动失败?

    docker logs 容器名(比如docker logs mysql)看日志,常见原因:端口被占用、数据卷权限不够。

  2. Jenkins拉取Gitlab代码失败?

    检查Gitlab地址是否正确、Jenkins服务器能否ping通Gitlab(ping 192.168.171.11)。

  3. 前端页面403错误?

    确认Nginx数据卷目录权限:chmod -R 755 /var/lib/docker/volumes/nginx_html/_data/

  4. Maven下载依赖慢?

    检查阿里源配置是否正确,或换华为源:https://mirrors.huaweicloud.com/repository/maven/


评论