Springboot项目Docker 多平台构建指南

Springboot项目Docker 多平台构建指南

本文档介绍 Spring Boot Docker 项目的两种构建方式:命令构建方式Maven 插件构建方式

目录


项目介绍

项目地址

Git 仓库地址 : gitee.com/JianJang/sp...

克隆项目:

bash 复制代码
git clone https://gitee.com/JianJang/springboot-docker.git
cd springboot-docker

项目结构

项目采用标准的 Spring Boot Maven 项目结构,支持 Docker 多平台构建和自动化部署。

bash 复制代码
springboot-docker/
├── src/                          # 源代码目录
│   ├── main/
│   │   ├── java/                 # Java 源代码
│   │   │   └── com/jianjang/springboot/docker/
│   │   │       ├── controller/   # 控制器
│   │   │       │   └── HelloController.java
│   │   │       └── SpringbootDockerApplication.java  # 主启动类
│   │   └── resources/            # 资源文件
│   │       ├── application.yml           # 主配置文件
│   │       ├── application-dev.yml       # 开发环境配置
│   │       ├── application-prod.yml      # 生产环境配置
│   │       └── logback-spring.xml        # 日志配置
│   └── test/                     # 测试代码
│       └── java/
│           └── com/jianjang/springboot/docker/
│               └── SpringbootDockerApplicationTests.java
├── target/                       # Maven 编译输出目录(构建后生成)
│   └── springboot-docker.jar     # 编译后的 JAR 文件
├── build-multi-platform.sh       # Docker 多平台构建脚本
├── deploy.sh                     # 容器部署脚本
├── Dockerfile                    # Docker 镜像构建文件
├── pom.xml                       # Maven 项目配置文件
├── mvnw                          # Maven Wrapper (Unix)
├── mvnw.cmd                      # Maven Wrapper (Windows)
├── DOCKER_BUILD_GUIDE.md         # Docker 构建和部署指南(本文档)
└── HELP.md                       # 项目帮助文档

主要文件说明

构建相关文件
文件 说明
pom.xml Maven 项目配置文件,包含项目依赖和 Docker Maven 插件配置
Dockerfile Docker 镜像构建文件,定义镜像构建步骤
build-multi-platform.sh Docker 多平台构建脚本,支持 amd64 和 arm64 架构
mvnw / mvnw.cmd Maven Wrapper,无需安装 Maven 即可构建项目
部署相关文件
文件 说明
deploy.sh 容器自动化部署脚本,提供完整的部署流程
DOCKER_BUILD_GUIDE.md Docker 构建和部署完整指南(本文档)
源代码文件
文件/目录 说明
src/main/java/ Java 源代码目录
src/main/resources/ 资源文件目录(配置文件、静态资源等)
src/test/java/ 测试代码目录
配置文件
文件 说明
application.yml Spring Boot 主配置文件
application-dev.yml 开发环境配置文件
application-prod.yml 生产环境配置文件
logback-spring.xml Logback 日志配置文件

项目特性

  • Spring Boot 2.3.12 - 基于 Spring Boot 框架
  • Java 8 - 使用 JDK 8 开发
  • Docker 多平台支持 - 支持 amd64 和 arm64 架构
  • 外部化配置 - 支持配置文件外部挂载
  • 日志外部化 - 支持日志目录挂载
  • 自动化部署 - 提供完整的部署脚本
  • Maven 插件集成 - 支持 Maven 生命周期构建

快速开始

  1. 克隆项目

    bash 复制代码
    git clone https://gitee.com/JianJang/springboot-docker.git
    cd springboot-docker
  2. 编译项目

    bash 复制代码
    mvn clean package
  3. 构建 Docker 镜像

    bash 复制代码
    ./build-multi-platform.sh --push
  4. 部署容器

    bash 复制代码
    ./deploy.sh

更多详细信息请参考后续章节。


前置要求

1. 环境要求

  • Docker: 版本 19.03+(支持 Buildx)
  • Maven: 3.6+
  • Java: JDK 8+
  • 操作系统: Linux、macOS 或 Windows(WSL2)

2. 启用 Docker Buildx

Docker Buildx 是 Docker 的多平台构建工具,用于构建支持不同 CPU 架构的镜像。

bash 复制代码
# 检查 buildx 是否可用
docker buildx version

# 如果不可用,需要升级 Docker 到 19.03+ 版本

3. 创建 Buildx Builder

bash 复制代码
# 创建多平台构建器
docker buildx create --name multi-platform-builder --driver docker-container --use

