Docker 部署 Spring Boot 项目(含 MySQL + Redis )

注意事项:如果需要将 Spring Boot 项目的日志文件挂载到本地,则在打包前需要先在 yml 进行如下配置:

logging:
  file:
    path: /app/logs
  level:
    root: info

这里的 info 指的是日志等级,可以根据需要进行修改,日志等级主要有以下几种:

  1. trace:最低的日志级别,用于记录非常详细的信息,通常仅在诊断问题时使用。
  2. debug:用于调试信息,通常在开发过程中使用。
  3. info:用于显示信息,这些信息是应用程序正常运行所需要的。
  4. warn:用于显示可能的问题或警告信息,这些信息可能会影响应用程序的正常运行。
  5. error:用于显示错误信息,这些信息表明应用程序发生了严重错误。
  6. fatal:最高的日志级别,用于显示致命的错误信息,这些信息表明应用程序无法继续运行。

在生产环境上,一般建议使用以下日志级别:

  1. info:这是默认的日志级别,可以显示应用程序正常运行所需要的必要信息。
  2. error:用于记录错误信息,这些信息表明应用程序发生了严重错误。

根据实际需求,可以进一步调整日志级别,以满足不同的监控和故障排查需求。

1. 创建 Docker 网络

docker network create backend-network

backend-network指的是网络名称,根据自己需要进行更改

2. 启动 MySQL 容器

docker run -d \
	--network backend-network \
	--name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=root \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --restart always \
  mysql:5.7 
  • -d:后台运行容器,保证在退出终端后容器继续运行
  • --network:容器使用的网络,这里的名称要跟上面创建的 Docker 网络名称一致,如果未指定网络,通常会使用默认的 bridge 网络
  • –name:容器名,此处命名为mysql
  • -p:端口映射,此处映射 主机3306端口 到 容器的3306端口
  • -e TZ=Asia/Shanghai:配置信息,此处设置了时区为上海
  • -e MYSQL_ROOT_PASSWORD=root:配置信息,此处设置mysql的root用户的登陆密码
  • -v ./mysql/conf:/etc/mysql/conf.d:将宿主机上的 ./mysql/conf 目录挂载到容器的 /etc/mysql/conf.d 目录,在宿主机上修改 MySQL 的配置文件,这些更改会反映到容器内
  • -v ./mysql/data:/var/lib/mysql:将宿主机上的 ./mysql/data 目录挂载到容器的 /var/lib/mysql 目录,这是 MySQL 的数据目录,所有数据库的数据都会存储在这里
  • -v ./mysql/init:/docker-entrypoint-initdb.d:将宿主机上的 ./mysql/init 目录挂载到容器的 /docker-entrypoint-initdb.d 目录,这个目录中的文件会在容器启动时被执行,通常用于初始化数据库或进行其他设置
  • --restart always: 设置容器的重启策略为"总是",表示当容器退出时,它会自动重启
  • mysql:5.7:指定了要运行的 Docker 镜像的名称和标签,即 MySQL 的 5.7 版本

3. 进入容器,设置远程连接

sudo docker exec -it mysql bash

4. 登录MySQL

mysql -uroot -proot
# 添加远程连接用户
alter user 'root'@'%' identified with mysql_native_password by 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
# 刷新权限
flush privileges;

5. 在 root 目录下新建一个 redis 文件夹,再在 redis 文件夹里创建 conf 文件夹和 data 文件夹,并将 Redis 的配置文件放入 conf 文件夹

Docker 部署 Spring Boot 项目(含 MySQL + Redis )_第1张图片

Redis 配置文件内容(仅作参考,根据自己的需求进行更改):

# Redis 配置文件示例

# 网络相关设置
bind 0.0.0.0        # 监听所有网络接口,允许远程连接
port 6379           # Redis 监听的端口
protected-mode no   # 禁用保护模式

# 通用设置
daemonize yes       # 以守护进程方式运行 Redis
pidfile /var/run/redis/redis-server.pid   # PID 文件路径
logfile /var/log/redis/redis-server.log   # 日志文件路径

# 数据库快照
save 900 1          # 如果 900 秒内至少有 1 个键被修改,则保存数据库
save 300 10
save 60 10000

