Backend

99 Ngày Spring — Ngày 90: Docker Compose cho Dev

SSite Admin
25 tháng 10, 2026 2 phút đọc 4 lượt xem
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.

Docker Compose cho Dev

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=down

4. 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/

S

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.

Bài viết liên quan

99 Ngày Java — Ngày 90: Tổ chức Project và Clean Code

Package theo feature, đặt tên nói lên ý định, hàm nhỏ với guard clause và những nguyên tắc clean code dùng được ngay.

25 thg 10, 20263 phút4
99 Ngày Spring — Ngày 89: Docker hóa Spring Boot

Dockerfile nhiều stage, layered jar để tận dụng cache, chạy không dùng root và buildpacks khi không muốn viết Dockerfile.

23 thg 10, 20263 phút7
99 Ngày Java — Ngày 89: Mockito

mock, stub và verify, @Mock với @InjectMocks, ArgumentCaptor và những gì không nên mock.

23 thg 10, 20263 phút7