Cách deploy NodeJS bằng Docker trên VPS từ A-Z cho người mới bắt đầu
Deploy app NodeJS lên VPS thường là bước khiến người mới ngại nhất: sợ lỗi môi trường, sợ “chạy ở máy em nhưng lên server lại hỏng”, sợ cấu hình Nginx, PM2, port, firewall. Tin tốt: Docker giải quyết gần hết mớ rắc rối đó.
Thay vì cài Node, package, service trực tiếp lên VPS, bạn đóng gói app vào container. Kết quả: môi trường dev/staging/prod gần như giống nhau, dễ deploy, dễ rollback, dễ scale hơn. Với người mới, đây là con đường ngắn nhất để đưa app NodeJS lên mạng một cách gọn gàng, ít lỗi.
Trong bài này, bạn sẽ đi từ 0 đến chạy được app thực tế trên VPS: chuẩn bị server, viết Dockerfile, docker-compose.yml, build image, chạy container, map domain, reverse proxy bằng Nginx, bật HTTPS, debug lỗi cơ bản.
Vì sao nên deploy NodeJS bằng Docker?
Cách cũ thường là:
– SSH vào VPS
– Cài NodeJS
– git clone
– npm install
– npm run build
– Chạy bằng PM2
Cách này vẫn ổn, nhưng có vài vấn đề:
– Lệ thuộc môi trường server → lệch version Node, thiếu package hệ thống.
– Khó lặp lại → server mới phải cài lại từ đầu.
– Khó rollback → deploy lỗi thì xử lý thủ công.
– Dễ “rác” server → nhiều app, nhiều version, khó quản lý.
Docker giúp:
– App + môi trường → đóng gói cùng nhau.
– Build một lần, chạy mọi nơi.
– Tách biệt service → app này không ảnh hưởng app khác.
– Triển khai chuẩn hóa → đặc biệt hữu ích khi làm team.
Bạn cần chuẩn bị gì?
Trước khi bắt đầu, hãy có:
– 1 VPS Linux: Ubuntu 22.04 là dễ nhất.
– 1 app NodeJS: ví dụ Express/NestJS/Next backend.
– 1 domain nếu muốn chạy thực tế có HTTPS.
– Kiến thức cơ bản:
– SSH vào server
– dùng terminal
– hiểu port là gì
Ví dụ app NodeJS chạy ở port 3000.
Bước 1: SSH vào VPS và cài Docker
Đầu tiên, đăng nhập VPS:
ssh root@your_vps_ip
Cập nhật hệ thống:
apt update && apt upgrade -y
Cài Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Kiểm tra:
docker --version
Cài Docker Compose plugin:
apt install docker-compose-plugin -y
Kiểm tra:
docker compose version
Nếu muốn chạy Docker không cần root, thêm user vào group docker:
Kết quả: app an toàn hơn, trình duyệt không báo “Not Secure”.
Bước 11: Quy trình deploy lại khi có code mới
Khi cập nhật app:
cd your-repo
git pull
docker compose up -d --build
Quy trình này nghĩa là:
– kéo code mới
– build lại image
– recreate container
– app chạy phiên bản mới
Nếu cần dọn image cũ:
docker image prune -a
Hãy cẩn thận vì lệnh này xóa image không dùng tới.
Lỗi phổ biến người mới hay gặp
Container chạy rồi nhưng web không vào được
Nguyên nhân thường là:
– app đang listen localhost thay vì 0.0.0.0
– map sai port
– firewall chặn
– Nginx proxy sai
Với Express, nên:
app.listen(3000, '0.0.0.0');
npm install lỗi khi build
Thường do:
– Node version không phù hợp
– package native cần build tools
– lock file cũ
Fix:
– đổi image Node phù hợp, ví dụ node:20-alpine
– kiểm tra package-lock.json
– nếu cần, dùng image Debian thay Alpine
App crash ngay sau khi start
Xem log:
docker compose logs -f
Thường do thiếu biến môi trường hoặc DB chưa kết nối được.
Kết luận
Với người mới, deploy NodeJS lên VPS bằng Docker là lựa chọn rất đáng học. Lợi ích lớn nhất không chỉ là “chạy được”, mà là chạy ổn định, dễ lặp lại, dễ sửa lỗi. Một khi đã có Dockerfile và docker-compose.yml, bạn có thể mang app đi gần như bất kỳ VPS nào mà quy trình vẫn giống nhau.
Lộ trình thực tế nên là:
– chạy local bằng Docker
– đưa lên VPS
– thêm Nginx
– thêm HTTPS
– sau đó mới nghĩ tới CI/CD, GitHub Actions, registry, zero-downtime deploy
Nếu bạn mới bắt đầu, đừng cố tối ưu quá sớm. Chỉ cần làm đúng 3 thứ: Docker hóa app, chạy ổn trên VPS, gắn domain + HTTPS. Chừng đó đã đủ để bạn có một hệ thống production cơ bản, sạch và chuyên nghiệp hơn rất nhiều so với deploy thủ công.