Chào mừng các bạn đã quay trở lại với series "Bắt đầu với Docker"! Trong suốt 5 phần vừa qua, chúng ta đã cùng nhau xây dựng một nền tảng kiến thức khá vững chắc: từ việc hiểu container là gì, cài đặt Docker trên các hệ điều hành khác nhau, làm quen với các lệnh quản lý container cơ bản, cho đến cách tự tay xây dựng image với Dockerfile và chia sẻ chúng lên Docker Hub. Có thể nói, giờ đây bạn đã có thể tự mình "đóng gói" ứng dụng và chạy chúng trong các container một cách độc lập.
Tuy nhiên, trong thực tế phát triển phần mềm, rất ít ứng dụng chỉ đơn giản là một container đơn lẻ. Hãy thử tưởng tượng một ứng dụng web điển hình: nó cần một container chạy web server (như Nginx để phục vụ file tĩnh), một container chạy mã nguồn backend (ví dụ Node.js hoặc Python Flask), và một container khác chạy cơ sở dữ liệu (như PostgreSQL hay MySQL). Đó là chưa kể đến các container phụ trợ như Redis để cache hay RabbitMQ để xử lý hàng đợi.
Lúc này, nếu bạn vẫn dùng phương pháp cũ là gõ từng lệnh docker run với hàng tá tham số phức tạp, bạn chỉ cần viết tất cả cấu hình vào một file duy nhất, thường được đặt tên là docker-compose.yml. Hãy cùng phân tích một ví dụ cụ thể. Giả sử chúng ta muốn xây dựng một blog đơn giản sử dụng WordPress. WordPress cần hai thứ: một web server có PHP chạy mã nguồn WordPress, và một cơ sở dữ liệu MySQL để lưu trữ nội dung. Nếu chạy thủ công, bạn sẽ cần ít nhất hai lệnh version: '3.8'
services:
db:
volumes:
restart: always
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_USER: wordpress
wordpress:
- db
ports:
restart: always
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
db_data: {}
Bây giờ, hãy mổ xẻ từng thành phần:
- version: Dòng đầu tiên khai báo phiên bản cú pháp của file Compose. Phiên bản 3.x là phiên bản mới nhất và phổ biến nhất hiện nay.
- services: Đây là phần quan trọng nhất, nơi chúng ta liệt kê các container (gọi là service) sẽ được chạy.
- db và wordpress: Đây là tên do bạn tự đặt cho các service. Docker Compose sẽ dùng tên này để quản lý và cho phép các service giao tiếp với nhau (ví dụ: WordPress có thể kết nối tới database bằng tên host là db).
- image: Chỉ định image nào sẽ được dùng để tạo container. Trong ví dụ, chúng ta dùng image mysql:5.7 và wordpress:latest từ Docker Hub.
- volumes (trong service db): Khai báo một volume tên db_data (được định nghĩa ở cuối file) sẽ được gắn vào đường dẫn /var/lib/mysql bên trong container MySQL. Đây là nơi MySQL lưu dữ liệu. Nhờ có volume này, dữ liệu sẽ không bị mất đi khi container bị xóa.
- restart: Chính sách khởi động lại. always có nghĩa là container sẽ tự động khởi động lại nếu nó dừng hoặc khi máy tính khởi động lại.
- environment: Đây là cách chúng ta truyền biến môi trường vào container, dùng để cấu hình username, password, database name... cho MySQL và WordPress.
- ports: Ánh xạ cổng từ máy host vào container. "8000:80" có nghĩa là truy cập vào http://localhost:8000 trên máy tính của bạn sẽ được chuyển tiếp tới cổng 80 của container WordPress.
- depends_on: Nói cho Compose biết service wordpress phụ thuộc vào service db. Điều này đảm bảo rằng container db sẽ được khởi động trước container wordpress.
Vận hành ứng dụng với Docker Compose
Sau khi đã có file docker-compose.yml hoàn chỉnh, việc vận hành ứng dụng trở nên cực kỳ đơn giản.
Khởi động ứng dụng
Mở Terminal trong thư mục chứa file docker-compose.yml và gõ:
docker-compose up
Lệnh này sẽ đọc file, tải image (nếu chưa có), tạo network và volume, rồi khởi động tất cả các container. Bạn sẽ thấy log của tất cả các container được in ra màn hình. Để chạy ngầm ở chế độ nền (detached mode), bạn thêm tùy chọn -d:
docker-compose up -d
Xem trạng thái các container
Lệnh này cho bạn biết service nào đang chạy, ánh xạ cổng ra sao, trạng thái thế nào.
Khi không dùng nữa, bạn có thể dừng tất cả các container và network mà Compose đã tạo bằng lệnh:
Lưu ý: Lệnh này sẽ xóa container và network, nhưng không xóa volume. Nếu muốn dọn dẹp cả volume, bạn dùng:
Xem log
docker-compose logs -f [tên_service]
Docker Compose không chỉ là một công cụ giúp giảm bớt gõ lệnh. Nó còn mang lại những lợi ích to lớn trong quy trình phát triển phần mềm chuyên nghiệp:
- Tách biệt môi trường: Bạn có thể có nhiều file Compose khác nhau cho các môi trường dev, staging, production, hoặc tạo nhiều bản copy biệt lập trên cùng một máy.
- Đơn giản hóa onboarding: Thành viên mới trong team chỉ cần cài Docker và gõ docker-compose.yml cho dự án hiện tại của bạn và cảm nhận sự khác biệt!