以下是关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结:
1. Docker 核心概念
概念 | 描述 | 关系 |
---|---|---|
镜像(Image) | 预定义的只读模板,包含运行环境和配置(如操作系统、依赖库、应用文件)。 | 类似于类,是静态定义,用于创建容器。 |
容器(Container) | 镜像的运行实例,可启动、停止、删除。 | 类似于对象,是动态的实例化实体。 |
仓库(Repository) | 存储镜像的中心(如 Docker Hub),支持版本管理和共享。 | 镜像的存储和分发中心,便于协作和部署。 |
2. 环境准备(Ubuntu 18.04)
2.1 安装 Docker
# 更新系统
sudo apt-get update
# 安装依赖工具
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加 Docker 源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 重新更新并安装 Docker CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker run hello-world
2.2 配置项目目录
# 创建目录并进入
mkdir -p /data/deploy && cd /data/deploy
# 将项目 JAR 文件复制到目录(假设已通过 Maven 打包)
cp /path/to/graalvm-test-0.0.1-SNAPSHOT.jar ./graalvm-test.jar
3. Dockerfile 配置
# 使用官方 JDK 17 镜像作为基础镜像
FROM openjdk:17
# 在容器中创建临时目录并挂载为卷(可选)
VOLUME /tmp
# 将当前目录的 JAR 文件复制到容器根目录
COPY graalvm-test.jar /app/graalvm.jar
# 指定容器启动时执行的命令(运行 JAR 文件并设置端口)
ENTRYPOINT ["java", "-jar", "/app/graalvm.jar", "--server.port=9000"]
4. 构建和运行容器
4.1 构建 Docker 镜像
# 在项目目录下执行(确保 Dockerfile 在当前目录)
docker build -t graalvm-test .
# 查看镜像列表
docker images
4.2 运行容器
# 映射宿主机 8090 端口到容器 9000 端口,并后台运行
docker run -d \
-p 8090:9000 \
--name graalvm-container \
graalvm-test
# 查看运行中的容器
docker ps
5. 验证访问
- 访问 URL:
http://<宿主机IP>:8090/test
(例如:http://192.168.80.138:8090/test
) - 预期输出:
若配置正确,返回应用响应(如"Hello GraalVM!"
)。
6. 关键命令总结
命令 | 描述 |
---|---|
docker build -t <镜像名> . | 根据 Dockerfile 构建镜像 |
docker images | 列出本地所有镜像 |
docker run -d -p <宿主机端口>:<容器端口> <镜像名> | 以后台模式运行容器并映射端口 |
docker ps | 查看正在运行的容器 |
docker stop <容器ID> | 停止指定容器 |
docker rm <容器ID> | 删除指定容器 |
7. 配置文件与参数说明
7.1 Dockerfile 指令
指令 | 作用 | 示例 |
---|---|---|
FROM | 指定基础镜像(如 openjdk:17 ) | FROM openjdk:17 |
VOLUME | 创建可持久化存储的卷(如 /tmp ) | VOLUME /tmp |
COPY | 将文件从本地复制到容器指定路径 | COPY graalvm-test.jar /app/graalvm.jar |
ENTRYPOINT | 容器启动时执行的命令(固定命令) | ENTRYPOINT ["java", "-jar", "/app/graalvm.jar"] |
7.2 docker run
参数
参数 | 描述 |
---|---|
-d | 后台运行容器(守护模式) |
-p | 映射宿主机端口到容器端口(格式:宿主机端口:容器端口 ) |
--name | 指定容器名称 |
-v | 挂载宿主机目录到容器(如 -v /data:/app/data ) |
8. 常见问题与解决方案
问题 | 解决方法 |
---|---|
容器启动失败,端口冲突 | 检查宿主机端口是否被占用,修改 -p 参数中的宿主机端口。 |
镜像构建失败,缺少依赖 | 确保 Dockerfile 中的基础镜像包含必要依赖(如 openjdk:17 包含 Java 环境)。 |
无法访问应用,返回 503 错误 | 检查容器日志:docker logs <容器ID> ,确认应用端口是否正确暴露。 |
9. 总结表格
步骤 | 操作 | 命令示例 |
---|---|---|
安装 Docker | 安装并验证 Docker | sudo apt-get install docker-ce && docker run hello-world |
构建镜像 | 根据 Dockerfile 生成镜像 | docker build -t graalvm-test . |
运行容器 | 启动容器并映射端口 | docker run -d -p 8090:9000 --name graalvm-container graalvm-test |
访问应用 | 通过宿主机 IP 和映射端口访问 | curl http://<宿主机IP>:8090/test |
10. 注意事项
-
端口映射:
- 宿主机端口(如
8090
)需与容器暴露的端口(如9000
)一致。
- 宿主机端口(如
-
权限问题:
- 若需持久化数据,使用
-v
参数挂载目录(如-v /data:/app/data
)。
- 若需持久化数据,使用
-
优化建议:
- 使用多阶段构建减少镜像体积:
# 第一阶段:编译应用 FROM maven:3.8.4 AS builder COPY src /app/src COPY pom.xml /app WORKDIR /app RUN mvn clean package # 第二阶段:运行环境 FROM openjdk:17 COPY --from=builder /app/target/graalvm-test.jar /app/ ENTRYPOINT ["java", "-jar", "/app/graalvm-test.jar"]
- 使用多阶段构建减少镜像体积:
-
日志调试:
- 查看容器日志:
docker logs -f <容器ID>
- 进入容器终端:
docker exec -it <容器ID> /bin/bash
- 查看容器日志:
通过以上步骤,开发者可以快速将 Spring Boot 应用容器化,实现轻量级部署、快速启动和跨环境一致性。Docker 的标准化镜像和容器化技术极大简化了微服务的运维和扩展。