借鉴了官方指导,结合自身使用情况(基于内网使用)的一套docker-compose部署方案。
解决:
如果服务器(Vmware虚拟机)重启了服务不可用的问题。
数据库不能重启,重启历史数据就丢失
完善了具体操作步骤
记录了数据更新方式
服务器
装了VMware Ubuntu20的Windows10
客户端
局域网内电脑
hosts修改
# 服务器
# 以管理员身份打开hosts
sudo vim /etc/hosts
#添加配置(ip以具体机器为准)
# jeecgboot
192.168.222.128 jeecg-boot-redis
192.168.222.128 jeecg-boot-mysql
192.168.222.128 jeecg-boot-system
#客户端
C:\Windows\System32\drivers\etc\hosts 添加配置,以实际IP地址为准
# erpbackend address
192.168.222.128 erpbackend
发布:
打jar包的时候,application.yml里的mysql地址是url: jdbc:mysql://jeecg-boot-mysql:3306/
redis地址是:host: jeecg-boot-redis,所以需要在服务器上配置hosts。
如果主机地址变了:
服务端部分:只需要先docker-compose down然后修改hosts里的ip地址,再docker-compose up -d即可。
客户端:需要改hosts对应的ip地址,以便前端能正常请求到后端服务。
前端的开发环境配置已经改成erpbackend,需要客户端配置hosts不然会访问不到后端服务。
开发:
本地电脑要配置hosts。
jeecg-boot-redis、jeecg-boot-mysql对应127.0.0.1 能访问本地数据库的地址即可。
镜像概览
最终需要四个镜像即可。其余的可以自行删掉。
容器概览
最终部署完成后,只有这几个容器。
安装包概览
backend
jeecg文件夹
就是/src/main/resources/jeecg这个文件夹及所有内容,里面主要是一些模板文件。
build.txt
sudo docker build -t backend:latest .
Dockerfile
FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER renqing.china@gmail.com
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN mkdir -p /jeecg-boot/config/jeecg/
WORKDIR /jeecg-boot
EXPOSE 8080
# Dockerfile同级目录下有jeecg资源文件、jar包
ADD ./jeecg ./config/jeecg
ADD ./jeecg-boot-module-system-3.0.jar ./
CMD sleep 60;java -Djava.security.egd=file:/dev/./urandom -jar jeecg-boot-module-system-3.0.jar
Jar
通过maven打包出来的最新jar包
frontend
dist
前端代码打出来的代码包
build.txt
sudo docker build -t frontend:latest .
Dockerfile
FROM nginx
MAINTAINER renqing.china@gmail.com
VOLUME /tmp
ENV LANG en_US.UTF-8
RUN echo "server { \
listen 80; \
location ^~ /jeecg-boot { \
proxy_pass http://jeecg-boot-system:8080/jeecg-boot/; \
proxy_set_header Host jeecg-boot-system; \
proxy_set_header X-Real-IP \$remote_addr; \
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; \
} \
#解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
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
mysql
build.txt
sudo docker build -t mysql:latest .
Dockerfile
FROM mysql:8.0.19
MAINTAINER renqing.china@gmail.com
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 这一行注掉了,因为如果每次重启都要更新数据库,会导致历史数据丢失
#COPY ./jeecg-boot.sql /docker-entrypoint-initdb.d
jeecg-boot.sql
包括 create database ; use database; create table; insert 所有语句。
docker-compose.yml
version: '2'
services:
jeecg-boot-mysql:
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
restart: always
container_name: mysql
image: mysql:latest
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
volumes:
- /data/mysql:/var/lib/mysql
jeecg-boot-redis:
image: redis:6.2.1
ports:
- 6379:6379
restart: always
hostname: jeecg-boot-redis
container_name: redis
jeecg-boot-system:
restart: on-failure
depends_on:
- jeecg-boot-mysql
- jeecg-boot-redis
container_name: backend
image: backend:latest
hostname: jeecg-boot-system
ports:
- 8080:8080
jeecg-boot-view:
restart: always
container_name: frontend
image: frontend:latest
hostname: jeecg-boot-system
ports:
- 80:80
MySQL 新建了一个挂载(/data/mysql:/var/lib/mysql),用于存放历史数据,防止重启MySQL容器数据丢失。
部署流程:
1.复制整套安装包到服务器
2.分别打 前端、后端、mysql的镜像
3.sudo docker-compose up -d
4.确认MySQL容器已经启动
5.复制数据库sql脚本到宿主机的 /data/mysql下(必须容器启动后再放,不然容器起不来)
6.docker exec -it mysql /bin/bash 进入容器
7.mysql -uroot -p 登陆数据库
8.source /var/lib/mysql/sql脚本
9.show databases; 判断数据库是否已经新建成功。
4.退出。使用浏览器测试部署效果
升级流程:
1.上传最新的jar和dist,覆盖旧文件
2.打新的前后端镜像(旧镜像可以通过docker prune清除)
3.sudo docker-compose down
4.sudo docker-compose up -d
数据库数据更新流程:
1.如果有客户端,直接执行增量文件即可
2.没有客户端,可以安装一个对应版本的mysql服务:
-
安装mysql8.0.23
-
进到安装目录的bin下面
-
mysql -hip -uroot -p 进去
-
show databases;查看有哪些库
-
use jeecg-boot 选一个数据库
-
show tables查看表,确认是否需要执行脚本
-
source ./sql文件 文件位置和mysql.exe相对
-
desc 表名 核对建表、加减字段,修改字段长度等动作
-
show triggers\G 核对触发器
3.如果是全量的数据库,就直接重打镜像吧,重新启动一下
4.建议备份数据结构和数据即可。存储过程、函数、触发器、事件,不需要每次都导来导去,自己本地记录一个全量的sql文件即可,每次更新完执行一下(create if not exist)。mysqldump本地测试,上述几种对象都导出的有问题。
导出表结构和数据:
1.导出整个库:mysqldump.exe -h192.168.162.128 -P3306 -uroot -proot --databases jeecg-boot > jeecg.sql
2.导出指定表: mysqldump -uroot -p --databases jeecg-boot --tables sys_user sys_depart > ./table.sql
导出存储过程和函数:
mysqldump -h192.168.162.128 -uroot -proot --opt -r -d jeecg-boot --routines > func.sql
导出触发器:
mysqldump -h192.168.162.128 -uroot -proot --opt -t -d jeecg-boot > trigger.sql
导出事件:
mysqldump -h192.168.162.128 -uroot -proot jeecg-boot --events > event.sql
mysql改为持久化历史数据流程:
1.改前后端代码,重新打dist和jar(如果需要升级前后端代码)
2.重新打前后端镜像(如果需要升级前后端代码)
3.导出一份现数据(参考 “导出表结构和数据”第一个,第一个只是备份了库、表、数据。函数,存储过程,触发器,事件需要单独备份成独立文件)
4.确认无误之后停服务
5.修改mysql的dockrfile(去掉初始化那一行)
6.重新打mysql镜像
7.修改docker-compose,增加一行volume挂载
8.启动服务 docker-compose up -d
9.复制数据初始化脚本(建库建表初始化数据.sql、函数存储过程事件触发器.sql)到宿主机/data/mysql
10.sudo docker exec -it mysql /bin/bash 进到MySQL容器里面
11.mysql -uroot -proot 登陆
12.source /var/lib/mysql/建库建表初始化数据.sql
13.source /var/lib/mysql/函数存储过程事件触发器.sql
14. 后续的数据库更新,只要上传到/data/mysql,然后进容器source执行即可