1.创建部署目录结构
reggie-take-out
- mysql-master
- conf
- data
- logs
- mysql-slave
- conf
- data
- logs
- redis
- conf
- redis.conf
- data
- logs
- nginx
- conf
- reggie-server
- docker-compose.yaml
2.完善nginx映射目录
1.运行一个nginx容器
docker run -d --name nginx nginx
2.复制文件
docker cp nginx:/usr/share/nginx/html nginx
docker cp nginx:/etc/nginx/nginx.conf nginx/conf/nginx.conf
docker cp nginx:/var/log/nginx nginx/logs
3.删除容器
docker rm -f nginx
4.修改nginx/conf的nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 瑞吉外卖
server {
listen 80;
server_name localhost;
# 瑞吉外卖前端项目访问
location / {
root /usr/share/nginx/html/dist;
index index.html;
}
# 配置瑞吉外卖(前端访问后端)反向代理并重写url(若访问路径存在api则删除)
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://reggie-server:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
5.将瑞吉外卖的前端文件放入到html中(也就是 5 优化篇 资料中的dist)
3.编写redis的配置文件redis.conf
参照下面链接中的目录即可
下面是redis 6.2.6版本的配置文件
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/logs"
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
requirepass majunjie
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
4.编写docker-compose.yaml
services:
redis:
# 6.2.6
image: redis
container_name: redis
privileged: true
command: redis-server /etc/redis.conf
expose:
- 6379
volumes:
- ./redis/conf/redis.conf:/etc/redis.conf
- ./redis/data:/data
- ./redis/logs:/logs
mysql-master:
image: mysql:8.0.30
container_name: mysql-master
expose:
- 3306
volumes:
- ./mysql-master/conf:/etc/mysql/conf.d
- ./mysql-master/data:/var/lib/mysql
- ./mysql-master/logs:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: root
mysql-slave:
image: mysql:8.0.30
container_name: mysql-slave
expose:
- 3306
volumes:
- ./mysql-slave/conf:/etc/mysql/conf.d
- ./mysql-slave/data:/var/lib/mysql
- ./mysql-slave/logs:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: root
nginx:
image: nginx
container_name: nginx
privileged: true
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
ports:
- 80:80
depends_on:
- reggie-server
reggie-server:
image: mujiu/alpine_eclipse-temurin_jre:17
container_name: reggie-server
command: java -jar /java/reggie-server/reggie_take_out.jar
expose:
- 8080
volumes:
- ./reggie-server:/java/reggie-server
5.修改瑞吉外卖的application.yaml(.yml或者.properties)
docker-compose部署的容器可以内部通信不需要直接指定ip和端口号了,直接输入服务名即可,下面以.yaml为例
server:
port: 8080
spring:
application:
name: reggie_take_out
shardingsphere:
datasource:
names: master,slave
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 这里直接写docker-compose.yaml中mysql主节点的服务名就行
url: jdbc:mysql://mysql-master/reggie?allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
username: root
password: root
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 这里直接写docker-compose.yaml中mysql从节点的服务名
url: jdbc:mysql://mysql-slave/reggie?allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
username: root
password: root
masterslave:
load-balance-algorithm-type: round_robin
name: dataSource
master-data-source-name: master
slave-data-source-names: slave
props:
sql:
show: true
main:
allow-bean-definition-overriding: true
redis:
# 这里直接写docker-compose.yaml中redis的服务名
host: redis
port: 6379
database: 0
password: majunjie
cache:
redis:
time-to-live: 1800000 #设置缓存数据的过期时间
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
global-config:
db-config:
id-type: ASSIGN_ID
reggie:
# 这里存储图片的路径,可以不修改,如需修改docker-compose.yaml中的路径对应修改即可
path: /images
6.构建jre17运行环境(我的项目使用Openjdk17写的,jdk17可以直接跳过)
注:
使用jdk1.8的请修改docker-compose.yaml中的reggie-server的image为jre8的环境,或自己构建镜像
使用jdk17的可以自己手动构建镜像(并不是很难),或者使用我构建好的,我已经将其推送到了dockerhub,所以docker-compose.yaml可以直接使用,无需修改
构建镜像时,下载jre版本换成自己使用的版本就行
7.将瑞吉外卖项目打包为jar包
注:
通过在pom.xml的中可添加reggie_take_out来指定jar包的名字为reggie_take_out.jar
8.将jar包放到部署目录中的reggie-server中
9.最终的目录结构为
reggie-take-out
- mysql-master
- conf
- my.cnf
- data
- logs
- mysql-slave
- conf
- my.cnf
- data
- logs
- redis
- conf
- redis.conf
- data
- logs
- nginx
- conf
- nginx.conf
- html
- dist
- 50x.html
- index.html
- logs
- reggie-server
- reggie-take-out.jar
- docker-compose.yaml
10.启动docker-compose
docker-compose up -d
11.配置mysql主从复制
参考mysql启动后的命令即可
12.在主节点mysql中创建reggie数据库并导入sql
这一步图形化操作即可
13.停止服务后再次启动
# 停止服务
docker-compose down
# 开启服务
docker-compose up -d
14.验证是否搭建成功
# 查询虚拟机ip
ip address
# 在本机浏览器输入查询到的ip
如果出现页面并且可以登录成功,即完成部署
我自己学习使用的黑马瑞吉项目的地址,上文目录内容在projectDeployment文件夹中
沐玖的瑞吉外卖(个人使用)