Cuộn lên đầu trang

Docker Compose Là Gì? Hướng Dẫn Docker Compose Cho Người Mới

ObeGames25/07/20264 lượt xem

Khi triển khai một website hoặc ứng dụng hiện đại, hệ thống thường không chỉ có một container duy nhất. Một dự án có thể bao gồm container chạy mã nguồn, database, Redis, Nginx và nhiều dịch vụ hỗ trợ khác. Nếu phải tạo, cấu hình và khởi động từng container bằng nhiều lệnh riêng biệt, quá trình quản lý sẽ nhanh chóng trở nên phức tạp.

Docker Compose được tạo ra để giải quyết vấn đề này. Công cụ cho phép khai báo toàn bộ thành phần của ứng dụng trong một tệp YAML, sau đó khởi động hoặc dừng cả hệ thống bằng một lệnh duy nhất.

Docker Compose là gì?

Docker Compose là công cụ dùng để định nghĩa và vận hành các ứng dụng gồm nhiều container. Người quản trị có thể mô tả các service, network, volume, port và biến môi trường trong một tệp cấu hình, thường được đặt tên là compose.yaml. Sau đó, Docker Compose đọc tệp này để tạo và quản lý toàn bộ hệ thống.

Ví dụ, một website WordPress có thể cần:

  • Một container chạy WordPress và máy chủ web.
  • Một container chạy MySQL.
  • Một volume lưu dữ liệu database.
  • Một network để WordPress kết nối với MySQL.
  • Một cổng để người dùng truy cập website.

Thay vì chạy từng lệnh docker run riêng, Docker Compose cho phép khai báo tất cả trong cùng một tệp.

Docker Compose hoạt động như thế nào?

Quy trình vận hành Docker Compose thường gồm ba bước:

  1. Viết tệp compose.yaml.
  2. Khai báo các container dưới dạng service.
  3. Chạy lệnh docker compose up.

Khi nhận lệnh, Compose có thể tải image, build image, tạo network, tạo volume và khởi động những container đã khai báo. Docker Compose cũng cung cấp các lệnh để dừng service, xem trạng thái, đọc log, chạy lệnh trong container và tạo lại hệ thống khi cấu hình thay đổi.

Mô hình cơ bản có thể hình dung như sau:

VPS hoặc máy chủ
└── Docker Engine
    └── Docker Compose
        ├── Container Website
        ├── Container Database
        ├── Container Redis
        ├── Network nội bộ
        └── Volume lưu dữ liệu

Docker Compose không phải một công nghệ ảo hóa mới. Công cụ này hoạt động phía trên Docker Engine để điều phối nhiều container trong cùng một dự án.

Docker Compose khác Docker như thế nào?

Docker là nền tảng dùng để tạo và chạy container. Bạn có thể dùng lệnh docker run để khởi tạo từng container riêng lẻ.

Docker Compose là công cụ hỗ trợ tổ chức nhiều container thành một ứng dụng hoàn chỉnh. Cấu hình được lưu trong tệp YAML nên có thể quản lý bằng Git, sao chép sang VPS khác hoặc chia sẻ cho thành viên trong nhóm.

Ví dụ, để chạy một container Nginx bằng Docker:

docker run -d -p 8080:80 nginx

Khi ứng dụng có thêm MySQL, Redis và dịch vụ backend, bạn sẽ phải viết nhiều lệnh dài. Với Docker Compose, toàn bộ cấu hình được đưa vào compose.yaml, sau đó chỉ cần chạy:

docker compose up -d

Cách cài đặt Docker Compose

Trên Windows, macOS và Linux sử dụng Docker Desktop, Docker Compose được tích hợp cùng Docker Engine và Docker CLI. Trên máy chủ Linux đã cài Docker Engine, bạn có thể cài Compose dưới dạng Docker CLI plugin. Phương pháp cài standalone cũ hiện chỉ được duy trì chủ yếu để tương thích ngược.