# 启动构建器
docker buildx inspect --bootstrap

方式一:命令构建方式

使用 build-multi-platform.sh 脚本进行构建,这是推荐的方式,支持完整的多平台构建功能。

1. 构建步骤

步骤 1: 编译项目

首先需要编译 Spring Boot 项目,生成 JAR 文件:

bash 复制代码
mvn clean package
步骤 2: 执行构建脚本
bash 复制代码
# 赋予执行权限
chmod +x build-multi-platform.sh

# 基本构建(不推送)
./build-multi-platform.sh

# 构建并推送到镜像仓库
./build-multi-platform.sh --push

# 或使用简写
./build-multi-platform.sh -p

2. 脚本参数说明

参数 说明 示例
-h, --help 显示帮助信息 ./build-multi-platform.sh --help
-p, --push 构建后推送到镜像仓库 ./build-multi-platform.sh --push
--platform PLATFORM 指定构建平台 ./build-multi-platform.sh --platform linux/amd64
--version VERSION 指定镜像版本 ./build-multi-platform.sh --version 1.0.3

3. 环境变量配置

可以通过环境变量覆盖默认配置:

bash 复制代码
# 设置镜像仓库地址(阿里云容器镜像服务)
# 控制台地址: https://cr.console.aliyun.com/cn-hangzhou/instances
export DOCKER_REGISTRY=registry.cn-shanghai.aliyuncs.com

# 设置命名空间(在阿里云容器镜像服务控制台创建)
export DOCKER_NAMESPACE=your-namespace

# 设置镜像名称
export DOCKER_IMAGE_NAME=springboot-docker

# 设置镜像版本
export DOCKER_VERSION=1.0.3

# 设置支持平台(多个平台用逗号分隔)
export DOCKER_PLATFORMS=linux/amd64,linux/arm64

# 是否推送镜像
export PUSH_IMAGE=true

# Docker 仓库认证信息(建议使用环境变量)
export DOCKER_USERNAME=your_username
export DOCKER_PASSWORD=your_password

# 是否自动登录(默认: true)
export AUTO_LOGIN=true

4. 使用示例

示例 1: 构建多平台镜像(不推送)
bash 复制代码
# 1. 编译项目
mvn clean package

# 2. 构建镜像
./build-multi-platform.sh
示例 2: 构建并推送多平台镜像
bash 复制代码
# 1. 编译项目
mvn clean package

# 2. 构建并推送
./build-multi-platform.sh --push
示例 3: 仅构建 amd64 平台并推送
bash 复制代码
./build-multi-platform.sh --platform linux/amd64 --push
示例 4: 使用环境变量构建
bash 复制代码
# 设置环境变量
export DOCKER_VERSION=1.0.3
export PUSH_IMAGE=true
export DOCKER_USERNAME=your_username
export DOCKER_PASSWORD=your_password

# 执行构建
./build-multi-platform.sh

5. 脚本功能特性

  • 自动检查 Docker 运行状态
  • 自动设置和配置 Buildx
  • 自动检查构建产物(JAR 文件)
  • 支持自动登录 Docker 仓库
  • 支持多平台构建(amd64、arm64 等)
  • 详细的日志输出
  • 错误处理和提示

方式二:Maven 插件构建方式

使用 fabric8 docker-maven-plugin 插件进行构建,可以在 Maven 生命周期中自动执行。

1. 插件配置

项目已在 pom.xml 中配置了 fabric8 docker-maven-plugin 插件:

xml 复制代码
<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.43.2</version>
    <configuration>
        <images>
            <image>
                <name>${docker.push.registry}/${docker.image.name}:${project.version}</name>
                <build>
                    <dockerFile>${project.basedir}/Dockerfile</dockerFile>
                    <contextDir>${project.basedir}</contextDir>
                </build>
                <registry>${docker.registry}</registry>
            </image>
        </images>
        <authConfig>
            <username>${docker.username}</username>
            <password>${docker.password}</password>
        </authConfig>
    </configuration>
</plugin>

2. 构建命令

构建镜像(不推送)
bash 复制代码
# 编译并构建 Docker 镜像
mvn clean package docker:build

# 或者分步执行
mvn clean package
mvn docker:build
构建并推送镜像
bash 复制代码
# 构建并推送
mvn clean package docker:build docker:push

# 或者使用 deploy 阶段(如果配置了自动推送)
mvn clean deploy

3. 配置参数说明

