Tóm tắt nhanh: Hướng dẫn cài đặt Docker trên VPS Linux yêu cầu truy cập SSH với quyền root hoặc sudo. Quá trình gồm ba giai đoạn cốt lõi: xóa package xung đột cũ, thêm Docker repository chính thức bằng GPG key, và cài đặt Docker Engine qua apt. Bài này tập trung vào Ubuntu (20.04, 22.04, 24.04 LTS) và Debian (11, 12) — hai distro Linux phổ biến nhất trên môi trường VPS thực tế.
- Dùng
aptthay vì tải file.debthủ công — hệ thống sẽ tự xử lý cập nhật khi có bản vá mới. - Cài kèm
docker-compose-pluginngay từ đầu: hầu hết dự án thực tế đều cần filedocker-compose.yml. - Docker Compose V2 dùng lệnh
docker compose(không có gạch ngang) — V1 standalone đã bị khai tử chính thức từ tháng 7/2023. - Docker can thiệp trực tiếp vào
iptables, khiến các port publish bỏ qua UFW hoàn toàn — cần xử lý riêng nếu dùng tường lửa.
VPS mới cấp xong, việc đầu tiên nhiều dev làm là SSH vào rồi bắt đầu cài NodeJS, Python, MySQL thẳng lên hệ thống. Vài tuần sau, máy chủ lộn xộn với đủ loại thư viện xung đột nhau, muốn rollback thì không biết từ đâu. Docker giải quyết chính xác vấn đề này — mỗi ứng dụng chạy trong container độc lập, môi trường sạch, deploy lại chỉ mất vài giây. Bài viết này hướng dẫn cách cài đặt Docker và Docker Compose trên VPS Ubuntu và Debian từng bước qua CLI, kèm cấu hình bảo mật thực chiến mà phần lớn tutorial phổ thông hay bỏ qua.

Điều kiện tiên quyết trước khi cài đặt Docker
Trước khi chạy bất kỳ lệnh nào, hãy xác nhận 3 điều:
- VPS chạy Linux 64-bit — Docker hỗ trợ Ubuntu 20.04/22.04/24.04 LTS và Debian 11/12. RAM tối thiểu 1 GB để daemon khởi động ổn định; nếu chạy nhiều container đồng thời nên dùng từ 2 GB trở lên.
- Phần mềm SSH — PuTTY (Windows) hoặc Terminal (macOS/Linux). Kết nối vào VPS với tài khoản
roothoặc tài khoản có quyềnsudo. - Hệ thống đã cập nhật — Chạy
apt-get update && apt-get upgrade -ytrước khi cài để tránh xung đột package.
root nên không cần thêm sudo ở đầu. Nếu bạn đang dùng tài khoản thường, hãy thêm sudo vào trước mỗi lệnh, hoặc chuyển sang root bằng sudo -i.Hướng dẫn cài đặt Docker trên Ubuntu (Từng bước)
Tài liệu chính thức của Docker khuyến nghị cài qua repository thay vì tải file .deb — lý do đơn giản: khi có bản cập nhật, apt upgrade sẽ tự xử lý, không phải tải tay. Quy trình dưới đây áp dụng cho Ubuntu 20.04, 22.04, và 24.04 LTS.
Bước 1: Xóa các package Docker cũ (tránh xung đột)
Nếu VPS đã từng cài Docker theo cách khác (ví dụ qua Snap hoặc repo distro mặc định), cần xóa trước để tránh conflict:
apt-get remove docker docker-engine docker.io containerd runc
Nếu máy chưa cài Docker bao giờ, lệnh này sẽ báo “không tìm thấy package” — không sao, cứ tiếp tục.
Bước 2: Cài các package phụ thuộc và thêm GPG key của Docker
Bước này thêm khóa GPG chính thức từ Docker, Inc. vào hệ thống — đây là cơ chế xác minh chữ ký để apt tin tưởng repository:
apt-get update
apt-get install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
Bước 3: Thêm Docker repository vào sources.list
Lệnh dưới đây tự động lấy tên phiên bản Ubuntu hiện tại (ví dụ jammy cho 22.04, focal cho 20.04, noble cho 24.04) và ghi vào file cấu hình apt:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Bước 4: Cài Docker Engine và các plugin đi kèm
Cập nhật danh sách package rồi cài đặt một lần duy nhất — gói này bao gồm Docker Engine, CLI, containerd runtime, Buildx plugin và Compose plugin:
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Bước 5: Kiểm tra trạng thái Docker daemon
Sau khi cài xong, Docker daemon sẽ tự khởi động. Xác nhận bằng lệnh:
systemctl status docker
Output trả về Active: active (running) là hoàn tất. Nếu thấy inactive, chạy thêm systemctl start docker.

