Spring Boot 集成 Docker 构建与发版完整指南

Spring Boot 集成 Docker 构建与发版完整指南

  • 一、环境准备
    • [1. 安装 Docker](#1. 安装 Docker)
    • [2. 验证安装](#2. 验证安装)
  • [二、Spring Boot 项目配置](#二、Spring Boot 项目配置)
    • [1. 添加 Maven 插件](#1. 添加 Maven 插件)
    • [2. 创建 Dockerfile](#2. 创建 Dockerfile)
    • [3. 多阶段构建优化(可选)](#3. 多阶段构建优化(可选))
  • 三、构建与运行
    • [1. 构建 Docker 镜像](#1. 构建 Docker 镜像)
    • [2. 运行容器](#2. 运行容器)
    • [3. 验证应用](#3. 验证应用)
  • 四、高级配置
    • [1. 使用 Docker Compose](#1. 使用 Docker Compose)
    • [2. 集成 CI/CD(GitHub Actions 示例)](#2. 集成 CI/CD(GitHub Actions 示例))
  • 五、生产环境最佳实践
    • [1. 镜像优化](#1. 镜像优化)
    • [2. 安全加固](#2. 安全加固)
    • [3. 健康检查](#3. 健康检查)
    • [4. 日志管理](#4. 日志管理)
  • 六、常见问题解决
    • [1. 时区问题](#1. 时区问题)
    • [2. 内存限制](#2. 内存限制)
    • [3. 多环境配置](#3. 多环境配置)
  • [七、Kubernetes 部署(可选)](#七、Kubernetes 部署(可选))
    • [1. 创建 deployment.yaml](#1. 创建 deployment.yaml)
    • [2. 创建 service.yaml](#2. 创建 service.yaml)
    • [3. 部署到 Kubernetes](#3. 部署到 Kubernetes)

一、环境准备

1. 安装 Docker

  • Windows/macOS:下载 Docker Desktop
  • Linux(以Ubuntu为例):
bash 复制代码
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker

2. 验证安装

bash 复制代码
docker --version
docker-compose --version
docker run hello-world

二、Spring Boot 项目配置

1. 添加 Maven 插件

在 pom.xml 中添加 Docker 构建插件:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.4.13</version>
            <executions>
                <execution>
                    <id>default</id>
                    <goals>
                        <goal>build</goal>
                        <goal>push</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <repository>${docker.image.prefix}/${project.artifactId}</repository>
                <tag>${project.version}</tag>
                <buildArgs>
                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

2. 创建 Dockerfile

在项目根目录创建 Dockerfile:

dockerfile 复制代码
# 使用 OpenJDK 官方镜像作为基础镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制构建好的 jar 包到容器中
ARG JAR_FILE
COPY ${JAR_FILE} app.jar

# 暴露端口
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]

3. 多阶段构建优化(可选)

对于生产环境,推荐使用多阶段构建减小镜像体积:

dockerfile 复制代码
# 构建阶段
FROM maven:3.8.4-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 运行阶段
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

三、构建与运行

1. 构建 Docker 镜像

bash 复制代码
# 先打包项目
mvn clean package

# 构建 Docker 镜像
mvn dockerfile:build

# 或者直接使用 docker 命令
docker build -t my-spring-app:1.0.0 .

2. 运行容器

bash 复制代码
# 运行容器
docker run -d -p 8080:8080 --name my-app my-spring-app:1.0.0

# 查看运行日志
docker logs -f my-app

3. 验证应用

访问 http://localhost:8080 查看应用是否正常运行

四、高级配置

1. 使用 Docker Compose

创建 docker-compose.yml 文件:

yaml 复制代码
version: '3.8'

services:
  app:
    image: my-spring-app:1.0.0
    container_name: spring-app
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    volumes:
      - ./logs:/app/logs
    networks:
      - app-network

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

启动服务:

bash 复制代码
docker-compose up -d

2. 集成 CI/CD(GitHub Actions 示例)

创建 .github/workflows/docker-publish.yml:

yaml 复制代码
name: Docker Build and Push

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'temurin'
          
      - name: Build with Maven
        run: mvn clean package
        
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_TOKEN }}
          
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: your-dockerhub-username/my-spring-app:latest

五、生产环境最佳实践

1. 镜像优化

  • 使用 .dockerignore 文件排除不必要的文件:

    .git
    .mvn
    target
    *.iml

2. 安全加固

  • 使用非 root 用户运行:
dockerfile 复制代码
RUN addgroup -S spring && adduser -S spring -G spring
USER spring

3. 健康检查

dockerfile 复制代码
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

4. 日志管理

bash 复制代码
# 查看日志
docker logs my-app

# 持久化日志
docker run -v /path/on/host:/app/logs my-spring-app

六、常见问题解决

1. 时区问题

dockerfile 复制代码
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

2. 内存限制

bash 复制代码
docker run -d -m 512m --memory-swap 1G my-spring-app

3. 多环境配置

bash 复制代码
docker run -e "SPRING_PROFILES_ACTIVE=prod" my-spring-app

七、Kubernetes 部署(可选)

1. 创建 deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-app
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
      - name: spring-app
        image: my-spring-app:1.0.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "512Mi"
            cpu: "500m"

2. 创建 service.yaml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: spring-app-service
spec:
  selector:
    app: spring-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

3. 部署到 Kubernetes

bash 复制代码
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

通过以上步骤,您已经完成了 Spring Boot 项目与 Docker 的完整集成,实现了从开发到生产的全流程容器化部署。

相关推荐
一只叫煤球的猫5 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9655 小时前
tcp/ip 中的多路复用
后端
bobz9656 小时前
tls ingress 简单记录
后端
皮皮林5517 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友7 小时前
什么是OpenSSL
后端·安全·程序员
bobz9657 小时前
mcp 直接操作浏览器
后端
前端小张同学9 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook9 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康10 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在10 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net