Câu hỏi kinh điển của mọi developer: "Chạy được trên máy tôi mà!" Docker giải quyết vấn đề này bằng cách đóng gói ứng dụng cùng toàn bộ môi trường phụ thuộc vào một container độc lập, đảm bảo ứng dụng chạy nhất quán trên mọi môi trường — từ laptop cá nhân đến server production.
Các Khái Niệm Docker Cần Biết
- Image: Template chỉ đọc để tạo container, giống như file ISO
- Container: Instance đang chạy của một Image
- Dockerfile: File mô tả các bước để build Image
- Docker Hub: Registry lưu trữ và chia sẻ Image công khai
- Docker Compose: Công cụ chạy nhiều container cùng lúc
- Volume: Cơ chế lưu trữ dữ liệu bền vững cho container
Cài Đặt Docker
Tải Docker Desktop tại docker.com. Sau khi cài xong, kiểm tra bằng lệnh:
docker --version
docker run hello-world
Viết Dockerfile Cho Ứng Dụng Spring Boot
Đây là một multi-stage Dockerfile được tối ưu cho Spring Boot:
# Stage 1: Build
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# Stage 2: Run
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Tại sao dùng multi-stage? Stage build cần Maven và JDK (image lớn), nhưng stage run chỉ cần JRE (nhỏ hơn nhiều). Kết quả là image cuối cùng nhẹ hơn đáng kể.
Build và Chạy Image
# Build image
docker build -t my-spring-app:1.0 .
# Chạy container
docker run -d -p 8080:8080 --name spring-app my-spring-app:1.0
# Xem log
docker logs spring-app
# Dừng container
docker stop spring-app
Docker Compose: Chạy Spring Boot + MySQL Cùng Lúc
Tạo file docker-compose.yml tại root project:
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
app:
build: .
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb
SPRING_DATASOURCE_USERNAME: myuser
SPRING_DATASOURCE_PASSWORD: mypass
depends_on:
- mysql
volumes:
mysql_data:
Khởi chạy toàn bộ stack chỉ với một lệnh:
docker-compose up -d
Các Lệnh Docker Thường Dùng
| Lệnh | Chức năng |
|---|---|
docker ps | Xem danh sách container đang chạy |
docker images | Xem danh sách image |
docker exec -it [id] bash | Truy cập vào container |
docker rm [id] | Xóa container |
docker rmi [image] | Xóa image |
docker-compose down -v | Dừng và xóa toàn bộ stack |
Kết Luận
Docker là kỹ năng không thể thiếu cho Java developer trong thời đại microservices và cloud. Bắt đầu từ việc đóng gói ứng dụng Spring Boot đơn giản, sau đó tiến tới Docker Compose và cuối cùng là Kubernetes để quản lý container ở quy mô lớn hơn.
]]>