Hướng Dẫn Cài Đặt Và Sử Dụng Docker Compose Trên Ubuntu Từ A Đến Z (Chuẩn V2)
Việc cài đặt và sử dụng Docker Compose trên Ubuntu là bước quan trọng giúp lập trình viên và quản trị hệ thống quản lý ứng dụng đa container (multi-container) một cách khoa học. Thay vì phải ghi nhớ hàng loạt cờ lệnh docker run phức tạp cho từng dịch vụ như Web, Database hay […]
Việc cài đặt và sử dụng Docker Compose trên Ubuntu là bước quan trọng giúp lập trình viên và quản trị hệ thống quản lý ứng dụng đa container (multi-container) một cách khoa học. Thay vì phải ghi nhớ hàng loạt cờ lệnh docker run phức tạp cho từng dịch vụ như Web, Database hay Cache, Docker Compose cho phép gom toàn bộ hạ tầng vào một file YAML duy nhất để khởi động toàn bộ hệ thống chỉ bằng một câu lệnh. Để thực hành trơn tru và làm chủ môi trường Linux, bạn có thể triển khai trực tiếp trên máy chủ ảo từ Thuê VPS Giá Rẻ – Fast Byte với chi phí tối ưu nhất.
1. Docker Compose là gì? Tại sao cần dùng trên VPS?
Docker Compose là công cụ mã nguồn mở chính thức của Docker, dùng để định nghĩa, cấu hình và khởi chạy các ứng dụng gồm nhiều container liên kết với nhau thông qua một tệp tin cấu hình YAML duy nhất (thường đặt tên là docker-compose.yml hoặc compose.yaml).
Khi tìm hiểu sâu về Docker và nguyên lý của containerization, bạn sẽ nhận thấy bản chất của mỗi container là chạy một tiến trình đơn lẻ. Một ứng dụng web hoàn chỉnh thường đòi hỏi Web Server (Nginx), Backend (Node.js/PHP), Database (MySQL/PostgreSQL) và bộ nhớ đệm (Redis).
- Nếu dùng Docker CLI thuần (
docker run): Bạn phải gõ lần lượt 3–4 câu lệnh dài hàng chục tham số về port mapping, volume, network và biến môi trường. Khi khởi động lại server hoặc cập nhật phiên bản, bạn phải gõ lại từ đầu. - Khi dùng Docker Compose: Toàn bộ kiến trúc mạng nội bộ, ổ lưu trữ dữ liệu bền vững và cấu hình dịch vụ được lưu gọn gàng trong file code. Bạn chỉ cần thực thi
docker compose up -dđể dựng toàn bộ stack, hoặcdocker compose downđể dọn dẹp sạch sẽ.

2. Điều kiện trước khi cài đặt Docker Compose trên Ubuntu
Trước khi tiến hành cài đặt Docker Compose, máy chủ Ubuntu của bạn cần đảm bảo các điều kiện kỹ thuật cơ bản sau:
- Hệ điều hành: Ubuntu 20.04 LTS, Ubuntu 22.04 LTS hoặc Ubuntu 24.04 LTS (kiến trúc x86_64/amd64 hoặc arm64).
- Quyền truy cập: Quyền tài khoản
roothoặc user có quyền thực thi lệnhsudo. - Đã cài đặt Docker Engine: Docker Compose V2 hoạt động như một plugin của Docker CLI, do đó Docker Engine bắt buộc phải được cài đặt và đang chạy nền trên hệ thống. Bạn có thể tham khảo thêm các bài hướng dẫn sử dụng VPS để nắm vững các thao tác chuẩn bị môi trường Linux.
3. Cách cài đặt Docker Compose trên Ubuntu đúng chuẩn
3.1. Phân biệt Docker Compose V1 (legacy) và V2 (plugin)
Rất nhiều người dùng mới gặp lỗi do cài đặt nhầm phiên bản V1 cũ từ kho lưu trữ mặc định của Ubuntu. Hãy xem bảng phân biệt chi tiết dưới đây:
| Tiêu chí | Docker Compose V1 (Legacy) | Docker Compose V2 (Plugin) |
|---|---|---|
| Cú pháp lệnh | docker-compose (có dấu gạch nối) |
docker compose (dấu khoảng trắng) |
| Ngôn ngữ phát triển | Python (chạy qua binary riêng) | Go (tích hợp trực tiếp vào Docker CLI) |
| Trạng thái hỗ trợ | Đã ngừng hỗ trợ (End of Life) | Chính thức, cập nhật liên tục |
| Gói cài đặt Ubuntu | apt install docker-compose |
apt install docker-compose-plugin |
3.2. Cài đặt Docker Compose V2 qua Docker Official Repository
Theo tài liệu chính thức từ Docker, phương pháp chuẩn hóa và an toàn nhất là cài đặt thông qua kho lưu trữ chính thức (Docker Official Repository).
Bước 1: Cập nhật hệ thống và cài đặt các gói phụ trợ:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
Bước 2: Thêm GPG Key chính thức từ Docker:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Bước 3: Thiết lập APT Repository của Docker trên Ubuntu:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Bước 4: Cài đặt Docker Engine và Docker Compose Plugin:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.3. Kiểm tra cài đặt và cấp quyền không cần sudo
Sau khi hoàn tất, kiểm tra phiên bản Docker Compose đã cài đặt trên máy chủ:
docker compose version

