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

Docker trên VPS: Hướng dẫn chi tiết chạy nhiều website trên một server cho người mới bắt đầu

17 tháng 5, 2026

Giới thiệu về Docker và lợi ích cho quản trị VPS

Trong thế giới phát triển web và quản trị hệ thống hiện đại, Docker đã trở thành công cụ không thể thiếu cho cả developer lẫn system administrator. Đặc biệt đối với những người mới bắt đầu với VPS (Virtual Private Server), Docker mang đến giải pháp tối ưu để chạy nhiều website trên cùng một server mà không cần phải đầu tư vào nhiều máy chủ vật lý.

Docker là nền tảng containerization cho phép đóng gói ứng dụng cùng với tất cả dependencies vào một container độc lập. Mỗi container chạy trong môi trường cô lập, chia sẻ kernel của hệ điều hành host nhưng có không gian người dùng riêng biệt. Điều này khác biệt hoàn toàn với máy ảo truyền thống (VM) yêu cầu toàn bộ hệ điều hành riêng cho mỗi instance.

"Containerization không chỉ giúp tiết kiệm tài nguyên mà còn đơn giản hóa quy trình triển khai và bảo trì hệ thống." - DevOps Engineer tại TechCorp

Tại sao nên sử dụng Docker cho nhiều website trên một VPS?

Khi bạn sở hữu một VPS với cấu hình khiêm tốn (1-2GB RAM, 1-2 CPU cores), việc chạy nhiều website truyền thống có thể gặp nhiều thách thức:

  • Xung đột phiên bản: Website A cần PHP 7.4 trong khi Website B yêu cầu PHP 8.0
  • Phức tạp trong cấu hình: Mỗi website cần virtual host riêng trong Nginx/Apache
  • Khó khăn trong bảo mật: Lỗi trên một website có thể ảnh hưởng đến toàn bộ server
  • Quản lý dependency phức tạp: Các thư viện và extension có thể xung đột với nhau

Docker giải quyết tất cả những vấn đề này bằng cách cung cấp môi trường độc lập cho mỗi website. Mỗi container chứa đầy đủ môi trường chạy ứng dụng, từ phiên bản PHP, database driver đến các thư viện hệ thống cần thiết.

Chuẩn bị môi trường và cài đặt Docker trên VPS

Yêu cầu hệ thống tối thiểu

Để chạy Docker hiệu quả trên VPS, bạn cần đảm bảo các yêu cầu sau:

  • VPS chạy Ubuntu 20.04 LTS trở lên hoặc CentOS 7/8
  • Tối thiểu 1GB RAM (khuyến nghị 2GB cho nhiều container)
  • 20GB dung lượng ổ cứng trống
  • Kết nối Internet ổn định

Các bước cài đặt Docker trên Ubuntu

Quy trình cài đặt Docker trên Ubuntu khá đơn giản:

  1. Cập nhật package list: sudo apt update
  2. Cài đặt các package cần thiết: sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. Thêm Docker GPG key: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. Thêm Docker repository: echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. Cài đặt Docker Engine: sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io
  6. Khởi động và kích hoạt Docker: sudo systemctl start docker && sudo systemctl enable docker
  7. Thêm user hiện tại vào group docker: sudo usermod -aG docker $USER

Sau khi cài đặt, kiểm tra phiên bản Docker bằng lệnh: docker --version. Bạn cần đăng xuất và đăng nhập lại để áp dụng thay đổi group.

Cấu trúc dự án và quản lý nhiều website với Docker

Tổ chức thư mục dự án

Để quản lý hiệu quả nhiều website, bạn nên tổ chức thư mục theo cấu trúc sau:

  • /docker-projects/ - Thư mục gốc chứa tất cả dự án
  • /docker-projects/website1/ - Chứa source code và Dockerfile cho website thứ nhất
  • /docker-projects/website2/ - Chứa source code và Dockerfile cho website thứ hai
  • /docker-projects/nginx-proxy/ - Chứa cấu hình reverse proxy
  • /docker-projects/docker-compose.yml - File compose chung quản lý tất cả services

