Vì sao cần Docker Compose ngay? — Quản lý multi-container app chưa bao giờ dễ đến thế
Việc deploy một ứng dụng phức tạp với nhiều thành phần (như WordPress với database và web server riêng) thủ công tốn rất nhiều thời gian và công sức. Mỗi lần thay đổi cấu hình hay di chuyển môi trường là một cơn ác mộng. Docker Compose ra đời để giải quyết triệt để vấn đề này.
- 😩 Thiết lập thủ công tốn thời gian: Cài đặt, cấu hình từng service riêng lẻ.
- 📦 Quản lý dependency phức tạp: Đảm bảo các service hoạt động đúng với nhau.
- 🔄 Khó khăn khi di chuyển môi trường: Cấu hình khác nhau giữa dev, staging, prod.
- 🐛 Debug lỗi liên quan đến kết nối: Tìm nguyên nhân khi các service không “nói chuyện” được.
- 🚀 Triển khai chậm: Mỗi lần update là một quy trình dài.
Tóm gọn: Docker Compose là gì? — Công cụ định nghĩa và chạy ứng dụng multi-container
Docker Compose là một công cụ giúp bạn định nghĩa và quản lý các ứng dụng Docker multi-container. Bạn sử dụng một file docker-compose.yml để cấu hình tất cả các dịch vụ của ứng dụng, sau đó chỉ với một lệnh duy nhất, bạn có thể khởi tạo, chạy, dừng và xây dựng lại tất cả các dịch vụ đó.
File docker-compose.yml — Ngôn ngữ của Docker Compose
File docker-compose.yml là trái tim của Docker Compose. Nó sử dụng cú pháp YAML để mô tả các dịch vụ, mạng và volume cần thiết cho ứng dụng của bạn.
version: '3.8'
services:
db:
image: mysql:8.0
container_name: mysql_db
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_strong_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: your_wordpress_password
networks:
- app_network
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress_app
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: your_wordpress_password
WORDPRESS_DB_NAME: wordpress
networks:
- app_network
networks:
app_network:
driver: bridge
volumes:
db_data:
version: Chỉ định phiên bản của cú pháp Docker Compose.3.8là phiên bản phổ biến và hỗ trợ nhiều tính năng mới.services: Định nghĩa các container (dịch vụ) của ứng dụng.db: Tên của dịch vụ database (MySQL).image: Sử dụng imagemysql:8.0từ Docker Hub.container_name: Đặt tên cố định cho container.volumes: Mount một volume tên làdb_datađể lưu trữ dữ liệu database.restart: always: Tự động khởi động lại container khi nó bị dừng hoặc khi Docker daemon khởi động.environment: Thiết lập các biến môi trường cần thiết cho MySQL (root password, database name, user, password).networks: Kết nối service này vào networkapp_network.
wordpress: Tên của dịch vụ WordPress.depends_on: Đảm bảo dịch vụdbđược khởi động trước dịch vụwordpress.image: Sử dụng imagewordpress:latesttừ Docker Hub.container_name: Đặt tên cố định cho container.ports: Map port8080trên máy host tới port80trong container WordPress.restart: always: Tự động khởi động lại.environment: Thiết lập các biến môi trường cho WordPress để kết nối tới database.networks: Kết nối service này vào networkapp_network.
networks: Định nghĩa các network mà các service sẽ sử dụng.app_networklà một network bridge tùy chỉnh, giúp các container giao tiếp với nhau.volumes: Định nghĩa các volume để lưu trữ dữ liệu.db_datasẽ được Docker quản lý.
💡 Mẹo: Luôn sử dụng mật khẩu mạnh cho database và các biến môi trường nhạy cảm khác. Bạn có thể cân nhắc sử dụng file
.envđể quản lý các biến này.
Tóm gọn: Cài đặt Docker và Docker Compose — Chuẩn bị môi trường
Trước khi sử dụng Docker Compose, bạn cần cài đặt Docker Engine và Docker Compose trên hệ thống của mình. Hướng dẫn này giả định bạn đang sử dụng Ubuntu 22.04/24.04.
Cài đặt Docker Engine
- Cập nhật danh sách gói:
bash
sudo apt update
sudo apt upgrade -y - Cài đặt các gói cần thiết:
bash
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y - Thêm GPG key chính thức của Docker:
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - Thêm kho lưu trữ Docker:
bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - Cài đặt Docker Engine:
bash
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y - Kiểm tra cài đặt Docker:
bash
sudo systemctl status docker
Bạn sẽ thấyactive (running). - Cho phép người dùng không phải root chạy lệnh Docker (tùy chọn):
bash
sudo usermod -aG docker $USER
newgrp docker
Sau lệnhnewgrp docker, bạn cần mở một terminal mới hoặc chạybashđể áp dụng thay đổi.
Cài đặt Docker Compose
Docker Compose đã được tích hợp vào Docker Desktop trên Windows/macOS. Tuy nhiên, trên Linux, bạn thường cần cài đặt nó riêng.
- Tải xuống phiên bản Docker Compose mới nhất:
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(Lưu ý: Thayv2.27.0bằng phiên bản mới nhất nếu có) - Áp dụng quyền thực thi:
bash
sudo chmod +x /usr/local/bin/docker-compose - Kiểm tra phiên bản Docker Compose:
bash
docker-compose --version
Output mẫu:
Docker Compose version v2.27.0
⚠️ Cảnh báo: Đảm bảo bạn tải đúng phiên bản Docker Compose cho kiến trúc hệ thống của mình. Nếu không, lệnh
docker-composecó thể không hoạt động.
Tóm gọn: Deploy WordPress + MySQL + NGINX với 1 lệnh duy nhất
Sau khi đã chuẩn bị xong môi trường, việc deploy ứng dụng WordPress chỉ còn là vấn đề của một vài bước đơn giản.
- Tạo thư mục dự án:
bash
mkdir my-wordpress-app
cd my-wordpress-app Tạo file
docker-compose.yml:
Tạo một file tên làdocker-compose.ymltrong thư mụcmy-wordpress-appvà dán nội dung đã cung cấp ở phần trước vào đó.
bash
nano docker-compose.yml
(Dán nội dung YAML vào và lưu file)Khởi tạo và chạy các dịch vụ:
Trong thư mục chứa filedocker-compose.yml, chạy lệnh sau:
bash
docker-compose up -dup: Lệnh này sẽ tạo và khởi động các container dựa trên filedocker-compose.yml.-d: Chạy các container ở chế độ nền (detached mode), không chiếm giữ terminal.
Docker sẽ tải về các image cần thiết (nếu chưa có) và khởi tạo các container. Quá trình này có thể mất vài phút tùy thuộc vào tốc độ mạng của bạn.
Kiểm tra trạng thái các container:
bash
docker ps
Output mẫu:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 wordpress:latest "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp wordpress_app
f7e6d5c4b3a2 mysql:8.0 "docker-entrypoint.s…" 10 seconds ago Up 9 seconds 3306/tcp, 33060/tcp mysql_db
Bạn sẽ thấy cả hai container (wordpress_appvàmysql_db) đang chạy (Up).Truy cập WordPress:
Mở trình duyệt web và truy cập vào địa chỉhttp://localhost:8080(hoặchttp://<IP_CUA_MAY_CHUT>/:8080nếu bạn chạy trên VPS). Bạn sẽ thấy màn hình cài đặt WordPress.
💡 Mẹo: Nếu bạn muốn xem log của các container, bạn có thể dùng lệnh
docker-compose logs -f. Dấu-fsẽ theo dõi log theo thời gian thực.
Tóm gọn: Cấu hình NGINX làm Reverse Proxy (Nâng cao)
Mặc dù WordPress có thể chạy trực tiếp trên port 80, việc sử dụng NGINX làm reverse proxy mang lại nhiều lợi ích như SSL termination, caching, load balancing và bảo mật tốt hơn.
Thêm NGINX vào docker-compose.yml
Chúng ta sẽ thêm một dịch vụ NGINX vào file docker-compose.yml và cấu hình nó để chuyển tiếp request tới container WordPress.
version: '3.8'
services:
db:
image: mysql:8.0
container_name: mysql_db
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_strong_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: your_wordpress_password
networks:
- app_network
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress_app
# Bỏ port mapping ở đây vì NGINX sẽ expose port 80
# ports:
# - "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: your_wordpress_password
WORDPRESS_DB_NAME: wordpress
networks:
- app_network
nginx:
image: nginx:latest
container_name: nginx_proxy
ports:
- "80:80" # Map port 80 của host tới port 80 của NGINX
- "443:443" # Map port 443 của host tới port 443 của NGINX
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # Mount thư mục cấu hình NGINX
# - ./nginx/ssl:/etc/nginx/ssl # Mount thư mục chứa SSL certificate (nếu có)
depends_on:
- wordpress
restart: always
networks:
- app_network
networks:
app_network:
driver: bridge
volumes:
db_data:
Tạo file cấu hình NGINX
- Tạo thư mục cấu hình NGINX:
bash
mkdir -p nginx/conf.d Tạo file cấu hình NGINX (
nginx/conf.d/default.conf):
bash
nano nginx/conf.d/default.conf
Dán nội dung sau vào file:
“`nginx
server {
listen 80;
server_name your_domain.com www.your_domain.com; # Thay bằng domain của bạn hoặc IPlocation / { proxy_pass http://wordpress:80; # Chuyển tiếp request tới container wordpress proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Cấu hình cho SSL (nếu có) # listen 443 ssl; # ssl_certificate /etc/nginx/ssl/your_domain.com.crt; # ssl_certificate_key /etc/nginx/ssl/your_domain.com.key; # include /etc/nginx/options-ssl-nginx.conf; # ssl_dhparam /etc/nginx/ssl/ssl-dhparams.pem; # location / { # proxy_pass http://wordpress:80; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto $scheme; # }}
``listen 80;
*: NGINX lắng nghe trên port 80.server_name your_domain.com www.your_domain.com;
*: Thay thế bằng tên miền hoặc địa chỉ IP của VPS của bạn.location /
*: Định nghĩa cách xử lý các request tới gốc (/).proxy_pass http://wordpress:80;
*: Chuyển tiếp request tới dịch vụwordpresstrên port 80. Docker Compose sẽ tự động phân giải tênwordpressthành IP nội bộ của container.proxy_set_header …`: Chuyển tiếp thông tin quan trọng của request gốc tới backend (WordPress).
*Chạy lại Docker Compose:
bash
docker-compose up -d
Docker Compose sẽ xây dựng lại image NGINX (nếu cần) và khởi động container NGINX.Truy cập WordPress qua NGINX:
Bây giờ, bạn truy cậphttp://<IP_CUA_MAY_CHUT>hoặchttp://your_domain.com(thay thế bằng tên miền/IP thực tế của bạn).
💡 Mẹo: Để cấu hình SSL, bạn cần tạo hoặc tải chứng chỉ SSL lên server và mount vào thư mục
/etc/nginx/ssltrong container NGINX, sau đó bỏ comment và cập nhật các dòng cấu hình SSL trongdefault.conf.
Tóm gọn: Quản lý ứng dụng với các lệnh Docker Compose
Docker Compose cung cấp một bộ lệnh mạnh mẽ để quản lý toàn bộ vòng đời của ứng dụng multi-container.
Khởi động ứng dụng
- Chạy ở chế độ nền:
bash
docker-compose up -d - Chạy ở chế độ foreground (xem log trực tiếp):
bash
docker-compose up
NhấnCtrl+Cđể dừng.
Dừng và xóa ứng dụng
- Dừng tất cả các container, mạng, volume và image:
bash
docker-compose down - Dừng container nhưng giữ lại mạng và volume:
bash
docker-compose stop - Xóa container và mạng (giữ lại volume):
bash
docker-compose rm
Lệnh này sẽ hỏi xác nhận trước khi xóa. Thêm cờ-fđể xóa không cần xác nhận.
Xem trạng thái và log
- Liệt kê các container đang chạy:
bash
docker-compose ps - Xem log của tất cả các dịch vụ:
bash
docker-compose logs - Theo dõi log theo thời gian thực:
bash
docker-compose logs -f - Xem log của một dịch vụ cụ thể (ví dụ: wordpress):
bash
docker-compose logs wordpress
Xây dựng lại image
- Xây dựng lại image từ Dockerfile (nếu có):
bash
docker-compose build - Xây dựng lại image và bỏ qua cache:
bash
docker-compose build --no-cache
Các lệnh hữu ích khác
- Kiểm tra cấu hình file
docker-compose.yml:
bash
docker-compose config - Chạy một lệnh trong container:
bash
docker-compose exec wordpress bash
Lệnh này sẽ mở một shell bash bên trong containerwordpress.
⚠️ Cảnh báo: Lệnh
docker-compose downsẽ xóa các container và mạng. Nếu bạn muốn giữ lại dữ liệu của database, hãy đảm bảo volumedb_datakhông bị xóa hoặc bạn đã sao lưu dữ liệu trước đó.
Pitfalls & lỗi thường gặp
Lỗi kết nối database (
Error establishing a database connection)- Nguyên nhân: Biến môi trường
WORDPRESS_DB_HOST,WORDPRESS_DB_USER,WORDPRESS_DB_PASSWORD,WORDPRESS_DB_NAMEtrongdocker-compose.ymlbị sai, hoặc dịch vụdbchưa chạy khiwordpresskhởi động. - Cách fix:
- Kiểm tra kỹ các biến môi trường.
- Đảm bảo
depends_on: - dbđược thiết lập đúng cho dịch vụwordpress. - Chạy
docker-compose up -dlại để khởi động lại các dịch vụ. - Kiểm tra log của cả hai container (
docker-compose logs dbvàdocker-compose logs wordpress).
- Nguyên nhân: Biến môi trường
WordPress không truy cập được (404, 502, 503)
- Nguyên nhân: Cấu hình NGINX sai, port mapping không đúng, hoặc container WordPress bị lỗi.
- Cách fix:
- Kiểm tra port mapping trong
docker-compose.yml(host port và container port). - Kiểm tra file cấu hình NGINX (
nginx/conf.d/default.conf), đảm bảoproxy_passtrỏ đúng tới tên dịch vụwordpressvà port của nó. - Kiểm tra log của container NGINX (
docker-compose logs nginx) và WordPress.
- Kiểm tra port mapping trong
Lỗi “Cannot connect to the Docker daemon”
- Nguyên nhân: Docker daemon không chạy, hoặc người dùng hiện tại không có quyền truy cập Docker.
- Cách fix:
- Khởi động Docker daemon:
sudo systemctl start docker. - Kiểm tra trạng thái:
sudo systemctl status docker. - Nếu bạn chưa thêm người dùng vào nhóm
docker, hãy chạy lại lệnhsudo usermod -aG docker $USERvà mở lại terminal hoặc chạynewgrp docker.
- Khởi động Docker daemon:
Lỗi phiên bản Docker Compose (
command not found: docker-compose)- Nguyên nhân: Docker Compose chưa được cài đặt hoặc không nằm trong PATH của hệ thống.
- Cách fix:
- Kiểm tra lại các bước cài đặt Docker Compose.
- Đảm bảo bạn đã thực thi
sudo chmod +x /usr/local/bin/docker-compose. - Thử chạy bằng
docker compose(với khoảng trắng) thay vìdocker-compose(nếu bạn cài phiên bản mới hơn được tích hợp vào CLI Docker).
Key takeaways
- Docker Compose đơn giản hóa việc quản lý các ứng dụng multi-container bằng cách sử dụng file
docker-compose.yml. - Một file
docker-compose.ymlcó thể định nghĩa các dịch vụ, mạng, volume và cấu hình liên quan. - Lệnh
docker-compose up -dlà “cứu cánh” để khởi động toàn bộ ứng dụng chỉ với một thao tác. - NGINX có thể dễ dàng được tích hợp làm reverse proxy, cung cấp các tính năng nâng cao như SSL và caching.
- Các lệnh như
down,ps,logsgiúp quản lý và gỡ lỗi ứng dụng một cách hiệu quả.
FAQ
### Docker Compose có cần cài đặt riêng không?
Trên Linux, bạn cần cài đặt Docker Compose riêng. Tuy nhiên, trên Docker Desktop (Windows/macOS), nó thường đi kèm sẵn.
### Tôi có thể chạy nhiều trang WordPress trên cùng một server bằng Docker Compose không?
Có, bạn có thể tạo nhiều thư mục dự án, mỗi thư mục có file docker-compose.yml riêng, và cấu hình port mapping khác nhau để chạy nhiều trang WordPress độc lập.
### Làm thế nào để backup dữ liệu WordPress và MySQL?
Đối với MySQL, bạn có thể sử dụng volume. Để backup, bạn có thể truy cập vào container MySQL và chạy lệnh mysqldump hoặc sao chép dữ liệu từ volume db_data trên host. Đối với file uploads của WordPress, bạn cần backup thư mục /var/www/html/wp-content bên trong container WordPress hoặc mount một volume riêng cho nó.
### Tôi có thể dùng image Docker khác cho MySQL hoặc WordPress không?
Chắc chắn rồi. Bạn chỉ cần thay đổi tên image trong docker-compose.yml sang image bạn muốn sử dụng (ví dụ: mariadb:latest thay vì mysql:8.0).
### Cờ -d trong docker-compose up -d có ý nghĩa gì?
Cờ -d viết tắt của “detached mode”, có nghĩa là các container sẽ chạy ở chế độ nền, không chiếm giữ terminal của bạn. Điều này cho phép bạn tiếp tục sử dụng terminal cho các lệnh khác.
### Làm sao để cập nhật WordPress lên phiên bản mới nhất?
- Dừng ứng dụng:
docker-compose down - Cập nhật tag image trong
docker-compose.yml(ví dụ: từwordpress:latestlênwordpress:6.5.3hoặc tag mới nhất). - Chạy lại ứng dụng:
docker-compose up -d - WordPress có thể yêu cầu cập nhật database khi bạn truy cập lần đầu.
Cần VPS chạy Docker Compose?
Để triển khai các ứng dụng Docker phức tạp như WordPress với NGINX và MySQL, bạn cần một môi trường máy chủ ổn định và hiệu năng cao. VPS tại VSIS.NET cung cấp cho bạn toàn quyền kiểm soát, tài nguyên mạnh mẽ và độ tin cậy cần thiết để chạy Docker và Docker Compose mượt mà.
Hãy trải nghiệm sự linh hoạt và sức mạnh của Docker Compose trên hạ tầng VPS chất lượng cao của chúng tôi.
Khám phá ngay các gói VPS tại: vsis.net/vps



