Docker giúp bạn chạy ứng dụng trong các "container" đóng gói sẵn: muốn có Nginx, MySQL, Redis hay một tool viết bằng Python, chỉ cần một lệnh là chạy, không phải cài từng thư viện vào hệ thống. Bài này hướng dẫn cài Docker trên VPS Ubuntu đúng cách từ kho chính thức, chạy container đầu tiên, dùng Docker Compose, và một lỗi bảo mật hay gặp với tường lửa UFW.
Tóm tắt các bước:
- Thêm kho cài đặt chính thức của Docker.
- Cài Docker Engine và plugin Compose.
- Cho user thường dùng Docker, chạy thử
hello-world. - Chạy ứng dụng bằng file
compose.yaml. - Học các lệnh quản lý cơ bản.
- Kiểm soát cổng mà container mở ra ngoài.
Chuẩn bị: VPS Ubuntu 22.04 trở lên, kết nối qua SSH (xem kết nối VPS Linux qua SSH). Docker chạy được trên VPS 1 GB RAM cho các container nhỏ, nhưng nếu chạy database hoặc nhiều container cùng lúc, nên có từ 2 GB RAM trở lên.
Bước 1: Thêm kho cài đặt chính thức của Docker
Ubuntu có sẵn gói docker.io, nhưng thường cũ hơn bản Docker phát hành. Cách được Docker khuyến nghị là cài từ kho download.docker.com. Nếu VPS đã từng cài docker.io hoặc podman-docker, gỡ chúng trước:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y $pkg; done
Thêm khoá GPG và kho của Docker:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

apt-get update thấy các dòng từ download.docker.com là kho đã được thêm đúng.Docker thỉnh thoảng thay đổi cách khai báo kho. Nếu lệnh trên báo lỗi, hãy đối chiếu với trang hướng dẫn chính thức tại docs.docker.com, mục Install Docker Engine on Ubuntu.
Bước 2: Cài Docker Engine và Docker Compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
Kiểm tra kết quả:
docker --version
docker compose version
systemctl is-active docker

Cách nhanh hơn: Docker có script cài tự động, phù hợp cho máy thử nghiệm: curl -fsSL https://get.docker.com | sudo sh. Với VPS chạy thật, nên dùng cách thêm kho như trên để biết rõ mình đã cài gì.
Bước 3: Dùng Docker không cần sudo và chạy thử
Mặc định chỉ root mới gọi được Docker. Thêm user của bạn vào nhóm docker:
sudo usermod -aG docker $USER
newgrp docker
newgrp áp dụng nhóm mới ngay trong phiên hiện tại, hoặc bạn có thể thoát SSH rồi đăng nhập lại. Chạy container thử nghiệm:
docker run hello-world

hello-world từ Docker Hub và chạy. Dòng Hello from Docker! xác nhận cài đặt hoạt động.Thành viên nhóm
dockercó quyền gần tương đương root trên VPS. Chỉ thêm những tài khoản bạn tin tưởng.
Bước 4: Chạy ứng dụng bằng Docker Compose
Thay vì nhớ những lệnh docker run dài, bạn mô tả ứng dụng trong một file compose.yaml. Ví dụ chạy một web server Nginx đơn giản:
mkdir -p ~/demo/html && cd ~/demo
echo "<h1>Xin chao tu Docker</h1>" > html/index.html
nano compose.yaml
Dán nội dung:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped
Khởi động:
docker compose up -d

Mở http://IP-VPS:8080 sẽ thấy dòng chữ trong file index.html. Ý nghĩa các dòng:
ports: "8080:80": cổng 8080 của VPS nối vào cổng 80 bên trong container.volumes: gắn thư mục./htmltrên VPS vào container. Dữ liệu nằm ngoài container nên xoá container cũng không mất.restart: unless-stopped: container tự chạy lại khi VPS khởi động lại, trừ khi bạn chủ động dừng.
Bước 5: Các lệnh Docker hay dùng
| Lệnh | Tác dụng |
|---|---|
docker ps | Liệt kê container đang chạy (thêm -a để xem cả container đã dừng) |
docker compose logs -f | Xem log liên tục, Ctrl+C để thoát |
docker compose restart | Khởi động lại các container trong file compose |
docker compose pull && docker compose up -d | Cập nhật image mới và chạy lại |
docker compose down | Dừng và xoá container, mạng (không xoá thư mục gắn ngoài) |
docker exec -it ten-container sh | Mở shell bên trong container |
docker system df | Xem Docker đang chiếm bao nhiêu dung lượng |
docker image prune | Xoá các image cũ không còn dùng |

