99 Ngày Spring — Ngày 90: Docker Compose cho Dev
Người mới vào dự án thường mất cả buổi để cài đúng phiên bản Postgres, Redis và Kafka. Docker Compose mô tả các dịch vụ đó trong một file, cả đội chạy cùng một phiên bản. Từ Spring Boot 3.1, module spring-boot-docker-compose còn tự chạy file đó khi ứng dụng khởi động và tự cấu hình kết nối.

1. compose.yaml cho ba dịch vụ
Đặt file compose.yaml ở gốc dự án. Ghim tag image theo phiên bản để hôm nay và sáu tháng sau cùng chạy một bản. Named volume giữ dữ liệu Postgres qua các lần khởi động lại. Mật khẩu ở đây chỉ dành cho máy dev và không bao giờ là mật khẩu thật.
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: shop
POSTGRES_USER: shop
POSTGRES_PASSWORD: secret
ports: ["5432:5432"]
volumes: ["pgdata:/var/lib/postgresql/data"]
redis:
image: redis:7-alpine
ports: ["6379:6379"]
kafka:
image: apache/kafka:3.8.0
ports: ["9092:9092"]
volumes:
pgdata:2. spring-boot-docker-compose
Thêm dependency spring-boot-docker-compose ở dạng optional hoặc developmentOnly để nó không đi vào bản đóng gói production. Khi chạy ứng dụng từ IDE hoặc spring-boot:run, Boot tìm compose.yaml, chạy docker compose up, chờ dịch vụ sẵn sàng rồi mới khởi động context. Khi ứng dụng dừng, các container cũng dừng theo. Hành vi này điều chỉnh qua spring.docker.compose.lifecycle-management.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<optional>true</optional>
</dependency>3. Service connection: không cần ghi URL
Boot nhận ra các image quen thuộc qua tên và tự tạo thông tin kết nối: host, cổng đã ánh xạ, tên database, tài khoản. Bạn không cần ghi spring.datasource.url hay địa chỉ Redis cho môi trường dev, và cũng không sợ lệch giữa file compose với file cấu hình. Với image tự build có tên khác, gắn nhãn org.springframework.boot.service-connection để Boot biết nó là loại dịch vụ nào.
# keep containers running between restarts for faster startup
spring.docker.compose.lifecycle-management=start-only
# use another file or stop behaviour when needed
spring.docker.compose.file=./compose.yaml
spring.docker.compose.stop.command=down4. Ranh giới: dev, test và production
Hỗ trợ Compose của Boot mặc định bị bỏ qua khi chạy test. Với integration test, Testcontainers phù hợp hơn: mỗi lần chạy có container sạch, cổng ngẫu nhiên và không phụ thuộc trạng thái trên máy. Compose là công cụ cho máy dev; production cần sao lưu, giám sát và độ sẵn sàng mà một file compose trên máy cá nhân không cung cấp.
Commit compose.yaml cùng mã nguồn; README chỉ cần một lệnh để chạy.
Thêm healthcheck cho dịch vụ khởi động chậm.
Dùng profiles của Compose để bật dịch vụ nặng chỉ khi cần.
docker compose down -v khi muốn bắt đầu lại với dữ liệu trống.
Môi trường dev tốt là môi trường dựng lại được bằng một lệnh. Ngày 91 bước sang chặng production: cấu hình và secret.
Tài liệu đối chiếu
https://docs.spring.io/spring-boot/reference/features/dev-services.html
https://docs.docker.com/compose/
Site Admin
Engineer and writer. Building things with TypeScript and distributed systems.
Bình luận (0)
Bạn cần đăng nhập bằng Google để bình luận.
Hãy là người bình luận đầu tiên.


