关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结

发布于:2025-04-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

以下是关于 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. 注意事项

  1. 端口映射

    • 宿主机端口(如 8090)需与容器暴露的端口(如 9000)一致。
  2. 权限问题

    • 若需持久化数据,使用 -v 参数挂载目录(如 -v /data:/app/data)。
  3. 优化建议

    • 使用多阶段构建减少镜像体积:
      # 第一阶段:编译应用
      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"]
      
  4. 日志调试

    • 查看容器日志:docker logs -f <容器ID>
    • 进入容器终端:docker exec -it <容器ID> /bin/bash

通过以上步骤,开发者可以快速将 Spring Boot 应用容器化,实现轻量级部署、快速启动和跨环境一致性。Docker 的标准化镜像和容器化技术极大简化了微服务的运维和扩展。