随着容器化技术的发展,Docker 已经成为开发和部署应用程序的重要工具之一。而 Docker Compose 则为多容器应用提供了便捷的解决方案。对于 Java 开发者来说,掌握 Docker Compose 的使用技巧可以帮助他们更高效地构建、测试和部署基于微服务架构的应用程序。
本文将介绍一些关键的 Docker Compose 编排技巧,并通过具体实践步骤帮助 Java 开发者更好地理解和使用这些功能。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许用户通过 YAML 文件配置应用程序的服务,并一次性创建和启动所有服务。以下是一个简单的 docker-compose.yml
示例:
version: '3.8'
services:
app:
image: openjdk:17-jdk-alpine
build: .
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=dev
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: testdb
在这个例子中:
app
服务是一个基于 OpenJDK 的 Java 应用。db
服务是一个 MySQL 数据库实例。depends_on
指定了 app
服务依赖于 db
服务。假设我们有一个简单的 Spring Boot 项目,其目录结构如下:
my-java-app/
├── Dockerfile
├── docker-compose.yml
└── src/
└── main/
└── java/
└── com/example/demo/DemoApplication.java
在项目根目录下创建 Dockerfile
,内容如下:
# 使用官方 OpenJDK 镜像作为基础镜像
FROM openjdk:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 将当前目录下的文件复制到容器中
COPY target/my-java-app.jar /app/app.jar
# 暴露端口
EXPOSE 8080
# 启动应用程序
CMD ["java", "-jar", "app.jar"]
在项目根目录下创建 docker-compose.yml
,内容如下:
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/testdb?useSSL=false&serverTimezone=UTC
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=example
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: testdb
在项目根目录下运行以下命令:
docker-compose up --build
这将自动构建镜像并启动 app
和 db
两个服务。访问 http://localhost:8080
即可查看运行中的 Java 应用。
可以通过 .env
文件集中管理环境变量,避免硬编码。例如,创建一个 .env
文件:
DB_ROOT_PASSWORD=example
DB_NAME=testdb
然后在 docker-compose.yml
中引用这些变量:
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
为确保服务正常运行,可以为每个服务添加健康检查。例如:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 5
通过 logging
配置集中管理日志输出。例如:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
默认情况下,Compose 会为每个项目创建一个独立的网络。如果需要自定义网络,可以这样配置:
networks:
my-network:
driver: bridge
services:
app:
networks:
- my-network
db:
networks:
- my-network