Docker cho Database: MySQL, PostgreSQL, Redis

Photo of author

Văn Ngọc Tân

Docker cho Database: MySQL, PostgreSQL, Redis

Bạn có biết?

Bạn có biết rằng việc chạy database trong Docker giống như có một tủ lạnh chuyên dụng cho từng loại thực phẩm vậy? MySQL như ngăn đông lạnh, PostgreSQL như ngăn mát, còn Redis như ngăn đá khô. Mỗi container database được setup chỉ trong vài giây, bạn chỉ cần gõ lệnh là có ngay một database sẵn sàng sử dụng.

MySQL

Chạy MySQL Container

docker run -d --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=app \
  -e MYSQL_PASSWORD=apppass \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

Kết nối

docker exec -it mysql-db mysql -u root -p
  • Connection: localhost:3306

Environment variables quan trọng

  • MYSQL_ROOT_PASSWORD — password cho user root (bắt buộc)
  • MYSQL_DATABASE — tự động tạo database khi khởi động
  • MYSQL_USER / MYSQL_PASSWORD — tạo user thường

PostgreSQL

Chạy PostgreSQL Container

docker run -d --name postgres-db \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=mydb \
  -e POSTGRES_USER=app \
  -p 5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  postgres:15

Kết nối

docker exec -it postgres-db psql -U app -d mydb
  • Connection: localhost:5432

Environment variables quan trọng

  • POSTGRES_PASSWORD — password cho user postgres (bắt buộc)
  • POSTGRES_DB — tạo database mặc định
  • POSTGRES_USER — tạo user thường

Redis

Chạy Redis Container

docker run -d --name redis-cache \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:7

Redis với password

docker run -d --name redis-cache \
  -e REDIS_PASSWORD=secret \
  -p 6379:6379 \
  redis:7

Kết nối

docker exec -it redis-cache redis-cli
redis-cli -a secret
  • Connection: localhost:6379
  • Port mặc định: 6379

Persistence

Redis hỗ trợ hai mode lưu trữ:

  • RDB — Snapshot định kỳ
  • AOF — Append-only file (an toàn hơn)

Dùng image redis:7-alpine để tiết kiệm dung lượng.

Database server racks
Database server trong data center — mỗi container Docker là một instance database độc lập

Docker Compose cho Full Stack

Đây là file Docker Compose để chạy cả MySQL, PostgreSQL và Redis cùng lúc:

version: "3.8"
services:
  mysql:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - db-network
  
  postgres:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - db-network
  
  redis:
    image: redis:7
    networks:
      - db-network

volumes:
  mysql-data:
  postgres-data:
networks:
  db-network:
    driver: bridge

Best Practices cho Database

1. Dùng volumes cho data

KHÔNG lưu data trong container layer. Dùng named volumes để data tồn tại sau khi xóa container:

-v mysql-data:/var/lib/mysql

2. Không dùng :latest

Luôn chỉ định version cụ thể để đảm bảo tính nhất quán:

  • mysql:8
  • postgres:15
  • redis:7

3. Health checks

Thêm healthcheck vào docker-compose.yml để Docker giám sát trạng thái database:

healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  interval: 10s
  timeout: 5s
  retries: 5

4. Backup strategy

Tạo script backup tự động lưu data ra ngoài container. Đặt backup folder ở host hoặc mount từ cloud storage.

5. Security

  • Đặt strong passwords, không dùng password đơn giản
  • Với production, dùng Docker Secrets để quản lý password an toàn
  • Hạn chế quyền truy cập qua network

So sánh nhanh

Database Port mặc định Image phổ biến Use case
MySQL 3306 mysql:8 Web apps truyền thống
PostgreSQL 5432 postgres:15 Enterprise, analytics
Redis 6379 redis:7 Cache, session

Bước tiếp theo

Tiếp theo, bạn sẽ tìm hiểu cách sử dụng Docker trong CI/CD Pipeline để tự động hóa quy trình build và deploy ứng dụng.

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận