# 一、系统环境
# 1. 目录介绍
/opt
├── /common-tool 主要存放项目运行所依赖环境,全局公用(也可作部分项目私有)
│ └── nginx
| └── html 项目前端代码(dist包)
│ └── nacos 主要是docker挂载到宿主机的持久化数据
│ └── influxdb1 同上
│ └── influxdb2 同上
│ └── mqtt 同上
│ └── redis 同上
│ └── ...
├── /kunyi 存放项目jar包等(目前只放后端)
# 2. 系统环境介绍
# Java运行时环境
# 版本
root@KY-S-Server-01:/opt/common-tool# java -version
openjdk version "1.8.0_442"
OpenJDK Runtime Environment (build 1.8.0_442-8u442-b06~us1-0ubuntu1~22.04-b06)
OpenJDK 64-Bit Server VM (build 25.442-b06, mixed mode)
# 路径
root@KY-S-Server-01:/opt/common-tool# whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
# Docker环境
# 版本
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# docker --version
Docker version 20.10.24, build 297e128
# 镜像源
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors":
[
"https://1p98x5qc.mirror.aliyuncs.com",
"https://registry.cn-shenzhen.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker.hlmirror.com"
]
}
# 注意,镜像源如果不可用,请 vim /etc/docker/daemon.json 更换,注意,切换镜像源后,需要重启dammon和重启docker服务
`sudo systemctl daemon-reload`
`sudo systemctl restart docker`
# 或者可以在docker pull的时候临时指定镜像源
`docker pull <mirror-url>/<image-name>:<tag>`
`docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest`
# Python环境
# 版本
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# python -V
Python 3.10.12
# 路径
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# whereis python
python: /usr/bin/python
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# whereis python3
python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3 /usr/share/man/man1/python3.1.gz
# Matlab运行时环境
# 路径及版本
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# which matlab
/usr/local/bin/matlab
/usr/local/MATLAB/R2021b/
# 二、项目依赖环境
# 1. 介绍
# 查看项目依赖环境(docker)
docker ps --filter "name=^mysql5.7$" \
--filter "name=^nginx$" \
--filter "name=^mqtt$" \
--filter "name=^nacos$" \
--filter "name=^redis$" \
--filter "name=^influxdb2$" \ 江苏java后端微服务(if necessary )
--filter "name=^jiangsu" \
| IMAGE | PORTS | NAMES |
|---|---|---|
| jiangsu-lab-docker | 0.0.0.0:5049->5049/tcp, :::5049->5049/tcp | jiangsu-lab-server |
| influxdb:2.7.6 | 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp | influxdb2 |
| redis:7.0.5 | 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp | redis |
| eclipse-mosquitto | 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp | mqtt |
| nacos/nacos-server:v2.0.3 | 0.0.0.0:5055->5055/tcp, :::5055->5055/tcp, 8848/tcp | nacos |
| mysql:5.7 | 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp | mysql5.7 |
| nginx | 0.0.0.0:5014->80/tcp, :::5014->80/tcp | nginx |
# 2. 环境部署
# 1) Nginx
# docker容器
# 先执行一次默认nginx,以获取nginx默认配置文件
docker run -d -p 80:80 --name nginxTemp nginx
# Copy相关文件夹及文件至宿主机
mkdir -p /opt/common-tool/nginx/html
mkdir -p /opt/common-tool/nginx/conf
mkdir -p /opt/common-tool/nginx/log
docker cp nginx:/usr/share/nginx/html /opt/common-tool/nginx/
docker cp nginx:/var/log/nginx /opt/common-tool/nginx/log
docker cp nginx:/etc/nginx /opt/common-tool/nginx/conf
# 删掉临时nginx的docker
docker rm nginxTemp
# 容器启动
docker run -d -p 80:80 --name nginx --restart=always \
-v "/opt/common-tool/nginx/html:/usr/share/nginx/html" \
-v "/opt/common-tool/nginx/conf:/etc/nginx" \
-v "/opt/common-tool/nginx/log:/var/log/nginx" \
nginx
## 注意:
如果出现报错“open() “/etc/nginx/nginx.conf“ failed (2: No such file or directory)”,是宿主机不存在相关文件的缘故。
## 参考文章:
https://blog.csdn.net/weixin_45876462/article/details/128273148
https://blog.csdn.net/weixin_45876462/article/details/128273148#:~:text=Windows%E7%8E%AF%E5%A2%83%E4%B8%8B%20Docker%20Desktop%20%E5%AE%89%E8%A3%85%20Nginx%201%201.%20%E5%AE%89%E8%A3%85Docker,nginx%2Flogs%20%E6%97%A5%E5%BF%97%E7%9B%91%E6%B5%8B%20...%205%205.%20%E6%B5%8B%E8%AF%95%20%E4%BF%AE%E6%94%B9H%3A%5CEnvironment%5Cdocker%5Cmydata%5Cnginx%5Chtml%5Cindex.html%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E3%80%82%20%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA
# nginx配置
# nginx主要转发规则的配置(部分)
按照项目区分,根路径:/opt/common-tool/nginx/conf/projects,一个项目一个配置文件
# 文件: /opt/common-tool/nginx/conf/projects/jiangsu-lab.conf
# 原理: 因为外部环境只给了一个端口(搭配域名),所以服务器内部用url前缀来区别转发
# 注意:以江苏仿真实验室的配置为例,尽量要严格按照如下的转发规则配置,否则可能会转发失败(坑点很多)。
# 江苏仿真实验室
server {
listen 80;
server_name 192.168.0.195;
location /jiangsu-lab {
alias /usr/share/nginx/html/jiangsu-lab/;
try_files $uri $uri/ /jiangsu-lab/index.html;
index index.html index.htm;
}
location /jiangsu-lab/prod-api {
rewrite ^/jiangsu-lab/prod-api(.*)$ $1 break;
proxy_pass http://192.168.0.195:5049;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 600s;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
# Nginx首页(默认根目录配置)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
server {
listen 80;
server_name kunyienergy.com;
location /jiangsu-lab {
# rewrite ^/jiangsu-lab(/.*)$ $1 break;
# root /usr/share/nginx/html;
alias /usr/share/nginx/html/jiangsu-lab/;
try_files $uri $uri/ /jiangsu-lab/index.html;
index index.html index.htm;
}
location /jiangsu-lab/prod-api {
rewrite ^/jiangsu-lab/prod-api(.*)$ $1 break;
proxy_pass http://192.168.0.195:5049;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 600s;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
# Nginx首页(默认根目录配置)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
# 2) Mysql
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...
# 容器启动
docker run --privileged=true --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Ytzn@888#2022#@ -d \
-v /opt/common-tool/mysql5.7/data:/var/lib/mysql \
-v /opt/common-tool/mysql5.7/conf:/etc/mysql/ \
-v /opt/common-tool/mysql5.7/log:/var/log/mysql \
--restart=always mysql:5.7
# mysql配置
# 文件: /opt/common-tool/mysql5.7/conf/mysqld.cnf
# 注意,docker容器启动时可能使用的是默认配置文件 /etc/my.cnf (容器内的路径),如果挂载的配置文件没有生效,请直接修改容器内的这个配置文件
[mysqld]
lower_case_table_names = 1
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=1000
max_allowed_packet = 200M
innodb_buffer_pool_size=2G
innodb_flush_log_at_trx_commit=2
transaction_isolation=READ-COMMITTED
read_rnd_buffer_size=1M
innodb_io_capacity_max = 8000
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_log_file_size = 32M
innodb_log_buffer_size=16M
log-bin=mysql-binlog
server-id=1
default-time_zone='+8:00'
skip-log-bin
disable-log-bin
[mysqldump]
max_allowed_packet = 200M
[mysql]
no-auto-rehash
max_allowed_packet = 200M
# 数据库
mysql> show databases;
+------------------------------+
| Database |
+------------------------------+
| information_schema |
| cloud-lab-energy-acquisition |
| cloud-lab-nacos-config | nacos数据库(全局公用)
| jiangsu-common | 江苏实验室...
| jiangsu-lab | ...
| jiangsu-query |
| jiangsu-schedule |
| mysql |
| performance_schema |
| sys |
+------------------------------+
# 3) Nacos
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...
# 容器启动
docker run -d \
--name nacos \
-e MODE=standalone \
-p 5055:5055 \
-v /opt/common-tool/nacos/logs/:/home/nacos/logs \
-v /opt/common-tool/nacos/conf/:/home/nacos/conf/ \
--restart=always \
nacos/nacos-server:v2.0.3
# 参考文章 https://blog.csdn.net/web2u/article/details/145107436
# 应用
nacos访问地址: http://192.168.0.195:5055/nacos/index.html
user/password: nacos/K---已脱敏----23!
注意:不同项目的配置文件请用GROUP隔离
# 4) Redis
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...
# 容器启动
docker run -d --name=redis \
-v /opt/common-tool/redis/redis.conf:/etc/redis/redis.conf \
-v /opt/common-tool/redis/data:/data \
--workdir=/data -p 6379:6379 --restart=always redis:7.0.5 \
redis-server /etc/redis/redis.conf
# 5) Mqtt
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...
# 容器启动
docker run -d --name=mqtt --volume=/opt/common-tool/mqtt/mosquitto.conf:/mosquitto/config/mosquitto.conf -p 1883:1883 --restart=always eclipse-mosquitto /usr/sbin/mosquitto -c /mosquitto/config/mosquitto.conf
# 6) InfluxDB1
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...
# 容器启动
docker run -d -p 8084:8083 -p8085:8086 --name influxdb1 --restart=always influxdb:1.8.4
# 7) InfluxDB2
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...
# 方法1. 容器启动(命令启动,这里面参数要注意)
docker run --name=influxdb2
--env=DOCKER_INFLUXDB_INIT_MODE=setup --env=DOCKER_INFLUXDB_INIT_USERNAME=admin --env='DOCKER_INFLUXDB_INIT_PASSWORD=Ytzn@@2024##IFX' --env=DOCKER_INFLUXDB_INIT_ORG=YaTong --env=DOCKER_INFLUXDB_INIT_BUCKET=YaTong-Bucket --volume=/home/ubuntu/influxdb2/config:/etc/influxdb2:rw --volume=/home/ubuntu/influxdb2/data:/var/lib/influxdb2:rw --network=influxdb2_default -p 8086:8086 --restart=always --label='com.docker.compose.project=influxdb2' --label='com.docker.compose.service=influxdb' --label='com.docker.compose.project.config_files=docker-compose.yml' --label='com.docker.compose.config-hash=6760cc649b196ceb5dba3a2f112051c0e464caad62da7684d24e5e352b0ed020' --label='com.docker.compose.oneoff=False' --label='com.docker.compose.version=1.29.1' --label='com.docker.compose.container-number=1' --label='com.docker.compose.project.working_dir=/home/ubuntu/influxdb2' --runtime=runc --detach=true influxdb:2 influxd
# 方法2. 以docker-compose.yml启动 (/opt/common-tool/influxdb2/docker-compose.yml)
cd /opt/common-tool/influxdb2
sudo docker-compose up -d
# 注意:目前是将云服务器的infludb2镜像端过来启动的。所以里面有云服务器的全部数据。
# 3. 项目部署
# 3.1 介绍
路径 : /opt/kunyi 项目的微服务数据、配置全部在此路径下
# 3.2 仿真实验室:微服务
# 1) 进入Dockerfile文件所在路径,先build镜像
cd /Dockerfile文件的同级路径 docker build -t jiangsu-lab-docker .
# 附1: Dockfile
# 使用 OpenJDK 1.8 官方镜像作为基础镜像
FROM openjdk:8-jre-alpine
# 设置工作目录
WORKDIR /app
# 将宿主机的 jar 包目录挂载到容器的工作目录(更新代码,直接在宿主机上换jar包货class文件后,重启docker即可)
VOLUME /opt/kunyi/jiangsu-lab/server:/app
# 开放5049端口
EXPOSE 5049
# 启动容器时执行的默认命令,按顺序启动 jar 包
# CMD ["sh", "-c", "java -jar /app/cloud-gateway.jar && java -jar /app/cloud-common.jar && java -jar /app/cloud-laboratory-core.jar && java -jar /app/cloud-data-gateway.jar && java -jar /app/cloud-data.jar && java -jar /app/cloud-query.jar && java -jar /app/cloud-schedule.jar"]
# 赋予启动脚本执行权限
COPY run-server.sh /app/
RUN chmod +x /app/run-server.sh
# 调试:列出文件
RUN ls -l /app/run-server.sh
# 启动容器时执行的默认命令
CMD ["/app/run-server.sh"]
# 附2: run-server.sh(jar包微服务的脚本运行文件)
#!/bin/sh
# 用于启动项目的脚本
# updateTime:20240712
# created by sundi
# 开启UTF-8编码
export LANG=en_US.UTF-8
echo "正在执行程序,请勿关闭窗口......"
# 切换到微服务jar包的目录下
cd /app
# ------------------------ 设置变量 Start --------------------------------
# 设置服务器地址、端口等多个变量(仅在本脚本有效)
JAR_DIR="/app"
LOCAL_HOST="127.0.0.1"
MYSQL_PORT=3306
NACOS_PORT=5055
KUNYI_CLOUD_GATEWAY_PORT=5049
CLOUD_COMMON_PORT=5066
CLOUD_LAB_PORT=5048
CLOUD_DATA_GATEWAY_PORT=5044
CLOUD_DATA_PORT=5045
CLOUD_QUERY_PORT=5041
CLOUD_SCHEDULE_PORT=5013
# 设置重试次数和超时时间(秒)
MAX_RETRIES=6000
TIMEOUT=3
# ------------------------ 设置变量 End --------------------------------
# ------------------------ 启动Cloud-Gateway Start --------------------------------
echo "正在启动微服务:cloud-gateway......"
nohup java -Dfile.encoding=utf-8 -jar "$JAR_DIR/cloud-gateway.jar" > ./logs/cloud-gateway.run.log 2>&1 &
RETRY_COUNT=0
while ! nc -z $LOCAL_HOST $KUNYI_CLOUD_GATEWAY_PORT; do
echo "cloud-gateway is starting..."
sleep $TIMEOUT
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "启动超过重试次数,退出尝试......"
exit 1
fi
done
echo "微服务:cloud-gateway启动成功......"
# ------------------------ 启动Cloud-Gateway End --------------------------------
# ------------------------ 启动Cloud-common Start --------------------------------
echo "正在启动微服务:cloud-common......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-common.jar" > ./logs/cloud-common.run.log 2>&1 &
RETRY_COUNT=0
while ! nc -z $LOCAL_HOST $CLOUD_COMMON_PORT; do
echo "cloud-common is starting..."
sleep $TIMEOUT
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "启动超过重试次数,退出尝试......"
exit 1
fi
done
echo "微服务:cloud-common启动成功......"
# ------------------------ 启动Cloud-common End --------------------------------
# ------------------------ 启动Cloud-lab Start --------------------------------
echo "正在启动微服务:cloud-lab......"
nohup java -Dfile.encoding=utf-8 -server -Xms2000m -Xmx2000m -jar "$JAR_DIR/cloud-laboratory-core.jar" > ./logs/cloud-laborator.run.log 2>&1 &
RETRY_COUNT=0
while ! nc -z $LOCAL_HOST $CLOUD_LAB_PORT; do
echo "cloud-lab is starting..."
sleep $TIMEOUT
RETRY_COUNT=$((RETRY_COUNT + 1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "启动超过重试次数,退出尝试......"
exit 1
fi
done
echo "微服务:cloud-lab启动成功......"
# ------------------------ 启动Cloud-lab End --------------------------------
# ------------------------ 启动cloud-data-gateway Start --------------------------------
echo "正在启动微服务:cloud-data-gateway......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-data-gateway.jar" > ./logs/cloud-data-gateway.run.log 2>&1 &
echo "微服务:cloud-data-gateway启动成功......"
sleep 20
# 这个cloud-data-gateway 不开启端口,所以无法监听端口来确认它是否启动。所以这里用sleep的方法来模拟等待!!!
# ------------------------ 启动cloud-data-gateway End --------------------------------
# ------------------------ 异步启动剩余Cloud服务 Start --------------------------------
# 剩下的Service不需要同步启动,可以异步进行
echo "正在启动微服务:cloud-data......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-data.jar" > ./logs/cloud-data.run.log 2>&1 &
echo "微服务:cloud-data启动成功......"
echo "正在启动微服务:cloud-query......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-query.jar" > ./logs/cloud-query.run.log 2>&1 &
echo "微服务:cloud-query启动成功......"
echo "正在启动微服务:cloud-schedule......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-schedule.jar" > ./logs/cloud-schedule.run.log 2>&1 &
echo "微服务:cloud-schedule启动成功......"
# ------------------------ 异步启动剩余Cloud服务 End --------------------------------
# echo "正在启动微服务:cloud-matlab......"
# nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-matlab.jar" > ./logs/cloud-matlab.run.log 2>&1 &
# echo "微服务:cloud-matlab启动成功......"
sleep 20
echo "全部项目启动完毕!"
wait
# 2) 启动项目微服务容器
docker run -d \
--name jiangsu-lab-server -p 5049:5049 \
-v /opt/kunyi/jiangsu-lab/server:/app jiangsu-lab-docker
# 三、已部署
| 项目 | url | 用户名/密码 | 备注 |
|---|---|---|---|
| 江苏仿真实验室 | http://kunyienergy.com:15014/jiangsu-lab/ http://192.168.0.195:5014/jiangsu-lab/ | * | |
| 辽宁仿真实验室 | http://kunyienergy.com:15014/liaoning-lab http://192.168.0.195:5014/liaoning-lab/ | * | 待部署 |
| 光储直柔系统设计 | http://kunyienergy.com:15014/gczr-pro http://192.168.0.195:5014/gczr-pro/ | * | 待部署 |
| 江苏普查工具 | ...... | * | 待部署 |
| 电能替代规划系统 | ...... | * | 待部署 |
| 全流域科研项目 | ...... | * | 待部署 |
# 四、其他
# 精准匹配查出仿真实验室需要启动的容器的命令
docker ps --filter "name=^mysql5.7$" --filter "name=^nginx$" --filter "name=^mqtt$" --filter "name=^nacos$" --filter "name=^redis$" --filter "name=^influxdb2$" --filter "name=^jiangsu"
# docker hub源,持续更新
https://blog.csdn.net/u014390502/article/details/143472743
# 启动influxDB的docker镜像
sudo docker-compose up -d