Màn hình hiển thị dạng Docker Compose version v2.x.x nghĩa là cài đặt thành công. Để chạy lệnh Docker mà không cần tiền tố sudo mỗi lần thao tác, hãy thêm user hiện tại vào group docker:
sudo usermod -aG docker $USER
newgrp docker
⚠ Lưu ý quan trọng:
Không dùng lệnh sudo apt install docker-compose vì kho Ubuntu chuẩn vẫn có thể chứa phiên bản V1 cũ (Python). Cú pháp đúng chuẩn của Docker Compose V2 luôn là docker compose (có khoảng trắng).
4. Cấu trúc file docker-compose.yml: Giải thích từng thành phần
File docker-compose.yml là trung tâm điều khiển của hệ thống. Dưới đây là cấu trúc mẫu định nghĩa stack Web Nginx và Database MySQL:
services:
web:
image: nginx:alpine
container_name: web_nginx
restart: always
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- app_network
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.0
container_name: db_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
networks:
- app_network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 3
volumes:
db_data:
networks:
app_network:
driver: bridge

Giải thích chi tiết các thuộc tính cốt lõi:
services: Định nghĩa danh sách các container cần chạy (ở ví dụ trên gồmwebvàdb).image: Chỉ định Docker Image kéo từ Docker Hub về để khởi chạy.ports: Ánh xạ cổng giữa máy chủ host và container theo cú phápHOST_PORT:CONTAINER_PORT.volumes: Ánh xạ thư mục máy host hoặc Docker Volume để lưu trữ dữ liệu vĩnh viễn, không bị mất khi xóa container.environment: Truyền các biến môi trường trực tiếp vào container khi hoạt động.networks: Tạo mạng nội bộ ảo cách ly giữa các container, giúp các container tự động phân giải tên miền (DNS) cho nhau theo tên service.depends_on: Thiết lập thứ tự khởi động phụ thuộc giữa các container.
⚠ Quy tắc định dạng YAML:
Tệp tin YAML sử dụng khoảng trắng (Spaces) để thụt đầu dòng (indentation), tuyệt đối không sử dụng phím Tab vì sẽ gây lỗi cú pháp khi thực thi lệnh.
5. Tổng hợp các lệnh Docker Compose thường dùng (Cheat Sheet)
Bảng tổng hợp lệnh hỗ trợ quản lý vòng đời ứng dụng multi-container hàng ngày:
| Lệnh (CLI) | Chức năng và ý nghĩa thực tế |
|---|---|
docker compose up -d |
Kéo image, tạo network/volume và khởi chạy container dưới nền (detached mode). |
docker compose down |
Dừng và xóa toàn bộ container, network được định nghĩa trong compose file. |
docker compose down -v |
Dừng hệ thống và xóa sạch toàn bộ named volumes kèm theo dữ liệu. |
docker compose ps |
Liệt kê danh sách các container đang chạy trong stack hiện tại và trạng thái port. |
docker compose logs -f [service] |
Theo dõi realtime (stream) log đầu ra của toàn bộ hoặc một service cụ thể. |
docker compose restart [service] |
Khởi động lại các container trong stack mà không làm thay đổi cấu hình volume. |
docker compose exec [service] sh |
Truy cập vào giao diện dòng lệnh bên trong một container đang chạy. |
docker compose pull |
Tải về các phiên bản image mới nhất được chỉ định từ registry về máy chủ. |
6. Cách dùng file .env để quản lý biến môi trường an toàn
Việc hardcode trực tiếp mật khẩu, API token hay thông tin kết nối cơ sở dữ liệu vào file docker-compose.yml là sai lầm bảo mật nghiêm trọng. Docker Compose tự động tìm kiếm file .env cùng thư mục để nạp giá trị vào các biến dạng ${VARIABLE_NAME}.
Bước 1: Tạo file .env lưu trữ tham số bảo mật:
DB_ROOT_PASSWORD=RootSecretPassword_2026!
DB_NAME=app_production
DB_USER=fastbyte_user
DB_PASSWORD=SecureAppPass_987#
Bước 2: Phân quyền bảo mật trên Ubuntu để bảo vệ file:
chmod 600 .env
7. Các lỗi thường gặp khi dùng Docker Compose và cách sửa
7.1. Lỗi: docker-compose: command not found
Nguyên nhân: Hệ thống đã cài Docker Compose V2 (dạng CLI plugin) nhưng bạn vẫn gõ theo thói quen cũ là docker-compose (có dấu gạch nối).
Cách xử lý: Đổi sang cú pháp docker compose. Nếu có nhu cầu duy trì các script cũ viết cho V1, tạo bí danh (alias) hoặc symlink:
echo 'alias docker-compose="docker compose"' >> ~/.bashrc && source ~/.bashrc
7.2. Lỗi: Got permission denied while trying to connect to the Docker daemon socket
Nguyên nhân: Tài khoản non-root hiện tại chưa được cấp quyền truy cập file socket /var/run/docker.sock.
Cách xử lý: Chạy sudo usermod -aG docker $USER sau đó logout và đăng nhập lại SSH.
7.3. Service Web không kết nối được Database dù có depends_on
Nguyên nhân: Mặc định depends_on chỉ đợi container database ở trạng thái started (vừa bật lên), chưa đảm bảo tiến trình database bên trong đã hoàn tất khởi tạo socket để nhận kết nối.
Cách xử lý: Sử dụng khối healthcheck cho database và kết hợp cấu hình điều kiện condition: service_healthy trong thuộc tính depends_on của service Web.
7.4. Lỗi xung đột cổng mạng (Port is already allocated)
Nguyên nhân: Port bạn cấu hình (ví dụ 80 hoặc 3306) đã bị chiếm bởi một dịch vụ khác trên Ubuntu (như Apache2 hoặc MySQL cục bộ).
Cách xử lý: Kiểm tra dịch vụ đang chiếm port bằng sudo lsof -i :80 hoặc sudo netstat -tulpn | grep :80 để dừng dịch vụ xung đột hoặc đổi port mapping trên host (ví dụ "8080:80").
8. Ví dụ thực tế: Deploy ứng dụng Nginx + MySQL trên VPS
Hãy cùng triển khai một stack thực tế từng bước để kiểm nghiệm toàn bộ quy trình vận hành Docker Compose:
Bước 1: Tạo thư mục dự án và tệp index:
mkdir -p ~/demo-compose/html
cd ~/demo-compose
echo "<h1>Docker Compose Fast Byte Hoat Dong Thanh Cong!</h1>" > html/index.html
Bước 2: Tạo file cấu hình docker-compose.yml và file .env:
cat << 'EOF' > docker-compose.yml
services:
webserver:
image: nginx:alpine
container_name: fastbyte_web
restart: always
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- internal_net
networks:
internal_net:
driver: bridge
EOF
Bước 3: Khởi chạy và kiểm tra ứng dụng:
# Khởi động dịch vụ ở chế độ chạy nền
docker compose up -d
# Xem trạng thái container
docker compose ps
Bây giờ, bạn mở trình duyệt và truy cập vào địa chỉ http://IP-VPS-CUA-BAN để kiểm tra thành quả. Phương pháp này cũng là nền tảng để bạn triển khai n8n trên VPS bằng Docker, tự host ứng dụng như Immich trên VPS hay cài đặt và dùng Portainer để quản lý Docker trực quan trên nền web.
9. Checklist kiểm tra sau khi cài đặt thành công
Trước khi đưa các container vào vận hành lâu dài, hãy rà soát lại các tiêu chuẩn kỹ thuật sau:
- Dịch vụ Docker đang hoạt động: Kiểm tra bằng lệnh
systemctl is-active dockertrả vềactive. - Phiên bản V2 đã cài đặt: Lệnh
docker compose versionhiển thị bản plugin V2 ổn định. - Quyền tài khoản: Người dùng thao tác được với Docker không cần quyền
sudo. - Cấu trúc dữ liệu an toàn: Sử dụng named volume hoặc bind mount đúng đường dẫn, đã tách biến môi trường vào
.env. - Tối ưu hóa tài nguyên: Thực hiện định kỳ dọn dẹp Docker giải phóng dung lượng (xóa các build cache, orphan volume và image thừa).
- Hạ tầng ảo hóa: Triển khai trên VPS sử dụng công nghệ ảo hóa KVM để có tài nguyên phần cứng độc lập và toàn quyền can thiệp kernel hệ điều hành.
10. FAQ – Câu hỏi thường gặp
1. Docker Compose là gì và khác Docker như thế nào?
Docker là nền tảng quản lý từng container độc lập, trong khi Docker Compose là công cụ cấp cao hơn giúp điều phối, liên kết và quản lý cụm nhiều container cùng lúc thông qua một file khai báo YAML duy nhất.
2. Nên cài Docker Compose bằng apt install docker-compose hay cài plugin?
Bạn nên cài gói docker-compose-plugin từ kho chính thức của Docker. Lệnh apt install docker-compose mặc định của Ubuntu chỉ cung cấp bản V1 cũ viết bằng Python đã bị Docker ngừng bảo trì.
3. Tại sao gặp lỗi docker-compose: command not found trên Ubuntu?
Lỗi này xuất hiện vì Docker Compose V2 hoạt động dưới dạng plugin tích hợp trực tiếp vào Docker CLI. Cú pháp thực thi chuẩn xác hiện nay là docker compose (có khoảng trắng) thay vì có dấu gạch nối.
4. depends_on trong Docker Compose có đảm bảo database sẵn sàng không?
Không hoàn toàn. Mặc định depends_on chỉ chờ container khởi chạy chứ không chờ database sẵn sàng tiếp nhận kết nối. Bạn cần kết hợp thêm chỉ thị healthcheck để đảm bảo tiến trình database sẵn sàng 100%.
5. Cách xóa toàn bộ container, volume và network do Compose tạo ra?
Tại thư mục chứa file cấu hình, bạn thực hiện lệnh docker compose down -v --rmi all. Lệnh này sẽ dừng container, đồng thời xóa toàn bộ network, volume lưu trữ và các custom image đã build.
Tổng kết quy trình cài đặt và làm chủ Docker Compose
Nắm vững các bước cài đặt và sử dụng Docker Compose trên Ubuntu sẽ giúp bạn chuẩn hóa quy trình triển khai phần mềm, giảm thiểu sai sót cấu hình và dễ dàng tái lập môi trường chạy ứng dụng ở bất kỳ máy chủ nào. Hãy luôn nhớ ưu tiên cài đặt Compose V2 Plugin chính thức, tách biệt các thông tin mật vào file .env và thiết lập healthcheck hợp lý để các dịch vụ vận hành bền bỉ.
Sẵn sàng deploy ứng dụng bằng Docker Compose?
Khởi tạo máy chủ VPS Ubuntu với toàn quyền root, SSD NVMe tốc độ cao để bắt đầu chạy container ngay hôm nay.
Nội dung bài viết mang tính tham khảo. Các lệnh và cấu hình trong bài được kiểm chứng trên Ubuntu 20.04/22.04/24.04 LTS với Docker Compose V2 và quyền root hoặc sudo. Phiên bản Docker Compose và cú pháp có thể thay đổi theo thời gian – bạn nên kiểm tra tài liệu chính thức tại docs.docker.com/compose/ để cập nhật mới nhất. Nên kiểm thử trên môi trường dev/staging trước khi áp dụng production.



