Giới thiệu
Docker đã trở thành công cụ tiêu chuẩn để đóng gói và triển khai ứng dụng trên môi trường máy chủ. Bài viết này hướng dẫn cách đưa một ứng dụng Node.js đơn giản lên VPS sử dụng Docker, giúp bạn giảm thiểu phụ thuộc môi trường và tăng tính di động.
Chuẩn bị môi trường VPS
Cài đặt Docker
Đầu tiên, truy cập vào VPS bằng SSH và chạy các lệnh sau để cài đặt Docker Engine:
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io sudo systemctl enable docker sudo systemctl start docker
Sau khi cài đặt, kiểm tra phiên bản Docker bằng lệnh docker --version để xác nhận quá trình cài đặt thành công.
Cài đặt Docker Compose
Docker Compose cho phép quản lý nhiều container bằng một file cấu hình. Thực hiện các lệnh sau:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version
Viết Dockerfile cho ứng dụng Node.js
Giả sử bạn có một dự án Node.js với file package.json và app.js. Tạo file Dockerfile trong thư mục gốc của dự án với nội dung sau:
FROM node:14 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["node","app.js"]
Dockerfile này thực hiện các bước:
- Chọn image Node.js phiên bản 14.
- Thiết lập thư mục làm việc
/app. - Copy file
package.jsonvàpackage-lock.jsonrồi chạynpm installđể cài đặt phụ thuộc. - Copy toàn bộ mã nguồn vào container.
- Mở cổng 3000 để ứng dụng lắng nghe.
- Khởi chạy ứng dụng bằng
node app.js.
Sử dụng Docker Compose
Để quản lý container dễ dàng, tạo file docker-compose.yml như sau:
version: "3.8"
services:
web:
build: .
ports:
- "80:3000"
restart: always
File này sẽ build image từ Dockerfile hiện tại và ánh xạ cổng 80 của VPS tới cổng 3000 trong container, cho phép truy cập ứng dụng qua trình duyệt.
Triển khai lên VPS
Upload dự án và khởi chạy
Sử dụng SCP hoặc SFTP để chuyển toàn bộ thư mục dự án lên VPS, ví dụ:
scp -r ./my-node-app user@your-vps-ip:/home/user/
Sau khi đã có file Dockerfile và docker-compose.yml trên máy chủ, thực hiện các lệnh sau:
cd /home/user/my-node-app docker-compose up -d --build
Lệnh docker-compose up -d --build sẽ xây dựng image và chạy container ở chế độ nền. Kiểm tra trạng thái bằng docker ps.
Kiểm tra và bảo trì
Truy cập địa chỉ IP của VPS trên trình duyệt; nếu mọi thứ đúng, bạn sẽ thấy ứng dụng Node.js hiển thị. Để cập nhật mã nguồn, chỉ cần pull thay đổi, rồi chạy lại docker-compose up -d --build. Để dừng container, dùng docker-compose down.
Cấu hình SSL bằng Let's Encrypt trên Docker
Để bảo mật kết nối HTTPS, bạn có thể sử dụng Certbot trong một container riêng để tự động tạo và gia hạn chứng chỉ SSL. Các bước cơ bản:
- Cài đặt Certbot bằng Docker image
certbot/certbot. - Chạy lệnh tạo chứng chỉ, truyền tên miền và email.
- Mount thư mục chứa chứng chỉ vào container web để Nginx hoặc Apache sử dụng.
Ví dụ lệnh tạo chứng chỉ:
docker run -it --rm \ -v "/etc/letsencrypt:/etc/letsencrypt" \ -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ -v "/home/user/my-node-app:/data" \ certbot/certbot certonly \ --webroot -w /data -d example.com -d www.example.com \ --email [email protected] --agree-tos --no-eff-email
Sau khi chứng chỉ được tạo, bạn chỉ cần cập nhật file cấu hình Nginx để trỏ tới /etc/letsencrypt/live/example.com/fullchain.pem và /etc/letsencrypt/live/example.com/privkey.pem. Khi sử dụng Docker Compose, có thể thêm một service cho Nginx và mount các volume chứng chỉ.
Tối ưu hoá Dockerfile cho môi trường production
Dockerfile ở trên phù hợp cho môi trường development, nhưng trong production chúng ta muốn giảm kích thước image và loại bỏ các công cụ không cần thiết. Sử dụng multi‑stage build là một cách hiệu quả.
# Build stage FROM node:14 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . # Production stage FROM node:14-alpine WORKDIR /app COPY --from=builder /app . EXPOSE 3000 CMD ["node","app.js"]
Ở stage đầu, chúng ta chỉ cài đặt các dependency production. Stage thứ hai dùng image nhẹ hơn node:14-alpine, chỉ chứa mã đã build, giảm đáng kể dung lượng image.
Sử dụng biến môi trường và secret
Để không lưu thông tin nhạy cảm như chuỗi kết nối database trong mã nguồn, bạn có thể truyền chúng qua biến môi trường khi khởi chạy container. Docker Compose hỗ trợ khai báo environment và secrets.
services:
web:
build: .
ports:
- "80:3000"
environment:
- NODE_ENV=production
- DB_HOST=db.example.com
- DB_USER=app_user
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
Trong mã Node.js, truy cập biến môi trường bằng process.env.DB_HOST. Khi cần thay đổi, chỉ cần cập nhật file secret mà không phải rebuild image.
Kết luận
Việc triển khai ứng dụng Node.js lên VPS bằng Docker giúp giảm thiểu lỗi môi trường và tăng tốc độ đưa sản phẩm lên production. Nếu bạn muốn nắm vững toàn bộ quy trình Deploy từ cơ bản đến nâng cao, Tham khảo khóa học "Deploy Web - Triển khai website lên môi trường Internet" tại đây.







