基于 Docker+Docker-Compose 的 SpringBoot 项目标准化部署(外置 application-prod.yml 配置方案)

基于 Docker+Docker-Compose 的 SpringBoot 项目标准化部署(外置 application-prod.yml 配置方案)

一、服务器检查Docker和Docker-compose

shell 复制代码
docker -v
docker-compose -v

# 1. 安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 启动Docker并设置开机自启
systemctl start docker && systemctl enable docker

# 2. 安装docker-compose(新版Docker自带,如执行命令报错再装)
yum install -y docker-compose-plugin

二、项目中存放Dockerfile以及docker-compose.yml

存放项目路径如:

三、编辑完成后的Dockerfile以及docker-compose.yml上传至服务器

存放路径如(一般服务软件放在/opt下面):

注:一般项目过多,会将docker-compose.yml存放在外层目录中,如

/opt/construction-admin

|---docker-compose.yml # 整体配置,看起来更整洁

|---applet # 新建一个目录来存放java项目的jar包和配置文件

|------Dockerfile

|------application-prod.yml

|------construction-applet-admin-0.0.1-SNAPSHOT.jar

四、Dockerfile配置示例

dockerfile 复制代码
# 基础镜像:精简的JDK运行环境,无需编译,只运行jar包
FROM openjdk:11-jre-slim
# 维护者信息(可选)
MAINTAINER construction-applet-admin
# 设置工作目录
WORKDIR /app
# ========== 必加配置(解决项目常见问题) ==========
# 1. 同步服务器上海时区,解决Java项目中时间差/时区不一致问题
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 2. 解决项目中文乱码问题
ENV LANG=C.UTF-8
# ========== 核心新增:创建容器内配置目录,存放外置的application-prod.yml ==========
RUN mkdir -p /app/config
# ========== 核心:复制服务器当前目录的jar包到容器内 ==========
# 服务器当前目录的jar包 → 容器内重命名为app.jar(简化启动命令)
COPY ./construction-applet-admin-0.0.1-SNAPSHOT.jar ./app.jar
# 复制服务器的【外置prod配置文件】到容器的/config目录下
COPY ./application-prod.yml ./config/application-prod.yml

# ========== 生产级JVM优化参数(必配,防止内存溢出) ==========
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/heapdump.hprof"

# 暴露项目端口 【必改】改成你项目的真实端口,比如8080/9090/8888
EXPOSE 18083

# 优雅启动Java项目
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar app.jar --spring.config.additional-location=/app/config/ --spring.profiles.active=prod"]

五、docker-compose.yml配置示例

dockerfile 复制代码
version: '3' # docker-compose版本,兼容主流Docker版本
services:
  # ======== Redis服务 ========
  redis-server:
    image: redis:7.0-alpine # Redis镜像,alpine版本精简,体积小,推荐
    container_name: construction-redis # 容器名,自定义
    restart: always # 容器异常退出自动重启
    ports:
      - "6379:6379" # 宿主机端口:容器端口,本地可以通过localhost:6379连接Redis
    volumes:
      # Redis数据持久化:宿主机目录映射容器目录,数据保存在本地,容器删了数据还在
      - ./redis/data:/data
      # Redis配置文件映射(可选,如需自定义Redis配置,在项目根目录建redis/conf,放redis.conf)
      - ./redis/conf:/usr/local/etc/redis
    command: redis-server --requirepass redis@123 --appendonly yes # 核心指令
    # --requirepass 123456:Redis密码,必须和Java项目application.yml里的Redis密码一致!!!
    # --appendonly yes:开启Redis持久化(AOF模式),数据不丢失
    networks:
      - construction-network # 自定义网络,和Java容器同网段
    environment:
      - TZ=Asia/Shanghai # 时区同步

  # ======== Java后端项目服务 ========
  construction-applet-admin:
    build: . # 关键:当前目录(项目根目录)找Dockerfile,自动构建Java项目镜像
    image: construction-applet-admin:latest # 构建后的镜像名,自定义
    container_name: construction-applet-admin # 容器名,自定义
    restart: always # 容器异常退出自动重启
    ports:
      - "18083:18083" # 宿主机端口:Java项目端口,必须和Dockerfile的EXPOSE端口一致!!!
    volumes:
      # Java项目日志持久化:宿主机目录映射容器日志目录,方便查看日志
      - ./logs:/logs  # /logs是logback中配置的日志输出路径
      - ./application-prod.yml:/app/config/application-prod.yml # 外置配置文件映射
    depends_on:
      - redis-server # 核心依赖:必须等redis-server启动完成,才启动本服务
    networks:
      - construction-network # 和Redis在同一个自定义网络
    environment:
      - TZ=Asia/Shanghai # 时区同步