Cách cài đặt Docker trên VPS Debian có gì khác biệt?
Thực ra không nhiều. Quy trình trên Debian 11 (Bullseye) và Debian 12 (Bookworm) gần như giống hệt Ubuntu — xóa package cũ, cài dependencies, thêm GPG key, cài Docker. Điểm khác biệt duy nhất nằm ở URL repository và cách lấy tên phiên bản hệ điều hành.
Thay vì 4 lệnh ở bước 2 và 3 của Ubuntu, bạn dùng lệnh tương đương sau cho Debian:
apt-get update
apt-get install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Hai chỗ thay đổi so với Ubuntu: ubuntu đổi thành debian trong URL GPG và URL repository. Phần còn lại — cài Docker Engine, kiểm tra systemctl — giữ nguyên hoàn toàn.
Sau khi thêm repository xong, chạy lệnh cài đặt giống hệt Ubuntu:
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Hướng dẫn cài đặt Docker Compose Plugin (Bắt buộc cho dự án thực tế)
Nếu bạn đã chạy lệnh apt-get install ở bước 4 phía trên với đầy đủ các gói — bao gồm docker-compose-plugin — thì Docker Compose V2 đã được cài đặt xong. Không cần làm thêm bước nào.
Xác nhận bằng lệnh:
docker compose version

docker compose (có dấu cách, không có gạch ngang). docker-compose với gạch ngang là cú pháp của Compose V1 standalone — phiên bản này đã bị Docker chính thức khai tử từ tháng 7/2023 và không còn nhận bản cập nhật bảo mật. Nếu tutorial nào vẫn hướng dẫn tải file binary qua curl từ GitHub, đó là cách cũ.Lý do cài Compose ngay từ đầu: gần như 100% dự án thực tế — từ ứng dụng web đơn giản đến stack đầy đủ với database, cache, worker — đều được định nghĩa bằng file docker-compose.yml. Thiếu Compose, bạn sẽ phải gõ lệnh docker run dài dòng thủ công mỗi lần khởi động.
Kiểm tra thành quả: Chạy thử Container đầu tiên
Cài xong thì phải kiểm tra. Lệnh dưới đây là bài test chuẩn mà chính Docker dùng để xác minh cài đặt hoạt động đúng:
docker run hello-world
Luồng xử lý diễn ra theo thứ tự: Docker daemon nhận lệnh → kiểm tra local image hello-world (chưa có) → tự động pull từ Docker Hub → tạo container → chạy và in ra thông báo thành công. Nếu terminal hiển thị đoạn text bắt đầu bằng “Hello from Docker!”, mọi thứ đã hoạt động đúng — từ network, daemon, đến quyền truy cập Docker Hub.

