基于 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