pom.xml<properties> 中可以配置以下参数:

参数 说明 默认值
docker.registry Docker 镜像仓库地址 registry.cn-shanghai.aliyuncs.com
docker.namespace 命名空间 your-namespace
docker.image.name 镜像名称 ${project.artifactId}
docker.username Docker 仓库用户名 your-docker-username
docker.password Docker 仓库密码 your-docker-password
docker.platform 构建平台 linux/amd64
阿里云容器镜像服务(ACR)说明

本项目使用**阿里云容器镜像服务(Alibaba Cloud Container Registry,ACR)**作为 Docker 镜像仓库。

控制台地址 : cr.console.aliyun.com/cn-hangzhou...

主要功能:

  • 镜像仓库管理:创建和管理命名空间、镜像仓库
  • 镜像推送和拉取:支持 Docker 镜像的推送和拉取操作
  • 多地域支持:支持多个地域的镜像仓库(如:cn-shanghai、cn-hangzhou 等)
  • 访问控制:支持 RAM 子账号和访问凭证管理
  • 镜像安全扫描:提供镜像安全漏洞扫描功能

镜像地址格式:

xml 复制代码
registry.<地域>.aliyuncs.com/<命名空间>/<镜像名称>:<版本>

示例:

  • 上海地域:registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
  • 杭州地域:registry.cn-hangzhou.aliyuncs.com/your-namespace/springboot-docker:1.0.0

获取访问凭证:

  1. 登录 阿里云容器镜像服务控制台
  2. 进入「访问凭证」页面
  3. 设置固定密码或使用临时登录令牌
  4. 使用用户名和密码进行 Docker 登录

注意事项:

  • 不同地域的镜像仓库地址不同,请根据实际使用的地域配置
  • 建议使用 RAM 子账号和访问凭证,避免使用主账号密码
  • 镜像仓库地址中的地域需要与创建仓库时选择的地域一致

4. 自定义配置

方式 1: 修改 pom.xml

直接编辑 pom.xml 中的 <properties> 节点:

xml 复制代码
<properties>
    <docker.registry>your-registry.com</docker.registry>
    <docker.namespace>your-namespace</docker.namespace>
    <docker.image.name>your-image-name</docker.image.name>
    <docker.username>your-username</docker.username>
    <docker.password>your-password</docker.password>
</properties>
方式 2: 使用 Maven 命令行参数
bash 复制代码
mvn clean package docker:build \
  -Ddocker.registry=your-registry.com \
  -Ddocker.namespace=your-namespace \
  -Ddocker.image.name=your-image-name
方式 3: 使用 settings.xml(推荐用于敏感信息)

~/.m2/settings.xml 中配置:

xml 复制代码
<settings>
    <profiles>
        <profile>
            <id>docker</id>
            <properties>
                <docker.username>your-username</docker.username>
                <docker.password>your-password</docker.password>
            </properties>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>docker</activeProfile>
    </activeProfiles>
</settings>

5. 绑定到 Maven 生命周期

如果需要自动构建,可以取消注释 pom.xml 中的执行配置:

xml 复制代码
<executions>
    <execution>
        <id>build</id>
        <phase>package</phase>
        <goals>
            <goal>build</goal>
        </goals>
    </execution>
    <execution>
        <id>push</id>
        <phase>deploy</phase>
        <goals>
            <goal>push</goal>
        </goals>
    </execution>
</executions>

配置后,执行 mvn package 会自动构建镜像,执行 mvn deploy 会自动推送镜像。

6. 多平台构建限制

注意 : fabric8 docker-maven-plugin 0.43.2 版本对多平台构建的支持有限。虽然配置中包含了 <buildx> 配置,但可能无法完全支持多平台构建。

如果需要多平台构建,建议:

  1. 使用命令构建方式(推荐)
  2. 或升级到支持 buildx 的新版本插件
  3. 或通过环境变量设置默认平台:export DOCKER_DEFAULT_PLATFORM=linux/amd64

配置说明

Dockerfile 说明

项目使用以下 Dockerfile 进行构建:

dockerfile 复制代码
FROM registry.cn-shanghai.aliyuncs.com/your-namespace/openanolis_jdk8:8.8_8u471
LABEL maintainer="your-name <your-email@example.com>"

WORKDIR /usr/local

COPY target/springboot-docker.jar /usr/local/springboot-docker.jar

RUN chmod 755 /usr/local/springboot-docker.jar && \
    mkdir -p /usr/local/logs/springboot-docker && \
    echo "" > /usr/local/logs/springboot-docker/nohup.log

