# 一、稳健部署版
将除 git、node、Maven 外的环境,都以 docker 镜像的方式存在
TIP
Dockerfile 编写简单,但操作步骤繁杂(和原生的部署方式没什么区别,仅仅可以做版本控制),并且 docker 中会生成许多相互关联的 image。
目录说明
服务器的文件目录说明:
home 目录类似于 window 上的 D 盘
# 存放docker镜像的地方
docker search redis # docker hub
# 存放软件环境
mkdir -p /data/docker_service
# ----------
# 临时存放Git项目代码
# mkdir -p /home/app_code
# 存放已部署上线的项目
# mkdir -p /data/app
# 1、代码拉取
cd /home/app_code
git clone [email protected]:y_project/RuoYi-Vue.git
# 2、SQL 导入
- 方式 1
在容器的 mysqld 中操作
# 将SQL文件映射到容器
cp -p /home/app_code/RuoYi-Vue/sql /data/docker_service/mysql/data
docker ps -a
# 进入容器
docker exec -it [容器id或name] /bin/bash
mysql -u root -p
> create database ry-vue;
> Show databases;
> use ry-vue;
> source /var/lib/mysql/quartz.sql;
> show tables;
> source /var/lib/mysql/ry_20230706.sql;
> show tables;
# 退出容器
exit
- 方式 2
使用 Navicat
# 3、后端打包
以下演示的是在服务端进行打包(优点是不需要配置 jdk 为 1.8)
为了项目的正常运行,建议先在本地修改文件配置文件、并运行项目以验证项目是否能够正常运行
# Maven打包
cd /home/app_code/RuoYi-vue
mvn clean install -pl com.ruoyi:ruoyi-admin -am # 为非模块时可以直接执行mvn package命令
# jar包迁移
mkdir /data/app/ruoyi-vue
mv /home/app_code/RuoYi-vue/ruoyi-admin/target/ruoyi-admin.jar /data/app/ruoyi-vue/ruoyi-admin.jar
# -------
# 编写Dockerfile
cd /data/app/ruoyi-vue
vim Dockerfile
# 构建新镜像
cd /data/app/ruoyi-vue
docker build -t ruoyi:1.0
docker images
# -------
# 启动镜像(-d表示后台运行)
docker run -p 3001:3000 --name ruoyi -d ruoyi:1.0
# 检查是否启动成功
docker logs --tail 1000 -f [容器id]
Dockerfile 编写
#基础镜像使用jdk1.8
FROM java:8
#作者
MAINTAINER lencamo
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD ruoyi-admin.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
# 为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
#ENTRYPOINT ["nohup","java","-jar","/data/cat/ruoyi-admin.jar","&"]
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#暴露3000端口
EXPOSE 3000
# 4、前端打包
# webpack打包
cd /home/app_code/RuoYi-Vue/ruoyi-ui
npm install --unsafe-perm --registry=https://registry.npm.taobao.org
npm run build:prod
# jar包迁移
mkdir /data/app/ruoyi-ui
mv /home/app_code/RuoYi-Vue/ruoyi-ui/dist/* /data/app/ruoyi-ui/
# Nginx代理
vim /usr/local/nginx/conf/nginx.conf
Nginx 配置
user root
http{
server {
listen 80;
server_name localhost;
location / {
root /data/app/ruoyi-ui;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:5151/;
}
}
}
# 二、高效部署版 🎈
采用多阶段构建方式编写 dockerfile,直接将项目 build 成一个单独的镜像,数据库部分的 container 则单独管理(需要迁移的时候将其 commit 成 image 即可)。
TIP
image 管理相对方便,但 dockerfile 编写会复杂一些(一切以镜像较小为目标)。
# 1、后端部署
yum install git -y
git clone https://gitee.com/y_project/RuoYi-Vue.git
cd RuoYi-Vue
vim Dockerfile
docker build -t ruoyi-admin:v1.0 .
docker run -itd --name ruoyi-admin -p 5051:8080 ruoyi-admin:v1.0
- Dockerfile
FROM maven:3.8.6-amazoncorretto-19
COPY ./ /ruoyi
WORKDIR /ruoyi
RUN mvn clean install -pl com.ruoyi:ruoyi-admin -am
FROM openjdk:8
RUN mkdir -p /app/ruoyi-admin
COPY --from=0 /ruoyi/ruoyi-admin/target/ruoyi-admin.jar /app/ruoyi-admin
WORKDIR /app/ruoyi-admin
CMD ["java","-jar","ruoyi-admin.jar"]
EXPOSE 8080
# 3、前端部署
提示
如果前端项目直接调用的是 后端接口 ip 地址,那么也可以不进行 nginx 代理(该容器本身就它一个项目 😂)。
只是前端写 ip 地址的话,请求地址会被固定死,从而无法修改(代理)
yum install git -y
git clone https://gitee.com/y_project/RuoYi-Vue.git
cd RuoYi-Vue/ruoyi-ui
vim nginx.conf
vim Dockerfile
docker build -t ruoyi-ui:v1.0 .
docker run -itd --name ruoyi-ui -p 81:80 ruoyi-ui:v1.0
nginx.conf
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /app/ruoyi-ui;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://43.138.42.251:5051/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
- Dockerfile
FROM node:16.18.0
COPY ./ /ruoyi-ui
WORKDIR /ruoyi-ui
RUN npm install --registry=https://registry.npmmirror.com/
RUN npm run build:prod
FROM nginx:1.17.10
RUN mkdir -p /app/ruoyi-ui
COPY --from=0 /ruoyi-ui/dist /app/ruoyi-ui
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
# 3、自动化脚本
#! /bin/bash
buildImage()
{
yum install git -y
git clone https://gitee.com/Lencamo/RuoYi-Vue.git
cd ./RuoYi-Vue/ruoyi-ui
docker build -t ruoyi-ui:v1.0 .
cd ..
docker build -t ruoyi-admin:v1.0 .
docker pull mysql:5.7.40
docker pull redis:6.0.8
}
startDatabase() {
docker run -p 3307:3306 --name mysql --privileged=true -e MYSQL_ROOT_PASSWORD=mysql666 -d mysql:5.7.40
docker run -p 6380:6379 --name redis --privileged=true -d redis:6.0.8 --requirepass "redis666"
# docker-compose up -d
}
startRuoyi()
{
docker run -itd --name ruoyi-ui -p 81:80 ruoyi-ui:v1.0
docker run -itd --name ruoyi-admin -p 5051:8080 ruoyi-admin:v1.0
# docker-compose up -d
}
help()
{
echo "步骤1(构建镜像):sh ruoyi.sh buildImage"
echo "步骤2(启动数据库):sh ruoyi.sh startDatabase"
echo "步骤3:连接mysql数据库并上传SQL文件"
echo "步骤4(启动项目):sh ruoyi.sh startRuoyi"
exit 1
}
case $1 in
"buildImage") buildImage
;;
"startDatabase") startDatabase
;;
"startRuoyi") startRuoyi
;;
*) help
;;
esac
# 三、整体构建版
拉取一个 centos7 镜像,然后在里面进行一个完整的项目部署
缺点:部署过程依旧繁琐,docker 环境不能被多个项目复用
优点:可移植,一个镜像即一个完整的项目
# 四、容器编排版
个人感觉容器编排技术脱离的 微服务 是没有意义的,还不如使用 shell 脚本
docker-compose.yml
使用参考:https://www.bilibili.com/video/BV1dP411k7rR/