Quay lại danh sách
Tin tức công nghệ

Triển khai ứng dụng với Docker trên VPS

13 tháng 4, 2026
Triển khai ứng dụng Docker trên VPS

Triển khai ứng dụng với Docker trên VPS: Hướng dẫn toàn tập từ A-Z

Trong kỷ nguyên của điện toán đám mây, việc quản trị máy chủ theo cách truyền thống—cài đặt trực tiếp phần mềm lên hệ điều hành—đang dần bộc lộ nhiều hạn chế về tính linh hoạt và khả năng mở rộng. Đây chính là lúc Docker và công nghệ Containerization trở thành vị cứu tinh. Việc triển khai ứng dụng qua Docker trên VPS không chỉ giúp bạn tránh được lỗi "it works on my machine" mà còn giúp việc di chuyển (migration) giữa các nhà cung cấp VPS như Vultr, DigitalOcean hay Google Cloud trở nên đơn giản hơn bao giờ hết.

1. Hiểu về Docker và lợi ích khi chạy trên VPS

Docker là một nền tảng mã nguồn mở cho phép bạn đóng gói ứng dụng cùng với tất cả các thư viện, phụ thuộc (dependencies) và cấu hình cần thiết vào một đơn vị duy nhất gọi là Container. Khi chạy trên VPS, Docker cung cấp một lớp ảo hóa nhẹ, giúp bạn tận dụng tối đa tài nguyên phần cứng mà vẫn đảm bảo tính cô lập hoàn toàn giữa các dịch vụ.

  • Tính nhất quán: Môi trường trên VPS sẽ giống hệt môi trường máy tính cá nhân của bạn.
  • Dễ dàng mở rộng: Bạn có thể chạy 10 container giống nhau chỉ bằng một câu lệnh.
  • Quản lý tài nguyên: Giới hạn RAM/CPU cho từng dịch vụ cụ thể để tránh tình trạng một ứng dụng treo kéo theo cả server sập.

2. Hướng dẫn cài đặt Docker trên VPS Linux (Ubuntu 22.04/24.04)

Để bắt đầu, bạn cần truy cập vào VPS thông qua SSH. Hãy đảm bảo hệ thống của bạn đã được cập nhật bản vá mới nhất.


// Mô phỏng kịch bản TypeScript để tự động hóa việc kiểm tra phiên bản Docker sau cài đặt
interface DockerInfo {
    version: string;
    isActive: boolean;
    storageDriver: string;
}

function verifyDockerInstallation(rawOutput: string): DockerInfo {
    const isInstalled = rawOutput.includes("Docker version");
    return {
        version: isInstalled ? "24.0.7" : "Not Found",
        isActive: isInstalled,
        storageDriver: "overlay2"
    };
}

const status = verifyDockerInstallation("Docker version 24.0.7, build afdd53b");
console.log(`Trạng thái Docker: ${status.isActive ? "Sẵn sàng" : "Lỗi"}`);
    

Các bước cài đặt thủ công

1. Cập nhật chỉ mục gói và cài đặt các phụ thuộc cần thiết:

sudo apt update && sudo apt install apt-transport-https ca-certificates curl software-properties-common

2. Thêm khóa GPG chính thức của Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3. Cài đặt Docker Engine:

sudo apt install docker-ce docker-ce-cli containerd.io

3. Docker Compose - Trình quản lý đa container

Hầu hết các ứng dụng web thực tế không chạy đơn lẻ. Chúng cần cơ sở dữ liệu (MySQL, MongoDB), bộ nhớ đệm (Redis) và web server (Nginx). Docker Compose cho phép bạn định nghĩa toàn bộ hạ tầng này trong một file docker-compose.yml duy nhất.


// Định nghĩa cấu trúc dữ liệu cho một tệp Docker Compose giả định
interface ServiceConfig {
    image: string;
    ports: string[];
    environment?: Record;
    volumes?: string[];
    networks: string[];
}

interface DockerCompose {
    version: string;
    services: Record;
}

const myAppStack: DockerCompose = {
    version: "3.8",
    services: {
        web_app: {
            image: "my-nestjs-app:latest",
            ports: ["3000:3000"],
            networks: ["backend"],
            environment: { "NODE_ENV": "production" }
        },
        database: {
            image: "postgres:15-alpine",
            ports: ["5432:5432"],
            networks: ["backend"],
            volumes: ["db_data:/var/lib/postgresql/data"]
        }
    }
};

console.log("Hạ tầng đã được định nghĩa và sẵn sàng khởi chạy với 'docker-compose up -d'");
    

4. Đóng gói ứng dụng (Dockerfile)

Để chạy ứng dụng của bạn trong container, bạn cần tạo một Dockerfile. Đây là "công thức" hướng dẫn Docker cách xây dựng Image cho ứng dụng.