Container sẽ tự tắt sau khi in xong thông báo. Đây là hành vi bình thường; hello-world được thiết kế để test, không phải để chạy liên tục.
Cấu hình sau cài đặt: Khắc phục lỗi Permission Denied
Lỗi permission denied while trying to connect to the Docker daemon socket xảy ra vì Docker daemon bind với Unix socket /var/run/docker.sock thuộc sở hữu của root. Người dùng thường muốn gõ lệnh docker trực tiếp mà không phải thêm sudo mỗi lần — cách làm đúng là thêm user vào group docker, không phải cấp quyền root.
Hai lệnh cần chạy:
usermod -aG docker $USER
newgrp docker
Lệnh usermod thêm user hiện tại vào group docker. newgrp docker áp dụng thay đổi ngay trong session hiện tại — thay thế cho việc phải logout và login lại. Sau khi chạy xong, thử docker ps để xác nhận không còn lỗi permission.
Một điểm cần lưu ý từ góc độ bảo mật: thành viên trong group docker có quyền tương đương root trên máy chủ, vì Docker daemon chạy với quyền root và user trong group này có thể mount volume tùy ý. Trên VPS cá nhân hoặc dev server, điều này chấp nhận được. Trên production server nhiều người dùng, cần cân nhắc kỹ hơn.
Cảnh báo bảo mật: Docker và Tường lửa UFW (Dành cho System Admin)
Docker bypass UFW hoàn toàn — không phải bug, mà là thiết kế có chủ đích. Khi bạn chạy docker run -p 8080:80 ..., Docker ghi thẳng rule ACCEPT vào chain DOCKER trong iptables, trước cả chain INPUT mà UFW quản lý. Hệ quả: port 8080 mở ra internet dù UFW đang block port đó.
Tình huống thực tế dễ xảy ra: bạn deploy một ứng dụng nội bộ, nghĩ rằng UFW đã chặn port đó với người ngoài. Thực tế, bất kỳ ai có IP đều truy cập được. Đây là loại lỗ hổng không có log cảnh báo, không có thông báo — chỉ phát hiện khi rà soát lại cấu hình hoặc khi đã quá muộn.
Có hai cách xử lý thực chiến:
- Bind port vào localhost thay vì
0.0.0.0— thay vì-p 8080:80, dùng-p 127.0.0.1:8080:80. Port chỉ lắng nghe trên loopback, không expose ra internet. Sau đó dùng Nginx hoặc Caddy làm reverse proxy để forward traffic từ ngoài vào sau khi qua xác thực hoặc SSL. - Cấu hình
DOCKER-USERchain — Docker cung cấp chainDOCKER-USERtrong iptables mà admin có thể ghi rule vào đó. Rule trong chain này thực thi trước chainDOCKER, cho phép kiểm soát traffic ở mức thấp hơn.
Với phần lớn trường hợp, cách bind vào 127.0.0.1 kết hợp Nginx reverse proxy là đơn giản và an toàn nhất — không cần can thiệp sâu vào iptables.
VPS Giá Rẻ Tốc Độ Cao — Tối ưu cho Docker & Container
Thuê VPS tại InterData để có nền tảng ổn định cho môi trường Docker: ổ NVMe nhanh, IP sạch, đa dạng các phiên bản Ubuntu/Debian, hỗ trợ kỹ thuật 24/7.
- ✓Ổ cứng NVMe — Pull Docker Image nhanh, I/O cao cho database container
- ✓RAM dedicated (không chia sẻ) — chạy nhiều container đồng thời ổn định
- ✓Datacenter Việt Nam — độ trễ thấp, hỗ trợ kỹ thuật 24/7
FAQs — Các câu hỏi thường gặp khi setup Docker trên Server
Cài đặt xong làm sao để Docker tự khởi động cùng VPS?
Mặc định, Docker daemon chưa được bật chế độ autostart sau khi reboot. Chạy hai lệnh sau để kích hoạt:
systemctl enable docker
systemctl enable containerd
Từ thời điểm này, mỗi lần VPS khởi động lại — dù do restart thủ công hay do sự cố mất điện — Docker daemon sẽ tự lên cùng hệ thống mà không cần can thiệp thêm.
Làm cách nào để gỡ cài đặt Docker hoàn toàn khỏi VPS?
Gỡ Docker sạch hoàn toàn cần hai bước: xóa package và xóa dữ liệu tồn đọng. Thứ tự quan trọng — làm ngược lại sẽ để lại rác trên hệ thống:
apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
Thư mục /var/lib/docker chứa toàn bộ images, containers, và volumes đã tạo. Nếu cần giữ lại data trước khi xóa, hãy backup thư mục này hoặc export từng image cần thiết bằng docker save.
Kết luận
Chỉ với vài lệnh qua apt, VPS Ubuntu hoặc Debian của bạn đã có đầy đủ Docker Engine lẫn Docker Compose V2 — sẵn sàng cho bất kỳ stack nào từ web app đơn giản đến microservices phức tạp. Phần quan trọng nhất không nằm ở bước cài đặt mà nằm ở hai điểm sau cài: xử lý permission đúng cách và hiểu rõ hành vi của Docker với UFW để không để lộ port không mong muốn.
Nếu bạn vẫn chưa rõ Image và Container hoạt động theo cơ chế nào — tại sao Container xóa đi thì data mất, tại sao Image có thể tái sử dụng trên nhiều máy — hãy đọc thêm bài cấu trúc và cơ chế hoạt động của Docker để nắm nền tảng trước khi đi vào các bước triển khai nâng cao hơn.