Tạo Dockerfile cho ứng dụng web

Mỗi website cần một Dockerfile định nghĩa môi trường chạy. Ví dụ cho website WordPress:

FROM php:8.0-fpm-alpine

RUN apk add --no-cache \
    nginx \
    supervisor \
    curl \
    git \
    zip \
    unzip \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql

COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY src/ /var/www/html/

EXPOSE 80

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

Triển khai Reverse Proxy với Nginx để quản lý nhiều domain

Khi chạy nhiều website trên cùng một VPS, bạn cần reverse proxy để định tuyến request đến đúng container dựa trên domain name. Cấu hình Nginx proxy manager đơn giản:

server {
    listen 80;
    server_name website1.com www.website1.com;

    location / {
        proxy_pass http://website1-container:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name website2.com www.website2.com;

    location / {
        proxy_pass http://website2-container:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Sử dụng Docker Compose để quản lý đa container

Docker Compose cho phép định nghĩa và chạy nhiều container cùng lúc thông qua file YAML. Đây là công cụ lý tưởng để quản lý nhiều website:

version: '3.8'

services:
  website1:
    build: ./website1
    container_name: website1-container
    restart: unless-stopped
    volumes:
      - ./website1/src:/var/www/html
      - ./website1/logs:/var/log/nginx
    environment:
      - DB_HOST=database
      - DB_NAME=website1_db
    networks:
      - web-network

  website2:
    build: ./website2
    container_name: website2-container
    restart: unless-stopped
    volumes:
      - ./website2/src:/var/www/html
      - ./website2/logs:/var/log/nginx
    environment:
      - DB_HOST=database
      - DB_NAME=website2_db
    networks:
      - web-network

  nginx-proxy:
    image: nginx:alpine
    container_name: nginx-proxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx-proxy/conf.d:/etc/nginx/conf.d
      - ./nginx-proxy/ssl:/etc/nginx/ssl
    depends_on:
      - website1
      - website2
    networks:
      - web-network

  database:
    image: mysql:8.0
    container_name: mysql-database
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: secure_password
      MYSQL_DATABASE: website1_db
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - web-network

networks:
  web-network:
    driver: bridge

volumes:
  db-data:

Để khởi động tất cả services, chạy lệnh: docker-compose up -d. Để dừng tất cả: docker-compose down.

Quản lý dữ liệu và backup với Docker Volumes

Các loại volume trong Docker

Docker cung cấp ba loại volume để quản lý dữ liệu:

  • Named volumes: Được quản lý bởi Docker, lý tưởng cho database
  • Bind mounts: Map trực tiếp thư mục host vào container
  • tmpfs mounts: Lưu trong memory, phù hợp cho dữ liệu tạm thời

Chiến lược backup cho nhiều website

Để đảm bảo an toàn dữ liệu, implement backup strategy sau:

  1. Backup database hàng ngày: docker exec mysql-database mysqldump -u root -psecure_password website1_db > backup_$(date +%Y%m%d).sql
  2. Backup source code hàng tuần: tar -czf website1_backup_$(date +%Y%m%d).tar.gz ./website1/src
  3. Backup Docker volumes: docker run --rm -v db-data:/volume -v $(pwd)/backup:/backup alpine tar -czf /backup/db-data_$(date +%Y%m%d).tar.gz -C /volume ./
  4. Đồng bộ backup lên cloud storage (AWS S3, Google Cloud Storage)

Giám sát và tối ưu hiệu năng

Công cụ giám sát Docker

Để đảm bảo các website chạy ổn định, sử dụng các công cụ giám sát:

  • Docker Stats: docker stats hiển thị CPU, memory, network usage
  • cAdvisor: Container advisor từ Google cung cấp metrics chi tiết
  • Prometheus + Grafana: Hệ thống monitoring chuyên nghiệp
  • Docker Logs: docker logs [container-name] để xem log ứng dụng

Tối ưu hiệu năng cho VPS giới hạn tài nguyên

Khi chạy nhiều container trên VPS tài nguyên hạn chế, áp dụng các kỹ thuật tối ưu:

  • Giới hạn memory cho mỗi container: --memory="512m" --memory-swap="1g"
  • Sử dụng Alpine-based images thay vì full images để tiết kiệm disk space
  • Implement resource limits trong docker-compose.yml
  • Sử dụng .dockerignore để loại bỏ file không cần thiết trong build context
  • Chạy database trên container riêng và tối ưu query

Bảo mật cho môi trường Docker đa website

Bảo mật là yếu tố quan trọng khi chạy nhiều website trên cùng server:

  1. Network isolation: Sử dụng Docker networks riêng biệt cho mỗi nhóm website
  2. Non-root user: Chạy container với user không phải root trong Dockerfile
  3. Regular updates: Cập nhật base images và dependencies thường xuyên
  4. Secret management: Sử dụng Docker secrets hoặc environment variables được mã hóa
  5. Resource limits: Ngăn chặn DoS attacks bằng cách giới hạn tài nguyên container
  6. Firewall configuration: Chỉ mở port cần thiết trên VPS firewall

Triển khai SSL/TLS với Let's Encrypt

Bảo mật giao tiếp với HTTPS là bắt buộc cho website hiện đại. Triển khai SSL miễn phí với Let's Encrypt:

version: '3.8'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    networks:
      - web-network

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-companion
    depends_on:
      - nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    environment:
      - NGINX_PROXY_CONTAINER=nginx-proxy
    networks:
      - web-network

Sau đó, thêm environment variable VIRTUAL_HOST và LETSENCRYPT_HOST cho mỗi website container để tự động cấp chứng chỉ SSL.

Xử lý sự cố và troubleshooting thường gặp

Các vấn đề phổ biến và giải pháp

  • Container không khởi động: Kiểm tra log với docker logs [container-name]
  • Out of memory: Giảm số lượng container hoặc tăng memory limit
  • Port conflict: Đảm bảo mỗi container expose port khác nhau hoặc sử dụng reverse proxy
  • Database connection refused: Kiểm tra network configuration và firewall rules
  • Slow performance: Monitor resource usage và tối ưu application code

Công cụ debugging hữu ích

  • docker exec -it [container-name] /bin/bash - Truy cập shell trong container
  • docker inspect [container-name] - Xem chi tiết cấu hình container
  • docker system df - Kiểm tra disk usage của Docker
  • docker events - Theo dõi real-time events trong Docker daemon

Kết luận và hướng phát triển tiếp theo

Docker đã cách mạng hóa cách chúng ta triển khai và quản lý ứng dụng web trên VPS. Với kiến thức trong bài viết này, bạn hoàn toàn có thể tự tin vận hành nhiều website trên một server duy nhất, từ blog cá nhân đến ứng dụng doanh nghiệp.

Lợi ích chính của việc sử dụng Docker cho đa website bao gồm: tiết kiệm chi phí (chỉ cần một VPS), dễ dàng scaling (thêm container khi cần), cô lập môi trường (tránh xung đột dependency), và đơn giản hóa deployment (sử dụng CI/CD pipeline).

Để tiếp tục nâng cao kỹ năng, bạn có thể khám phá:

  • Docker Swarm hoặc Kubernetes cho orchestration ở quy mô lớn
  • CI/CD pipeline với GitHub Actions hoặc GitLab CI
  • Service mesh với Traefik hoặc Istio
  • Infrastructure as Code với Terraform
  • Cloud-native storage solutions cho stateful applications

Bắt đầu với những bước đơn giản, thực hành thường xuyên, và bạn sẽ sớm làm chủ công nghệ containerization để xây dựng hệ thống web hiệu quả và bảo mật.