Lệnh Dockerfile Mô tả Ví dụ
FROM Chọn image nền node:18-alpine
WORKDIR Thiết lập thư mục làm việc /app
COPY Sao chép tệp từ VPS vào container package.json .
RUN Thực thi lệnh khi build image npm install
CMD Lệnh khởi chạy khi container bắt đầu npm start

// Hàm mô phỏng việc tạo Dockerfile động cho ứng dụng Node.js
function generateDockerfile(nodeVersion: string, entryPoint: string): string {
    return `
    FROM node:${nodeVersion}-slim
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install --production
    COPY . .
    EXPOSE 8080
    CMD ["node", "${entryPoint}"]
    `;
}

console.log(generateDockerfile("20", "dist/main.js"));
    

5. Quản lý dữ liệu với Docker Volumes

Một đặc điểm quan trọng của container là tính "tạm thời" (ephemeral). Nếu container bị xóa, mọi dữ liệu bên trong nó cũng mất sạch. Để giải quyết vấn đề này trên VPS, chúng ta sử dụng Volumes hoặc Bind Mounts.

Ví dụ: Khi triển khai cơ sở dữ liệu MySQL, bạn phải gắn thư mục lưu trữ của MySQL trên container vào một thư mục vật lý trên ổ cứng của VPS. Điều này đảm bảo khi bạn cập nhật phiên bản MySQL mới, dữ liệu khách hàng vẫn an toàn.

6. Reverse Proxy và Bảo mật với Nginx Proxy Manager

Khi chạy nhiều container web trên cùng một VPS, làm thế nào để ánh xạ các domain khác nhau (ví dụ: app1.com, app2.com) vào đúng các container? Câu trả lời là sử dụng một Reverse Proxy.

Nginx Proxy Manager là một công cụ có giao diện Web chạy bằng Docker, giúp bạn quản lý các bản ghi proxy và tự động gia hạn SSL Let's Encrypt chỉ bằng vài cú click. Đây là bước bắt buộc để website của bạn đạt tiêu chuẩn HTTPS bảo mật.


// Logic TypeScript mô phỏng việc định tuyến yêu cầu từ Reverse Proxy
interface ProxyRoute {
    domain: string;
    containerIp: string;
    internalPort: number;
    useSSL: boolean;
}

const routes: ProxyRoute[] = [
    { domain: "api.thaovien.com", containerIp: "172.18.0.5", internalPort: 3000, useSSL: true },
    { domain: "vps-sales.com", containerIp: "172.18.0.7", internalPort: 80, useSSL: true }
];

routes.forEach(route => {
    console.log(`Đang định tuyến ${route.domain} tới container ${route.containerIp}:${route.internalPort}`);
});
    

7. Tối ưu hóa hiệu năng Docker trên VPS

Triển khai xong chưa phải là kết thúc. Để hệ thống chạy ổn định 24/7, bạn cần thực hiện các bước tối ưu sau:

  • Dọn dẹp tài nguyên thừa: Sử dụng lệnh docker system prune -a hàng tuần để xóa các image không dùng tới, giải phóng dung lượng ổ cứng.
  • Sử dụng Alpine Images: Ưu tiên các Image nền có hậu tố -alpine để giảm kích thước Image từ hàng trăm MB xuống còn vài chục MB.
  • Logging driver: Cấu hình giới hạn kích thước file log trong daemon.json để tránh tình trạng file log phình to làm đầy ổ cứng VPS.

8. Chiến lược sao lưu (Backup) và Phục hồi

Đối với Docker trên VPS, việc sao lưu trở nên rất khoa học. Bạn chỉ cần sao lưu hai thứ:

  1. Tất cả các tệp cấu hình .env và docker-compose.yml.
  2. Dữ liệu trong các thư mục được gắn Volume.

Với hai thành phần này, bạn có thể khôi phục toàn bộ hệ thống trên một VPS hoàn toàn mới chỉ trong chưa đầy 5 phút.

9. Kết luận

Docker không chỉ là một công cụ, nó là một tư duy mới về triển khai ứng dụng. Bằng cách áp dụng Docker lên VPS, bạn đã nâng cấp bản thân từ một người "quản trị server" thành một "DevOps Engineer" thực thụ. Việc đóng gói mọi thứ vào container giúp hệ thống của bạn trở nên gọn gàng, bảo mật và cực kỳ dễ dàng để mở rộng trong tương lai.

Hãy bắt đầu bằng việc chuyển đổi một ứng dụng nhỏ nhất của bạn sang Docker ngay hôm nay. Chúc bạn thành công trên con đường làm chủ công nghệ ảo hóa container!