# 认证
# 如果需要密码认证,请取消下一行的注释,并设置一个强密码
# requirepass your_strong_password

# 性能
rdbcompression yes  # 压缩 RDB 文件
maxmemory 2GB       # Redis 可以使用的最大内存量
maxmemory-policy volatile-lru  # 达到 maxmemory 时的淘汰策略
maxclients 10000    # 最大连接客户端数

# 追加写入模式
appendonly yes       # 启用追加写入文件以进行持久化
appendfilename "appendonly.aof"  # 追加写入文件名

# 安全性
# 如果 Redis 在公共网络上,请使用防火墙等其他手段确保安全
# 请注意启用密码认证以保护 Redis 数据

# 快照
stop-writes-on-bgsave-error yes   # 如果最后一次保存失败,则停止所有写入

# 杂项
dir /var/lib/redis   # Redis 工作目录

6. 在命令行进入 root 文件夹,启动 Redis 容器

docker run -d --name redis -p 6379:6379 \
  -v ./redis/conf/redis.conf:/etc/redis/redis.conf \
  -v ./redis/data:/data \
  --network backend-network \
  -e TZ=Asia/Shanghai \
  --restart always \
  redis:5.0 redis-server /etc/redis/redis.conf
  • -d:以后台(detached)模式运行容器。
  • --name redis:将容器命名为 redis
  • -p 6379:6379:将主机的6379端口映射到容器的6379端口
  • -v ./redis/conf/redis.conf:/etc/redis/redis.conf:将本地Redis配置文件 ./redis/conf/redis.conf 挂载到容器内的 /etc/redis/redis.conf 文件
  • -v ./redis/data:/data:将本地目录 ./redis/data 挂载到容器内的 /data 目录,通常用于持久化Redis数据
  • --network backend-network:将容器连接到名为 backend-network 的 Docker 网络
  • -e TZ=Asia/Shanghai:设置容器的时区为亚洲/上海
  • --restart always:配置容器始终自动重启,除非显式停止
  • redis:5.0:使用Docker Hub上的Redis 5.0版本镜像
  • redis-server /etc/redis/redis.conf:指定在容器内运行的命令,即使用提供的配置文件启动Redis服务器

7. 编写 Dockerfile 文件

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 暴露9090端口
EXPOSE 9090
# 拷贝jar包,这里的jar包名需要根据实际情况进行修改
COPY spring-boot-router-0.0.1-SNAPSHOT.jar /app.jar 
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

8. 在 root 目录下新建一个 springboot 文件夹,将打包好的 jar 包和 Dockerfile 文件放到 springboot 文件夹下

Docker 部署 Spring Boot 项目(含 MySQL + Redis )_第2张图片

9. 在命令行进入 springboot 文件夹,执行命令构建镜像

docker build -t spring-boot-router .
  • -t spring-boot-router-t选项用于为新的Docker镜像指定一个标签(tag),这里给新镜像指定了标签名spring-boot-router
  • .:这表示Dockerfile的位置,.表示Dockerfile在当前目录下

10. 启动 Spring Boot 容器

docker run -d --network backend-network --name spring-boot-router -p 9090:9090 -v ./log:/app/logs --restart always spring-boot-router
  • -d: 后台运行容器,保证在退出终端后容器继续运行
  • --network: 为容器指定一个网络,这里指定的网络是backend-network,要跟上面创建的 Docker 网络名称一致
  • --name: 为容器指定一个名称,这里指定的名称是spring-boot-router
  • -p: 将容器内的9090端口映射到宿主机的9090端口,这样就可以通过宿主机的9090端口访问容器内的服务
  • -v ./log:/app/logs:将当前目录下的log文件夹挂载到容器内的/app/logs路径,即容器内的/app/logs路径下的文件和当前目录下的log文件夹下的文件是共享的,如果不需要保存日志文件,可以不加这个选项
  • --restart always: 设置容器的重启策略为"总是",表示当容器退出时,它会自动重启
  • spring-boot-router: 运行的 Docker 镜像的名称

启动完成后就可以使用服务器 IP 和端口去发起请求

你可能感兴趣的:(docker,spring,boot,mysql,redis)