Springboot项目Docker 多平台构建指南
本文档介绍 Spring Boot Docker 项目的两种构建方式:命令构建方式 和Maven 插件构建方式。
目录
- 项目介绍
- 前置要求
- 方式一:命令构建方式
- [方式二:Maven 插件构建方式](#方式二:Maven 插件构建方式 "#%E6%96%B9%E5%BC%8F%E4%BA%8Cmaven-%E6%8F%92%E4%BB%B6%E6%9E%84%E5%BB%BA%E6%96%B9%E5%BC%8F")
- 配置说明
- 容器部署
- [方式一:使用 docker run](#方式一:使用 docker run "#%E6%96%B9%E5%BC%8F%E4%B8%80%E4%BD%BF%E7%94%A8-docker-run")
- [方式二:使用 docker-compose](#方式二:使用 docker-compose "#%E6%96%B9%E5%BC%8F%E4%BA%8C%E4%BD%BF%E7%94%A8-docker-compose")
- 方式三:使用部署脚本(推荐)
- 容器运行
- 常见问题
项目介绍
项目地址
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 生命周期构建
快速开始
-
克隆项目
bashgit clone https://gitee.com/JianJang/springboot-docker.git cd springboot-docker -
编译项目
bashmvn clean package -
构建 Docker 镜像
bash./build-multi-platform.sh --push -
部署容器
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
获取访问凭证:
- 登录 阿里云容器镜像服务控制台
- 进入「访问凭证」页面
- 设置固定密码或使用临时登录令牌
- 使用用户名和密码进行 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> 配置,但可能无法完全支持多平台构建。
如果需要多平台构建,建议:
- 使用命令构建方式(推荐)
- 或升级到支持 buildx 的新版本插件
- 或通过环境变量设置默认平台:
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 配置加载顺序(从高到低):
- 命令行参数(
--spring.config.location) - 环境变量
- 挂载的配置文件(
/etc/config/application-prod.yml) - JAR 包内的默认配置
注意事项
- 目录权限 : 确保宿主机
/etc/config目录对容器可读 - 文件格式: 配置文件必须是有效的 YAML 格式
- 配置文件存在: 如果挂载的配置文件不存在,应用启动会失败
- 配置热更新: 修改配置文件后需要重启容器才能生效
- 多环境配置 : 可以通过修改
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/
日志管理建议
-
日志轮转: 建议配置日志轮转,避免日志文件过大
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 -
日志清理: 定期清理旧日志,释放磁盘空间
bash# 删除 30 天前的日志 find /data/logs -name "*.log" -mtime +30 -delete -
磁盘空间监控: 监控日志目录的磁盘使用情况
bash# 检查磁盘使用情况 df -h /data/logs du -sh /data/logs/*
注意事项
- 目录权限 : 确保宿主机
/data/logs目录对容器可写 - 磁盘空间: 定期检查日志目录的磁盘使用情况,避免磁盘满
- 日志轮转: 建议配置日志轮转,避免单个日志文件过大
- 性能影响: 日志写入频繁时,建议使用 SSD 或高性能存储
- 日志备份: 重要日志建议定期备份到其他存储位置
环境变量
运行容器时可以设置以下环境变量:
| 变量名 | 说明 | 示例 |
|---|---|---|
JAVA_OPTS |
JVM 启动参数 | -Xms512m -Xmx1024m |
APP_NAME |
应用名称 | springboot-docker |
SERVER_PORT |
服务端口 | 8081 |
PROFILE_ACTIVE |
Spring Profile | dev 或 prod |
常见问题
1. Docker Buildx 不可用
问题: 执行脚本时提示 "Docker Buildx 不可用"
解决方案:
- 升级 Docker 到 19.03+ 版本
- 检查 Docker 是否正确安装和运行
2. 多平台镜像无法加载到本地
问题 : 构建多平台镜像后无法使用 docker images 查看
原因: 多平台镜像构建后无法直接加载到本地 Docker 环境
解决方案:
- 使用
--push参数推送到镜像仓库 - 或使用
docker buildx imagetools inspect <镜像名>查看镜像信息
3. 推送镜像时认证失败
问题: 推送镜像时提示认证失败
解决方案:
- 检查
DOCKER_USERNAME和DOCKER_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
脚本会自动执行以下操作:
- 检查 Docker 运行状态
- 登录 Docker 仓库
- 停止并删除旧容器(如果存在)
- 创建日志和配置目录
- 启动新容器
- 检查容器运行状态
示例 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 |
部署流程说明
脚本执行的完整流程:
- 检查 Docker: 验证 Docker 是否运行
- Docker 登录 : 自动登录到 Docker 仓库(如果
AUTO_LOGIN=true) - 清理旧容器: 停止并删除已存在的同名容器和镜像
- 拉取镜像 : 如果
PULL_LATEST=true,拉取最新镜像 - 创建目录: 自动创建日志和配置目录(如果不存在)
- 启动容器: 使用配置的参数启动新容器
- 状态检查: 等待容器启动并检查运行状态
- 显示信息: 输出容器信息和常用命令
部署后操作
部署成功后,脚本会输出以下信息:
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
注意事项
- 配置文件 : 确保
/etc/config/application-prod.yml文件存在,否则容器启动会失败 - 目录权限: 脚本会自动创建目录,但需要确保有足够的权限
- 镜像版本 : 默认使用
1.0.0版本,如需使用其他版本,修改脚本中的IMAGE_NAME变量 - 平台选择 : 脚本默认拉取
linux/amd64平台镜像,如需其他平台,修改脚本中的--platform参数 - 自动登录 : 建议使用环境变量设置
DOCKER_USERNAME和DOCKER_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 生命周期集成
- 开发环境快速构建