Trên Ubuntu hoặc Debian, sau khi đã cấu hình kho phần mềm chính thức của Docker, có thể cài plugin bằng lệnh:

sudo apt update
sudo apt install docker-compose-plugin

Kiểm tra phiên bản:

docker compose version

Các phiên bản Compose hiện đại sử dụng cú pháp có khoảng trắng:

docker compose

Cú pháp cũ:

docker-compose

thuộc dòng Compose v1. Compose hiện nay sử dụng Compose Specification và không còn yêu cầu khai báo trường version ở đầu tệp cấu hình.

Cấu trúc của tệp compose.yaml

Một tệp Docker Compose thường bắt đầu bằng phần services:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

Trong ví dụ này:

  • services chứa danh sách các thành phần của ứng dụng.
  • web là tên service.
  • image xác định container image được sử dụng.
  • ports chuyển tiếp cổng 8080 của VPS đến cổng 80 trong container.

Docker khuyến nghị sử dụng Compose Specification hiện hành để định nghĩa service, network, volume và các tài nguyên liên quan.

Ví dụ Docker Compose cho WordPress và MySQL

Dưới đây là cấu hình dành cho người mới, gồm một container WordPress và một container MySQL:

services:
  db:
    image: mysql:8.4
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    image: wordpress:latest
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
    depends_on:
      db:
        condition: service_healthy

volumes:
  db_data:

Tạo thêm tệp .env trong cùng thư mục:

MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress_user
MYSQL_PASSWORD=mat_khau_database
MYSQL_ROOT_PASSWORD=mat_khau_root

Khởi động hệ thống:

docker compose up -d

Sau đó, truy cập:

http://IP-VPS:8080

Compose tự động tạo một network mặc định cho dự án. Các container trong network này có thể tìm thấy nhau bằng tên service, vì vậy WordPress có thể kết nối đến MySQL thông qua hostname db thay vì sử dụng địa chỉ IP của container. Địa chỉ IP container có thể thay đổi khi container được tạo lại, nhưng tên service vẫn được giữ ổn định.

Giải thích các thành phần quan trọng

Services

Mỗi service thường đại diện cho một thành phần của ứng dụng, chẳng hạn:

services:
  app:
  database:
  redis:
  nginx:

Mỗi service có thể sử dụng image có sẵn hoặc được build từ Dockerfile.

Ports

Cú pháp port thường có dạng:

ports:
  - "8080:80"

Trong đó 8080 là cổng trên VPS và 80 là cổng bên trong container.

Volumes

Volume giúp dữ liệu tồn tại độc lập với vòng đời của container:

volumes:
  - db_data:/var/lib/mysql

Nếu container database bị xóa và tạo lại, dữ liệu vẫn được giữ trong volume. Nếu chỉ lưu dữ liệu vào lớp ghi của container, dữ liệu có thể mất khi container bị loại bỏ.

Environment

environment được dùng để truyền cấu hình vào container:

environment:
  APP_ENV: production
  DB_HOST: db

Có thể lấy giá trị từ tệp .env bằng cú pháp:

DB_PASSWORD: ${DB_PASSWORD}

Tệp .env giúp tách cấu hình khỏi tệp Compose, nhưng mật khẩu quan trọng trong môi trường production nên được quản lý bằng Docker secrets hoặc giải pháp quản lý bí mật chuyên dụng. Docker cảnh báo rằng biến môi trường có thể vô tình xuất hiện trong log hoặc bị nhiều tiến trình truy cập.

Depends_on

depends_on khai báo quan hệ phụ thuộc giữa các service:

depends_on:
  - db

Tuy nhiên, cấu hình ngắn này chỉ kiểm soát thứ tự khởi động; nó không đảm bảo database đã sẵn sàng nhận kết nối. Đối với database, nên cấu hình healthcheck và sử dụng điều kiện service_healthy.

Các lệnh Docker Compose thường dùng

Khởi động toàn bộ dịch vụ ở chế độ nền:

docker compose up -d

Xem container đang hoạt động:

