Tại Sao Java Developer Cần Biết Docker?

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ệnhChức năng
docker psXem danh sách container đang chạy
docker imagesXem danh sách image
docker exec -it [id] bashTruy cập vào container
docker rm [id]Xóa container
docker rmi [image]Xóa image
docker-compose down -vDừ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.

]]>