基于 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
相关推荐
say_fall2 小时前
泛型编程基石:C++ 模板从入门到熟练
java·开发语言·c++·编辑器·visual studio
代码笔耕2 小时前
写了几年 Java,我发现很多人其实一直在用“高级 C 语言”写代码
java·后端·架构
txinyu的博客2 小时前
结合游戏场景解析UDP可靠性问题
java·开发语言·c++·网络协议·游戏·udp
一路向北North2 小时前
springboot基础(85): validator验证器
java·spring boot·后端
1.14(java)2 小时前
掌握数据库约束:确保数据精准可靠
java·数据库·mysql·数据库约束
Codeking__2 小时前
Redis——value的数据类型与单线程工作模型
java·数据库·redis
人道领域2 小时前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
wxr06162 小时前
部署Spring Boot项目+mysql并允许前端本地访问
前端·spring boot·mysql·持续部署
名字不好奇2 小时前
在C++中 如何实现java中的Stream
java·c++