docker compose ps

Xem log:

docker compose logs

Theo dõi log liên tục:

docker compose logs -f

Dừng container nhưng không xóa:

docker compose stop

Khởi động lại container đã dừng:

docker compose start

Dừng và xóa container cùng network của dự án:

docker compose down

Build lại image và cập nhật container:

docker compose up -d --build

Tải phiên bản image mới:

docker compose pull

Chạy lệnh bên trong service:

docker compose exec wordpress bash

Cần đặc biệt cẩn thận với lệnh:

docker compose down -v

Tham số -v có thể xóa cả volume của dự án, dẫn đến mất dữ liệu database nếu chưa sao lưu.

Ưu điểm của Docker Compose

Docker Compose mang lại nhiều lợi ích khi triển khai ứng dụng:

  • Quản lý nhiều container bằng một tệp.
  • Khởi động toàn bộ hệ thống bằng một lệnh.
  • Dễ chia sẻ cấu hình cho người khác.
  • Dễ sao chép dự án sang VPS mới.
  • Tự động tạo network giữa các service.
  • Quản lý volume tập trung.
  • Phù hợp với môi trường phát triển và kiểm thử.
  • Có thể sử dụng trên máy chủ production đơn lẻ.
  • Hỗ trợ tách cấu hình development và production.

Docker Compose có thể ghép nhiều tệp cấu hình bằng tùy chọn -f, cho phép giữ cấu hình cơ bản trong một tệp và ghi đè các thiết lập riêng cho production trong tệp khác.

Ví dụ:

docker compose \
  -f compose.yaml \
  -f compose.production.yaml \
  up -d

Docker Compose có dùng cho production được không?

Docker Compose có thể được sử dụng để triển khai ứng dụng production trên một máy chủ đơn lẻ. Cấu hình production thường cần bổ sung chính sách restart, quản lý secret, backup, healthcheck, giới hạn truy cập mạng, giám sát tài nguyên và quy trình cập nhật image.

Đối với hệ thống phân tán trên nhiều máy chủ, cần đánh giá thêm các nền tảng điều phối container như Kubernetes hoặc Docker Swarm. Docker Compose phù hợp nhất với ứng dụng chạy trên một VPS, máy chủ riêng hoặc môi trường phát triển cục bộ.

Những lỗi người mới thường gặp

Một số vấn đề phổ biến khi sử dụng Compose gồm viết sai khoảng trắng YAML, trùng cổng với dịch vụ khác, quên gắn volume cho database, kết nối bằng localhost thay vì tên service và cho rằng depends_on đồng nghĩa với việc database đã sẵn sàng.

Trong container ứng dụng, localhost chỉ đại diện cho chính container đó. Muốn kết nối đến container database, cần sử dụng tên service như db, mysql hoặc postgres.

Ngoài ra, không nên đưa mật khẩu thật, token Bot Discord hoặc API key lên GitHub. Hãy sử dụng .env, Docker secrets và thêm các tệp nhạy cảm vào .gitignore.

Kết luận

Docker Compose là công cụ giúp định nghĩa và quản lý ứng dụng nhiều container bằng một tệp YAML. Người dùng có thể khai báo website, database, Redis, reverse proxy, volume và network trong cùng một cấu hình, sau đó khởi động toàn bộ hệ thống bằng lệnh docker compose up -d.

Đối với người mới, hãy bắt đầu bằng một dự án gồm hai service, tìm hiểu cách sử dụng port, volume, environment và network trước khi triển khai những hệ thống phức tạp hơn. Đồng thời, cần sao lưu dữ liệu thường xuyên, không lưu mật khẩu trực tiếp trong mã nguồn và luôn kiểm tra log khi container không thể khởi động.

ObeGames cung cấp VPS Hosting và VPS NVMe phù hợp để triển khai Docker Compose, website, database, Bot Discord và các hệ thống ứng dụng hoạt động liên tục.

Chia sẻ:
Có thể bạn quan tâm

Bài viết liên quan