
Trả lời nhanh: Cài Docker trên VPS Ubuntu chỉ cần: curl -fsSL https://get.docker.com | sh: script chính thức tự thêm repo và cài bản mới nhất kèm Docker Compose plugin. Sau đó ba việc nên làm ngay: thêm user vào nhóm docker để khỏi gõ sudo mỗi lệnh, giới hạn log container (mặc định log phình vô hạn, thủ phạm đầy ổ số một), và chạy thử docker run hello-world. Tổng cộng 5 phút là có nền chạy mọi dịch vụ đóng gói: n8n, Postgres, Redis, app của bạn.
Docker là cánh cửa vào thế giới self-host: mọi phần mềm hay ho (n8n, Supabase, Uptime Kuma...) đều phát hành dạng container, cài đúng Docker một lần là cả kho đó mở ra. Bài này là bản cài chuẩn production trên VPS Ubuntu: không chỉ chạy được, mà chạy an toàn và không để lại bom nổ chậm kiểu ổ đầy vì log.
- Một lệnh script chính thức cài trọn Docker Engine + Compose plugin
- usermod -aG docker để thao tác không cần sudo (đăng nhập lại mới ăn)
- Giới hạn log json-file ngay từ đầu, bom đầy ổ số một của người mới
- Kiểm tra bằng hello-world và compose thử một dịch vụ thật
Cài đặt: đường chính thống
curl -fsSL https://get.docker.com | sh
docker --version && docker compose versionScript của Docker tự nhận diện Ubuntu 24.04, thêm repo apt chính thức và cài engine + compose plugin + buildx. Đây cũng là đường cập nhật sau này: apt upgrade ăn theo repo đã thêm. Tránh cài từ snap hay repo Ubuntu mặc định, phiên bản cũ và đường dẫn khác biệt gây lỗi vặt khó dò.
Ba việc ngay sau khi cài
1. Thao tác không cần sudo:
sudo usermod -aG docker $USER
# dang xuat SSH vao lai de nhom moi co hieu lucLưu ý bảo mật cần biết: quyền docker tương đương root trên máy, chỉ thêm user bạn thật sự tin.
2. Chặn bom log: mặc định mỗi container ghi log JSON không giới hạn, dịch vụ nói nhiều chạy vài tháng là chiếm chục GB. Đặt trần toàn cục:
sudo tee /etc/docker/daemon.json <<'EOF'
{ "log-driver": "json-file",
"log-opts": { "max-size": "20m", "max-file": "5" } }
EOF
sudo systemctl restart dockerMỗi container giờ tối đa 100 MB log, tự xoay vòng. Một phút cấu hình đổi lấy không bao giờ gặp "disk full" lúc nửa đêm vì log.
3. Chạy thử: docker run --rm hello-world: thấy lời chào là chuỗi kéo image → tạo container → chạy đã thông.
Hiểu 4 khái niệm là dùng được 90%
- Image: khuôn đóng gói phần mềm (tải từ registry, vd postgres:16).
- Container: một lần chạy của image, sinh diệt thoải mái, hỏng thì bỏ tạo lại.
- Volume: chỗ dữ liệu sống bền qua đời container, database mà quên volume là mất dữ liệu khi recreate, lỗi kinh điển nhất Docker.
- Compose: file YAML khai cả cụm dịch vụ, một lệnh dựng, một lệnh hạ, commit vào git được.
Thử ngay một dịch vụ thật để khép vòng: Postgres với volume trong 30 giây ,
docker run -d --name pg -e POSTGRES_PASSWORD=doi-mat-khau
-v pgdata:/var/lib/postgresql/data -p 127.0.0.1:5432:5432 postgres:16
docker exec -it pg psql -U postgres -c 'select version();'Thói quen giữ máy sạch lâu dài
- Bind port vào 127.0.0.1 như ví dụ trên cho dịch vụ nội bộ, thò ra internet qua reverse proxy/tunnel có kiểm soát, không phơi database trần trên IP công khai (lỗi bị quét và tấn công nhiều nhất với VPS mới).
- Dọn định kỳ:
docker system dfxem ai chiếm chỗ;docker system prune -fquét container chết + image mồ côi (thêm-akhi muốn mạnh tay, hiểu rằng image đang không dùng sẽ phải kéo lại). - Đặt tên và nhãn tử tế ngay từ đầu, ba tháng sau nhìn
docker pscòn biết container nào của dự án nào.
Về phần cứng: mọi thao tác Docker đều nặng I/O, kéo image là giải nén hàng vạn file lớp, build là ghi layer liên tục, volume database là fsync. Trên ổ NVMe, docker pull và compose up nhanh gấp nhiều lần trải nghiệm ổ thường, đáng để ý khi chọn máy làm nền self-host.
Ba việc làm ngay sau khi cài, kèm lệnh
# 1. Thao tac khong can sudo
sudo usermod -aG docker $USER
newgrp docker # hoac dang xuat va dang nhap lai
# 2. Gioi han log, day la bom dinh gio so mot
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" },
"live-restore": true
}
EOF
sudo systemctl restart docker
# 3. Kiem tra
docker run --rm hello-world
docker info | grep -E "Logging Driver|Storage Driver|Docker Root Dir"Lưu ý: giới hạn nhật ký chỉ áp cho container tạo sau khi đổi cấu hình. Container đang chạy phải tạo lại mới nhận. Tùy chọn live-restore giữ container chạy khi dịch vụ Docker khởi động lại, hữu ích khi cập nhật.
Bảo mật máy chủ Docker, bốn việc
- Hiểu rằng nhóm docker tương đương quyền quản trị máy. Ai vào được nhóm này là gắn được ổ hệ thống vào container và làm mọi thứ. Chỉ thêm người thật sự cần.
- Đừng phơi cổng của cơ sở dữ liệu. Viết
-p 5432:5432là mở ra internet, kể cả khi máy có tường lửa, vì Docker tự thêm luật vào tầng lọc gói và đi vòng qua tường lửa của hệ điều hành. Viết-p 127.0.0.1:5432:5432mới là chỉ mở cho chính máy đó. - Đừng chạy container bằng quyền cao nhất trừ khi bắt buộc. Nhiều image cho phép khai người dùng chạy bên trong.
- Cập nhật image định kỳ. Container không tự vá. Đặt lịch
docker compose pullrồi dựng lại mỗi tháng.
Giữ ổ đĩa không bị đầy
docker system df # xem image, container, volume, cache chiem bao nhieu docker image prune -a # xoa image khong con container nao dung docker container prune # xoa container da dung docker builder prune --filter until=168h # xoa cache build cu hon 7 ngay docker volume ls -qf dangling=true # LIET KE volume mo coi, xem ky truoc khi xoa
Cảnh báo về lệnh dọn tổng: docker system prune -a --volumes xóa cả volume không được container nào dùng. Cơ sở dữ liệu của một dịch vụ đang tạm dừng cũng nằm trong nhóm đó. Đây là cách mất dữ liệu phổ biến nhất với người mới. Luôn liệt kê trước khi xóa.
Kiểm tra định kỳ, năm phút mỗi tháng
| Việc | Lệnh | Ngưỡng đáng lo |
|---|---|---|
| Dung lượng ổ | df -h / | Trên 80% là phải dọn |
| Docker chiếm bao nhiêu | docker system df | Phần RECLAIMABLE lớn là dọn được |
| Container nào ăn tài nguyên | docker stats --no-stream | Một container chiếm gần hết bộ nhớ máy |
| Container nào hay chết | docker ps -a --filter status=exited | Có container liên tục thoát rồi chạy lại |
| Phiên bản Docker | docker version | Cũ hơn một năm là nên cập nhật |
Câu hỏi thường gặp
Docker có làm chậm ứng dụng không?
Trên Linux, container chạy thẳng trên kernel, overhead CPU/RAM không đáng kể (khác máy Mac/Windows phải qua VM). Phần cần để mắt là I/O volume và log, cấu hình như bài là ổn.
VPS bao nhiêu RAM thì chạy Docker thoải mái?
Docker tự thân ăn rất ít; RAM tính theo dịch vụ bên trong. 2 GB chạy được n8n + vài container nhỏ; 4-6 GB cho cụm app + database + cache; nhiều dịch vụ nữa thì 8 GB trở lên.
Docker Compose có phải cài riêng không?
Không, script chính thức đã kèm compose plugin, gọi bằng docker compose (hai từ). Thấy tài liệu cũ dùng docker-compose có gạch ngang là bản legacy, cú pháp file gần như y hệt.
Nên chạy app của mình trong Docker hay cài thẳng?
Dịch vụ bên thứ ba (database, n8n, cache): Docker gần như luôn thắng, sạch, dễ nâng cấp. App tự viết: cả hai đường đều tốt; PM2 cài thẳng đơn giản hơn cho một app, Docker thắng khi muốn đồng nhất dev-prod hoặc nhiều dịch vụ đi cùng nhau.
Bài viết liên quan
- Cài n8n trên VPS bằng Docker: checklist chạy thật
- Docker Compose nhiều service trên một VPS
- VPS ổ Enterprise U.2 NVMe RAID 10 tại TND
- Nguyên nhân và Khắc Phục Website bị quá tải-Phần 1
- Cloudflare Tunnel: đưa web trên VPS ra net không mở port
- Nextcloud trên VPS: thay Google Drive cho cả đội
- Cài n8n trên VPS bằng Docker: checklist chạy thật
- Tailscale Funnel lỗi 502, TLS handshake, cert: cách sửa
- Cảnh báo: lỗ hổng cPanel/WHM mới CVE-2026-29201/29202/29203, patch 23:00 ngày 08/05