# 自定义网络,容器间通过服务名通信(比如Java项目用redis-server访问Redis)
networks:
  construction-network:
    driver: bridge

注:一般项目过多,会将docker-compose.yml存放在外层目录中,此时配置如

dockerfile 复制代码
version: '3' # docker-compose版本,兼容主流Docker版本
services:
  # ======== Redis服务 ========
  redis-server:
    image: redis:7.0-alpine # Redis镜像,alpine版本精简,体积小,推荐
    container_name: construction-redis # 容器名,自定义
    restart: always # 容器异常退出自动重启
    ports:
      - "6379:6379" # 宿主机端口:容器端口,本地可以通过localhost:6379连接Redis
    volumes:
      # Redis数据持久化:宿主机目录映射容器目录,数据保存在本地,容器删了数据还在
      - ./redis/data:/data
      # Redis配置文件映射(可选,如需自定义Redis配置,在项目根目录建redis/conf,放redis.conf)
      - ./redis/conf:/usr/local/etc/redis
    command: redis-server --requirepass redis@123 --appendonly yes # 核心指令
    # --requirepass 123456:Redis密码,必须和Java项目application.yml里的Redis密码一致!!!
    # --appendonly yes:开启Redis持久化(AOF模式),数据不丢失
    networks:
      - construction-network # 自定义网络,和Java容器同网段
    environment:
      - TZ=Asia/Shanghai # 时区同步

  # ======== Java后端项目服务 ========
  construction-applet-admin:
    build: ./applet # 关键:当前目录(项目根目录)找Dockerfile,自动构建Java项目镜像
    image: construction-applet-admin:latest # 构建后的镜像名,自定义
    container_name: construction-applet-admin # 容器名,自定义
    restart: always # 容器异常退出自动重启
    ports:
      - "18083:18083" # 宿主机端口:Java项目端口,必须和Dockerfile的EXPOSE端口一致!!!
    volumes:
      # Java项目日志持久化:宿主机目录映射容器日志目录,方便查看日志
      - ./applet/logs:/logs  # /logs是logback中配置的日志输出路径
      - ./applet/application-prod.yml:/app/config/application-prod.yml # 外置配置文件映射
    depends_on:
      - redis-server # 核心依赖:必须等redis-server启动完成,才启动本服务
    networks:
      - construction-network # 和Redis在同一个自定义网络
    environment:
      - TZ=Asia/Shanghai # 时区同步

# 自定义网络,容器间通过服务名通信(比如Java项目用redis-server访问Redis)
networks:
  construction-network:
    driver: bridge

六、外置配置文件application-prod.yml配置注意

yml 复制代码
spring:
  redis:
    host: redis-server  # 参考docker-compose.yml配置
    port: 6379   # 容器内服务端口
    password: redis@123    # 参考docker-compose.yml配置

七、常用命令

shell 复制代码
# 执行重启命令-重新构建镜像并启动
docker-compose up -d --build
# 修改配置后重启Java服务
docker-compose restart construction-applet-admin
# 查看容器运行状态
docker-compose ps
# 查看项目日志,确认无报错
docker-compose logs -f construction-applet-admin
# 停止所有容器
docker-compose stop
# 停止+删除容器(彻底重启)
docker-compose down
相关推荐
Hx_Ma163 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode3 小时前
原子操作类LongAdder
java·开发语言
舟舟亢亢4 小时前
Java集合笔记总结
java·笔记
小酒窝.4 小时前
【多线程】多线程打印ABC
java
乡野码圣4 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
JAVA+C语言4 小时前
如何优化 Java 多主机通信的性能?
java·开发语言·php
编程彩机6 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
xxxmine6 小时前
redis学习
数据库·redis·学习
小酒窝.6 小时前
【多线程】多线程打印1~100
java·多线程
君爱学习6 小时前
基于SpringBoot的选课调查系统
java