ENV JAVA_OPTS=${JAVA_OPTS}

EXPOSE 8081

ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /usr/local/${APP_NAME}.jar --server.port=${SERVER_PORT} --spring.application.name=${APP_NAME} --spring.config.location=/etc/config/application-prod.yml --spring.profiles.active=${PROFILE_ACTIVE}  --spring.main.allow-bean-definition-overriding=true >/usr/local/logs/${APP_NAME}/nohup.log 2>&1"]

镜像信息

  • 基础镜像 : registry.cn-shanghai.aliyuncs.com/your-namespace/openanolis_jdk8:8.8_8u471
  • 工作目录 : /usr/local
  • JAR 文件 : target/springboot-docker.jar
  • 暴露端口 : 8081
  • 日志目录 : /usr/local/logs(容器内,建议通过挂载到宿主机 /data/logs
  • 配置目录 : /etc/config(容器内,需通过挂载提供)

外部化配置说明

项目支持外部化配置,配置文件通过挂载方式从宿主机提供,实现配置与镜像分离。

配置目录映射
  • 宿主机路径 : /etc/config
  • 容器内路径 : /etc/config
  • 配置文件 : application-prod.yml(或根据环境变量指定的配置文件)
配置文件准备

在宿主机上创建配置目录并准备配置文件:

bash 复制代码
# 创建配置目录
sudo mkdir -p /etc/config

# 创建配置文件(示例)
sudo tee /etc/config/application-prod.yml > /dev/null <<EOF
server:
  port: 8081

spring:
  application:
    name: springboot-docker
  profiles:
    active: prod

# 其他配置...
EOF

# 设置目录权限(确保容器可以读取)
sudo chmod -R 755 /etc/config
运行容器时挂载配置

使用 docker run 命令运行容器时,需要挂载配置目录:

bash 复制代码
docker run -d \
  --name springboot-docker \
  -p 8081:8081 \
  -v /etc/config:/etc/config \
  -e APP_NAME=springboot-docker \
  -e SERVER_PORT=8081 \
  -e PROFILE_ACTIVE=prod \
  -e JAVA_OPTS="-Xms512m -Xmx1024m" \
  registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
使用 Docker Compose 挂载配置

创建 docker-compose.yml 文件:

yaml 复制代码
version: '3.8'

services:
  springboot-docker:
    image: registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
    container_name: springboot-docker
    ports:
      - "8081:8081"
    volumes:
      - /etc/config:/etc/config
    environment:
      - APP_NAME=springboot-docker
      - SERVER_PORT=8081
      - PROFILE_ACTIVE=prod
      - JAVA_OPTS=-Xms512m -Xmx1024m
    restart: unless-stopped

运行:

bash 复制代码
docker-compose up -d
配置目录结构示例
bash 复制代码
/etc/config/
├── application-prod.yml     # 生产环境配置
├── application-dev.yml      # 开发环境配置(可选)
└── logback-spring.xml       # 日志配置(可选)
配置优先级

Spring Boot 配置加载顺序(从高到低):

  1. 命令行参数(--spring.config.location
  2. 环境变量
  3. 挂载的配置文件(/etc/config/application-prod.yml
  4. JAR 包内的默认配置
注意事项
  1. 目录权限 : 确保宿主机 /etc/config 目录对容器可读
  2. 文件格式: 配置文件必须是有效的 YAML 格式
  3. 配置文件存在: 如果挂载的配置文件不存在,应用启动会失败
  4. 配置热更新: 修改配置文件后需要重启容器才能生效
  5. 多环境配置 : 可以通过修改 PROFILE_ACTIVE 环境变量切换不同环境的配置

日志目录挂载说明

项目支持将日志目录挂载到宿主机,实现日志持久化和便于查看。

日志目录映射
  • 宿主机路径 : /data/logs
  • 容器内路径 : /usr/local/logs
  • 日志文件 : nohup.log(应用运行日志)
日志目录准备

在宿主机上创建日志目录:

bash 复制代码
# 创建日志目录
sudo mkdir -p /data/logs

# 设置目录权限(确保容器可以写入)
sudo chmod -R 755 /data/logs

# 可选:设置目录所有者(根据实际情况调整)
# sudo chown -R 1000:1000 /data/logs
运行容器时挂载日志

使用 docker run 命令运行容器时,需要挂载日志目录:

bash 复制代码
docker run -d \
  --name springboot-docker \
  -p 8081:8081 \
  -v /etc/config:/etc/config \
  -v /data/logs:/usr/local/logs \
  -e APP_NAME=springboot-docker \
  -e SERVER_PORT=8081 \
  -e PROFILE_ACTIVE=prod \
  -e JAVA_OPTS="-Xms512m -Xmx1024m" \
  registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
使用 Docker Compose 挂载日志

docker-compose.yml 中添加日志目录挂载:

yaml 复制代码
version: '3.8'

services:
  springboot-docker:
    image: registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
    container_name: springboot-docker
    ports:
      - "8081:8081"
    volumes:
      - /etc/config:/etc/config:ro  # 只读挂载,更安全
      - /data/logs:/usr/local/logs  # 日志目录挂载
    environment:
      - APP_NAME=springboot-docker
      - SERVER_PORT=8081
      - PROFILE_ACTIVE=prod
      - JAVA_OPTS=-Xms512m -Xmx1024m
    restart: unless-stopped
日志目录结构

挂载后,日志文件将保存在宿主机上:

bash 复制代码
/data/logs/
└── springboot-docker/
    └── nohup.log          # 应用运行日志
查看日志

挂载日志目录后,可以直接在宿主机上查看日志:

bash 复制代码
# 实时查看日志
tail -f /data/logs/springboot-docker/nohup.log

# 查看最近 100 行日志
tail -n 100 /data/logs/springboot-docker/nohup.log

# 搜索错误日志
grep -i error /data/logs/springboot-docker/nohup.log

# 查看日志文件大小
du -sh /data/logs/springboot-docker/
日志管理建议
  1. 日志轮转: 建议配置日志轮转,避免日志文件过大

    bash 复制代码
    # 使用 logrotate 配置日志轮转
    sudo tee /etc/logrotate.d/springboot-docker > /dev/null <<EOF
    /data/logs/springboot-docker/nohup.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0644 root root
    }
    EOF
  2. 日志清理: 定期清理旧日志,释放磁盘空间

    bash 复制代码
    # 删除 30 天前的日志
    find /data/logs -name "*.log" -mtime +30 -delete
  3. 磁盘空间监控: 监控日志目录的磁盘使用情况

    bash 复制代码
    # 检查磁盘使用情况
    df -h /data/logs
    du -sh /data/logs/*
注意事项
  1. 目录权限 : 确保宿主机 /data/logs 目录对容器可写
  2. 磁盘空间: 定期检查日志目录的磁盘使用情况,避免磁盘满
  3. 日志轮转: 建议配置日志轮转,避免单个日志文件过大
  4. 性能影响: 日志写入频繁时,建议使用 SSD 或高性能存储
  5. 日志备份: 重要日志建议定期备份到其他存储位置

环境变量

运行容器时可以设置以下环境变量:

变量名 说明 示例
JAVA_OPTS JVM 启动参数 -Xms512m -Xmx1024m
APP_NAME 应用名称 springboot-docker
SERVER_PORT 服务端口 8081
PROFILE_ACTIVE Spring Profile devprod

常见问题

1. Docker Buildx 不可用

问题: 执行脚本时提示 "Docker Buildx 不可用"

解决方案:

  • 升级 Docker 到 19.03+ 版本
  • 检查 Docker 是否正确安装和运行

2. 多平台镜像无法加载到本地

问题 : 构建多平台镜像后无法使用 docker images 查看

原因: 多平台镜像构建后无法直接加载到本地 Docker 环境

解决方案:

  • 使用 --push 参数推送到镜像仓库
  • 或使用 docker buildx imagetools inspect <镜像名> 查看镜像信息

3. 推送镜像时认证失败

问题: 推送镜像时提示认证失败

解决方案:

  • 检查 DOCKER_USERNAMEDOCKER_PASSWORD 是否正确
  • 手动登录:docker login registry.cn-shanghai.aliyuncs.com
  • 检查镜像仓库地址是否正确
  • 访问 阿里云容器镜像服务控制台 检查访问凭证设置
  • 确认命名空间和镜像仓库已创建
  • 如果使用 RAM 子账号,确认已授予相应的权限

4. 找不到构建产物

问题: 脚本提示 "未找到构建产物: target/springboot-docker.jar"

解决方案:

  • 先执行 mvn clean package 编译项目
  • 检查 pom.xml 中的 <finalName> 配置是否与脚本中的 JAR 文件名一致

5. Maven 插件构建失败

问题: 使用 Maven 插件构建时失败

解决方案:

  • 检查 Docker 是否运行:docker info
  • 检查 pom.xml 中的配置是否正确
  • 检查 Dockerfile 路径是否正确
  • 查看 Maven 详细日志:mvn clean package docker:build -X

6. 多平台构建速度慢

问题: 多平台构建耗时较长

原因: 多平台构建需要为每个平台构建镜像,耗时较长

解决方案:

  • 使用 Docker Buildx 的缓存功能
  • 仅构建需要的平台:--platform linux/amd64
  • 使用 CI/CD 环境进行构建

7. 配置文件找不到

问题 : 容器启动失败,提示找不到配置文件 /etc/config/application-prod.yml

原因: 未挂载配置目录或配置文件不存在

解决方案:

  • 确保在运行容器时使用 -v /etc/config:/etc/config 挂载配置目录
  • 检查宿主机 /etc/config 目录是否存在
  • 检查配置文件 application-prod.yml 是否存在
  • 检查配置文件权限:sudo chmod 644 /etc/config/application-prod.yml
  • 如果使用部署脚本,确保配置文件在部署前已准备好

8. 配置目录权限问题

问题: 容器无法读取配置文件,提示权限拒绝

解决方案:

  • 设置配置目录权限:sudo chmod -R 755 /etc/config
  • 设置配置文件权限:sudo chmod 644 /etc/config/*.yml
  • 检查文件所有者,确保容器可以读取
  • 如果使用部署脚本,脚本会自动创建目录,但需要确保配置文件权限正确

9. 配置修改后不生效

问题: 修改了配置文件但应用配置未更新

原因: 配置文件修改后需要重启容器才能生效

解决方案:

  • 重启容器:docker restart springboot-docker
  • 或重新创建容器:docker-compose restart
  • 注意:Spring Boot 不支持配置文件热更新,必须重启应用

10. 日志目录权限问题

问题: 容器无法写入日志文件,提示权限拒绝

解决方案:

  • 设置日志目录权限:sudo chmod -R 755 /data/logs
  • 检查目录所有者,确保容器可以写入
  • 如果使用非 root 用户运行容器,需要调整目录所有者:sudo chown -R 1000:1000 /data/logs

11. 日志文件找不到

问题: 在宿主机上找不到日志文件

原因: 未挂载日志目录或日志目录路径不正确

解决方案:

  • 确保在运行容器时使用 -v /data/logs:/usr/local/logs 挂载日志目录
  • 检查宿主机 /data/logs 目录是否存在
  • 检查容器内日志路径是否正确:docker exec springboot-docker ls -la /usr/local/logs/

12. 日志文件过大

问题: 日志文件占用磁盘空间过大

解决方案:

  • 配置日志轮转(参考日志管理建议)
  • 定期清理旧日志文件
  • 调整日志级别,减少日志输出
  • 使用日志收集工具(如 ELK、Loki 等)进行日志管理

13. 部署脚本执行失败

问题 : 执行 deploy.sh 脚本时失败

解决方案:

  • 检查脚本是否有执行权限:chmod +x deploy.sh
  • 检查 Docker 是否运行:docker info
  • 检查 Docker 仓库认证信息是否正确
  • 查看脚本输出的错误信息,根据提示解决问题
  • 确保有足够的权限创建目录和运行容器

14. 部署脚本无法拉取镜像

问题 : 设置 PULL_LATEST=true 后无法拉取镜像

解决方案:

  • 检查网络连接是否正常
  • 检查 Docker 仓库地址是否正确
  • 检查是否已登录 Docker 仓库:docker login registry.cn-shanghai.aliyuncs.com
  • 检查镜像名称和版本是否正确
  • 检查是否有权限访问该镜像仓库
  • 访问 阿里云容器镜像服务控制台 确认镜像仓库存在
  • 确认命名空间和镜像仓库已正确创建
  • 检查访问凭证是否有效(可在控制台重新设置)

容器部署

本文档提供三种容器部署方式,推荐使用部署脚本方式,它提供了完整的自动化部署流程。

方式一:使用 docker run

手动使用 docker run 命令部署容器。

bash 复制代码
# 确保配置目录和日志目录存在
sudo mkdir -p /etc/config
sudo mkdir -p /data/logs

# 准备配置文件(如果不存在)
# sudo cp src/main/resources/application-prod.yml /etc/config/application-prod.yml

# 运行容器
docker run -d \
  --name springboot-docker \
  -p 8081:8081 \
  -v /etc/config:/etc/config \
  -v /data/logs:/usr/local/logs \
  -e APP_NAME=springboot-docker \
  -e SERVER_PORT=8081 \
  -e PROFILE_ACTIVE=prod \
  -e JAVA_OPTS="-Xms512m -Xmx1024m" \
  registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0

方式二:使用 docker-compose

创建 docker-compose.yml

yaml 复制代码
version: '3.8'

services:
  springboot-docker:
    image: registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
    container_name: springboot-docker
    ports:
      - "8081:8081"
    volumes:
      - /etc/config:/etc/config:ro  # 只读挂载,更安全
      - /data/logs:/usr/local/logs  # 日志目录挂载
    environment:
      - APP_NAME=springboot-docker
      - SERVER_PORT=8081
      - PROFILE_ACTIVE=prod
      - JAVA_OPTS=-Xms512m -Xmx1024m
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8081/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3

运行:

bash 复制代码
docker-compose up -d

方式三:使用部署脚本(推荐)

使用 deploy.sh 脚本进行自动化部署,这是推荐的部署方式,提供了完整的部署流程。

脚本功能特性
  • 自动检查 Docker 运行状态
  • 自动登录 Docker 仓库
  • 自动停止并删除旧容器
  • 自动拉取最新镜像(可选)
  • 自动创建日志和配置目录
  • 自动挂载配置和日志目录
  • 自动检查容器运行状态
  • 详细的日志输出
部署步骤
步骤 1: 赋予执行权限
bash 复制代码
chmod +x deploy.sh
步骤 2: 准备配置文件

确保配置文件存在于宿主机:

bash 复制代码
# 创建配置目录(脚本会自动创建,但建议提前准备配置文件)
sudo mkdir -p /etc/config

# 准备配置文件
sudo cp src/main/resources/application-prod.yml /etc/config/application-prod.yml
步骤 3: 执行部署
bash 复制代码
# 基本部署
./deploy.sh

# 部署并显示日志
./deploy.sh --logs

# 或使用简写
./deploy.sh -l
脚本参数说明
参数 说明 示例
-h, --help 显示帮助信息 ./deploy.sh --help
-l, --logs 部署后显示容器日志 ./deploy.sh --logs
环境变量配置

可以通过环境变量覆盖脚本中的默认配置:

bash 复制代码
# 自动拉取最新镜像
export PULL_LATEST=true

# Docker 仓库认证信息(建议使用环境变量)
export DOCKER_USERNAME=your_username
export DOCKER_PASSWORD=your_password

# Docker 仓库地址(默认从镜像名称提取)
export DOCKER_REGISTRY=registry.cn-shanghai.aliyuncs.com

# 是否自动登录(默认: true)
export AUTO_LOGIN=true
使用示例
示例 1: 基本部署
bash 复制代码
# 直接执行脚本
./deploy.sh

脚本会自动执行以下操作:

  1. 检查 Docker 运行状态
  2. 登录 Docker 仓库
  3. 停止并删除旧容器(如果存在)
  4. 创建日志和配置目录
  5. 启动新容器
  6. 检查容器运行状态
示例 2: 拉取最新镜像后部署
bash 复制代码
# 设置环境变量后执行
PULL_LATEST=true ./deploy.sh
示例 3: 使用自定义认证信息部署
bash 复制代码
# 使用环境变量设置认证信息
DOCKER_USERNAME=your_username \
DOCKER_PASSWORD=your_password \
PULL_LATEST=true \
./deploy.sh
示例 4: 部署并查看日志
bash 复制代码
# 部署后自动显示容器日志
./deploy.sh --logs
脚本配置说明

脚本中的主要配置参数(可在脚本中直接修改):

配置项 说明 默认值
IMAGE_NAME 镜像完整地址 registry.cn-shanghai.aliyuncs.com/your-namespace/springboot-docker:1.0.0
CONTAINER_NAME 容器名称 springboot-docker
HOST_PORT 宿主机端口 8081
CONTAINER_PORT 容器端口 8081
JAVA_OPTS JVM 启动参数 -Xms1024m -Xmx1024m
APP_NAME 应用名称 springboot-docker
SERVER_PORT 服务端口 8081
PROFILE_ACTIVE Spring Profile prod
HOST_LOG_DIR 宿主机日志目录 /data/logs
CONTAINER_LOG_DIR 容器内日志目录 /usr/local/logs
HOST_CONFIG_DIR 宿主机配置目录 /etc/config
CONTAINER_CONFIG_DIR 容器内配置目录 /etc/config
部署流程说明

脚本执行的完整流程:

  1. 检查 Docker: 验证 Docker 是否运行
  2. Docker 登录 : 自动登录到 Docker 仓库(如果 AUTO_LOGIN=true
  3. 清理旧容器: 停止并删除已存在的同名容器和镜像
  4. 拉取镜像 : 如果 PULL_LATEST=true,拉取最新镜像
  5. 创建目录: 自动创建日志和配置目录(如果不存在)
  6. 启动容器: 使用配置的参数启动新容器
  7. 状态检查: 等待容器启动并检查运行状态
  8. 显示信息: 输出容器信息和常用命令
部署后操作

部署成功后,脚本会输出以下信息:

bash 复制代码
容器信息:
NAMES              STATUS          PORTS
springboot-docker  Up 3 seconds    0.0.0.0:8081->8081/tcp

查看日志命令: docker logs -f springboot-docker
查看主机日志目录: ls -lh /data/logs
查看主机配置目录: ls -lh /etc/config
停止容器命令: docker stop springboot-docker
注意事项
  1. 配置文件 : 确保 /etc/config/application-prod.yml 文件存在,否则容器启动会失败
  2. 目录权限: 脚本会自动创建目录,但需要确保有足够的权限
  3. 镜像版本 : 默认使用 1.0.0 版本,如需使用其他版本,修改脚本中的 IMAGE_NAME 变量
  4. 平台选择 : 脚本默认拉取 linux/amd64 平台镜像,如需其他平台,修改脚本中的 --platform 参数
  5. 自动登录 : 建议使用环境变量设置 DOCKER_USERNAMEDOCKER_PASSWORD,避免在脚本中硬编码密码
与手动部署的对比
特性 手动部署 部署脚本
自动化程度 ⭐⭐ ⭐⭐⭐⭐⭐
错误处理 手动 自动
目录创建 手动 自动
容器清理 手动 自动
状态检查 手动 自动
日志输出 详细
推荐场景 测试、调试 生产环境、CI/CD

容器运行

查看日志

bash 复制代码
# 查看容器日志
docker logs -f springboot-docker

# 查看应用日志(从宿主机挂载的日志目录)
tail -f /data/logs/springboot-docker/nohup.log

# 查看最近 100 行日志
tail -n 100 /data/logs/springboot-docker/nohup.log

# 搜索错误日志
grep -i error /data/logs/springboot-docker/nohup.log

停止和删除

bash 复制代码
# 停止容器
docker stop springboot-docker

# 删除容器
docker rm springboot-docker

# 使用 docker-compose
docker-compose down

总结

两种方式对比

特性 命令构建方式 Maven 插件构建方式
多平台支持 ✅ 完整支持 ⚠️ 有限支持
易用性 ⭐⭐⭐⭐ ⭐⭐⭐
集成度 ⭐⭐⭐ ⭐⭐⭐⭐⭐
灵活性 ⭐⭐⭐⭐⭐ ⭐⭐⭐
推荐场景 多平台构建、CI/CD 单平台构建、Maven 集成

推荐使用场景

  • 命令构建方式:

    • 需要构建多平台镜像
    • CI/CD 流水线
    • 需要灵活配置的场景
  • Maven 插件构建方式:

    • 单平台构建
    • 需要与 Maven 生命周期集成
    • 开发环境快速构建

参考资源

相关推荐
家家小迷弟44 分钟前
docker容器内部安装python和numpy的方法
python·docker·numpy
北珣.1 小时前
docker镜像操作
运维·docker·容器·镜像
D***44141 小时前
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上)
java·spring boot·后端
武子康1 小时前
大数据-172 Elasticsearch 索引操作与 IK 分词器落地实战:7.3/8.15 全流程速查
大数据·后端·elasticsearch
疯狂的程序猴1 小时前
iOS 性能检测工具深度解析 多工具协同下的全维度性能检测体系建设
后端
Sally_xy1 小时前
安装 Docker
java·docker·容器
❥ღ Komo·1 小时前
K8S Deployment 详解与实战指南
docker·容器·kubernetes
开心就好20251 小时前
App 上架服务行业的实际工作流程与工具选择 从人工代办到跨平台自动化的转变
后端
我叫黑大帅1 小时前
存储管理在开发中有哪些应用?
前端·后端·全栈