掌握 Docker 与 Docker Compose 的配置方法,是将应用容器化、实现快速部署的关键一步。本文将详细介绍如何为 SpringBoot 应用编写 Dockerfile 与 docker-compose.yaml 文件,实现从构建镜像到一键启动服务的完整流程。
一、编写 Dockerfile 文件
Dockerfile 是一个文本文件,包含了一系列用于构建 Docker 镜像的指令。
1.1 基础 Dockerfile 示例
以下是一个标准的用于部署 SpringBoot 应用的 Dockerfile 文件:
# 使用 OpenJDK 11 作为基础镜像
FROM openjdk:11-jre-slim
# 在镜像中创建一个目录来存放应用
RUN mkdir /app
# 将构建好的 SpringBoot Jar 包复制到镜像中
COPY target/*.jar /app/app.jar
# 声明容器运行时监听的端口(SpringBoot 应用默认 8080)
EXPOSE 8080
# 指定容器启动时运行的命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
1.2 各指令详解
- FROM:指定基础镜像。对于 Java 应用,通常选择官方的
openjdk 镜像,-jre-slim 版本体积更小。
- RUN:在构建镜像时执行的命令,常用于安装软件、创建目录。
- COPY:将宿主机文件或目录复制到镜像内的指定路径。这里假设 Jar 包位于项目的
target 目录下。
- EXPOSE:声明容器运行时监听的端口号,这只是一个元数据,实际的端口映射在运行容器时定义。
- ENTRYPOINT:指定容器启动为可执行文件时的默认命令,即启动 Java 应用。
二、编写 docker-compose.yaml 文件
docker-compose.yaml 文件用于定义和运行多容器的 Docker 应用。它简化了通过命令管理多个容器的复杂性,特别适合定义服务间的依赖关系。
2.1 基础 docker-compose.yaml 示例
假设你的 SpringBoot 应用依赖于 MySQL 数据库,一个基础的 docker-compose.yaml 配置如下:
version: '3.8'
services:
# 定义 MySQL 数据库服务
mysql:
image: mysql:8.0
container_name: my-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: userpassword
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-network
restart: unless-stopped
# 定义 SpringBoot 应用服务
app:
build: . # 使用当前目录下的 Dockerfile 构建镜像
container_name: my-springboot-app
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb?useSSL=false&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: userpassword
depends_on:
- mysql
networks:
- app-network
restart: unless-stopped
# 定义数据卷,用于持久化 MySQL 数据
volumes:
mysql-data:
# 定义网络,使服务能够在隔离的网络中通信
networks:
app-network:
driver: bridge
2.2 核心配置项说明
- version:指定 Compose 文件的版本。
- services:定义所有需要运行的服务(容器)。
- image / build:
image 指定从现有镜像运行,build 则指定上下文路径来基于 Dockerfile 构建镜像。
- container_name:为容器指定一个自定义名称。
- environment:设置容器内的环境变量,这对于传递数据库连接等配置至关重要。
- ports:将主机端口映射到容器端口,格式为
"主机端口:容器端口"。
- volumes:将主机路径或命名卷挂载到容器内,用于数据持久化。
- networks:指定服务加入的网络,同一个网络下的服务可以直接使用服务名进行通信(如
mysql://mysql:3306)。
- depends_on:声明服务之间的依赖关系,Compose 会先启动依赖的服务。
- restart:定义容器的重启策略,
unless-stopped 表示除非手动停止,否则总是重启。
三、使用与操作流程
完成文件编写后,即可通过 Docker Compose 命令进行一键式操作。
3.1 启动所有服务
在包含 docker-compose.yaml 文件的目录下,执行以下命令:
docker-compose up -d
-d 参数表示在后台运行。
3.2 查看服务状态与日志
# 查看运行中的服务状态
docker-compose ps
# 查看指定服务(如 app)的实时日志
docker-compose logs -f app
3.3 停止并移除服务
# 停止所有服务,但保留容器和数据卷
docker-compose stop
# 停止并移除所有容器、网络(但默认保留数据卷)
docker-compose down
# 停止并移除所有容器、网络、以及在 compose 文件中定义的数据卷
docker-compose down -v
通过以上步骤,你就完成了 SpringBoot 应用从镜像构建到多服务编排的完整 云原生 部署配置。这种方式极大地简化了在开发、测试和生产环境中部署复杂应用的工作流程,是现代化应用交付的标准实践。掌握 SpringBoot 与 Docker 的整合,能够有效提升开发部署效率。
|