基于 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
相关推荐
%KT%5 分钟前
ubuntu系统部署docker
运维·docker·容器
hweiyu0013 分钟前
Redis命令:LPOS
redis·缓存
yangmu320316 分钟前
Unity 开发过程与底层原理
java·开发语言
lexiangqicheng18 分钟前
自定义表单跨端共用机制-PC设计APP渲染
java·前端·javascript
guo_wen_qiang18 分钟前
云服务器redis主从复制-哨兵模式
运维·服务器·redis
zhikouai21 分钟前
AI辅助逆向工程链路:从二进制接入到等价性校验
java·linux·前端
for_ever_love__25 分钟前
LangGraph State 设计:多节点之间怎么安全地共享数据
redis·mysql·状态模式·checkpoint·state·状态图·langgraph
十二同学啊32 分钟前
Docker 容器化技术详解:镜像、容器、网络与应用部署设计
网络·docker·eureka
随性而行36033 分钟前
企业微信API接口开发实战:如何实现消息回调接收与业务事件处理?
java·前端·python·微信·机器人·企业微信
美味蛋炒饭.35 分钟前
java八股面试(3)
java·开发语言·面试