docker ps cho biết trạng thái và cổng đang mở, logs giúp tìm lỗi khi container không chạy.Bước 6: Lưu ý quan trọng về UFW và cổng Docker
Đây là điều nhiều người bất ngờ: khi bạn khai báo "8080:80", Docker tự thêm luật iptables để mở cổng 8080 ra Internet, và các luật này nằm trước UFW. Nghĩa là dù UFW không cho phép cổng 8080, container vẫn truy cập được từ bên ngoài.

127.0.0.1 để container chỉ nhận kết nối từ chính VPS.Với những dịch vụ không nên lộ ra ngoài (database, trang quản trị, API nội bộ), hãy giới hạn cổng chỉ nghe trên VPS:
ports:
- "127.0.0.1:8080:80"
Sau đó dùng Nginx trên VPS làm cổng vào (reverse proxy) và cài SSL như bài trỏ tên miền và cài SSL Let's Encrypt. Với database, nên bỏ hẳn phần khai báo ports: các container trong cùng file compose vẫn nói chuyện với nhau qua tên dịch vụ. Xem thêm về tường lửa trong bài bảo mật VPS Linux cơ bản.
Lỗi thường gặp
"permission denied while trying to connect to the Docker daemon socket"
User chưa thuộc nhóm docker, hoặc đã thêm nhưng chưa đăng nhập lại. Chạy groups để kiểm tra, rồi thoát SSH và vào lại.
"Bind for 0.0.0.0:8080 failed: port is already allocated"
Cổng 8080 đã có chương trình khác dùng. Tìm bằng sudo ss -tulpn | grep 8080, rồi đổi sang cổng khác trong compose.yaml.
Ổ đĩa VPS đầy dần
Image cũ và log container tích tụ theo thời gian. Kiểm tra bằng docker system df, dọn bằng docker image prune. Cẩn thận với docker system prune -a --volumes vì lệnh này xoá cả dữ liệu trong volume không còn container dùng.
Container tự dừng ngay sau khi chạy
Xem lý do bằng docker compose logs. Thường do sai biến môi trường, thiếu file cấu hình hoặc hết RAM.
Câu hỏi thường gặp
Docker có chạy được trên VPS Windows không?
Bài này dành cho Linux. Docker chạy tự nhiên và nhẹ nhất trên Linux, vì vậy VPS Ubuntu là lựa chọn phổ biến cho Docker. Xem thêm bài nên chọn VPS Linux hay Windows.
Docker có làm VPS chậm đi không?
Bản thân Docker tốn rất ít tài nguyên. Container dùng chung nhân Linux với VPS nên nhẹ hơn nhiều so với chạy máy ảo. Hiệu năng phụ thuộc vào ứng dụng bạn chạy bên trong.
Có cần sao lưu dữ liệu Docker không?
Có. Hãy sao lưu các thư mục gắn ngoài (volumes) và file compose.yaml. TDCLOUD sao lưu VPS hằng ngày, nhưng bạn vẫn nên giữ bản sao riêng theo bài sao lưu dữ liệu và quy tắc 3-2-1.
Docker Compose cũ (docker-compose) khác gì bản mới?
Bản cũ là chương trình riêng gõ docker-compose có dấu gạch nối. Bản mới là plugin, gõ docker compose có dấu cách, được cài cùng Docker ở Bước 2. File cấu hình cũ docker-compose.yml vẫn dùng được với bản mới.
Nếu gặp lỗi khi cài Docker trên VPS TDCLOUD, hãy gửi cho đội kỹ thuật lệnh bạn đã chạy và thông báo lỗi để được hỗ trợ. Cần VPS cho các dự án dùng Docker, bạn có thể tham khảo VPS tiêu chuẩn hoặc VPS nhiều RAM khi chạy nhiều container.