Cài Docker trên VPS Ubuntu 24.04: chuẩn từng lệnh

Chia sẻ bài viết

Mục lục
Cài Docker trên VPS Ubuntu 24.04: chuẩn từng lệnh

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.

Tóm tắt nhanh
  • 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 version

Script 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 luc

Lư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 docker

Mỗ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 df xem ai chiếm chỗ; docker system prune -f quét container chết + image mồ côi (thêm -a khi 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 ps cò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:5432 là 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:5432 mớ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 pull rồ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ệcLệnhNgưỡng đáng lo
Dung lượng ổdf -h /Trên 80% là phải dọn
Docker chiếm bao nhiêudocker system dfPhần RECLAIMABLE lớn là dọn được
Container nào ăn tài nguyêndocker stats --no-streamMột container chiếm gần hết bộ nhớ máy
Container nào hay chếtdocker ps -a --filter status=exitedCó container liên tục thoát rồi chạy lại
Phiên bản Dockerdocker versionCũ 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.

Hạ tầng NVMe Enterprise của TND
VPS ổ Enterprise U.2 NVMe, CPU xung cao, đặt tại Việt Nam
Docker biến VPS thành kho ứng dụng tự host, và ổ đĩa là thứ nó vắt nhiều nhất: trên TND VPS NVMe, kéo image, build layer, volume database đều hưởng Enterprise U.2 NVMe RAID 10, nền Xeon Platinum xung cao. Bàn giao 5 phút, dán lệnh đầu bài là bắt đầu đế chế self-host của bạn.
Xem bảng giá VPS NVMe Xeon Platinum

Bài viết liên quan