Docker trên VPS: Hướng dẫn Chạy Nhiều Website trên Một Server cho Người Mới Bắt đầu
Giới thiệu: Tại sao Docker là Giải pháp Tối ưu cho VPS?
Trong thế giới phát triển web và quản trị hệ thống hiện đại, việc chạy nhiều website trên một máy chủ VPS (Virtual Private Server) duy nhất là nhu cầu phổ biến của các doanh nghiệp vừa và nhỏ, freelancer, và nhà phát triển độc lập. Tuy nhiên, cách tiếp cận truyền thống với cài đặt trực tiếp các dịch vụ web (Apache/Nginx, PHP, MySQL) trên cùng một hệ điều hành thường dẫn đến những thách thức đáng kể: xung đột phiên bản phần mềm, khó khăn trong việc cô lập môi trường, và rủi ro khi một website gặp sự cố có thể ảnh hưởng đến toàn bộ server.
Docker xuất hiện như một công nghệ container hóa mang tính cách mạng, giải quyết triệt để những vấn đề này. Bằng cách đóng gói mỗi website cùng với tất cả các thư viện, phần mềm phụ thuộc của nó vào một "container" độc lập, Docker cho phép bạn chạy hàng chục website khác nhau—với các yêu cầu về phiên bản PHP, Python, Node.js, hay cơ sở dữ liệu khác biệt—trên cùng một VPS mà không có bất kỳ xung đột nào. Mỗi container hoạt động như một môi trường thực thi tách biệt, nhẹ và hiệu quả, chia sẻ nhân hệ điều hành của máy chủ nhưng có không gian người dùng và hệ thống file riêng.
Bài viết này cung cấp một hướng dẫn toàn diện, từng bước dành cho người mới bắt đầu, để thiết lập một VPS chạy nhiều website sử dụng Docker. Chúng tôi sẽ tập trung vào một kiến trúc thực tế, dễ bảo trì, sử dụng các công cụ phổ biến như Docker Compose và Nginx Proxy Manager để quản lý proxy và SSL một cách trực quan.
Kiến trúc Hệ thống: Cách Docker Quản lý Nhiều Website
Trước khi đi vào triển khai, điều quan trọng là phải hiểu kiến trúc tổng thể. Trong mô hình truyền thống (không dùng Docker), bạn có một cài đặt Nginx/Apache duy nhất lắng nghe cổng 80/443. Cấu hình virtual host sẽ chỉ định thư mục gốc tài liệu (document root) cho từng tên miền. Tất cả các website này chạy trong cùng một môi trường hệ điều hành.
Với Docker, kiến trúc trở nên linh hoạt và được phân tách rõ ràng hơn:
- Mỗi Website là một Container (hoặc Nhóm Container): Một website WordPress có thể bao gồm hai container: một cho PHP-FPM + WordPress code, và một cho cơ sở dữ liệu MySQL. Một ứng dụng Node.js có thể chỉ là một container duy nhất chứa ứng dụng.
- Reverse Proxy Trung tâm: Một container đặc biệt đảm nhận vai trò reverse proxy (ví dụ: Nginx Proxy Manager) chạy trên mạng Docker và lắng nghe các cổng 80 (HTTP) và 443 (HTTPS) của máy chủ VPS. Nó nhận tất cả lưu lượng truy cập từ internet.
- Định tuyến dựa trên Tên miền: Reverse Proxy kiểm tra tên miền được yêu cầu (Host header) và chuyển tiếp (proxy) lưu lượng đến đúng container chứa website tương ứng, thông qua tên mạng nội bộ của Docker.
- Mạng Docker Nội bộ: Các container giao tiếp với nhau qua mạng Docker do người dùng định nghĩa, cách ly khỏi host network để tăng cường bảo mật.
Kiến trúc này mang lại nhiều lợi ích: cô lập hoàn toàn giữa các dự án, dễ dàng mở rộng hoặc thu hẹp quy mô từng website độc lập, và quy trình triển khai (deploy) được tiêu chuẩn hóa thông qua Docker images.
Chuẩn bị VPS và Cài đặt Docker
Bước đầu tiên là chuẩn bị một VPS. Bất kỳ nhà cung cấp nào như DigitalOcean, Linode, Vultr, hoặc AWS EC2 đều phù hợp. Chúng tôi khuyến nghị sử dụng Ubuntu 22.04 LTS hoặc Debian 12 do sự phổ biến và hỗ trợ cộng đồng tốt. Máy chủ nên có tối thiểu 1GB RAM, 25GB dung lượng ổ đĩa, và một CPU core.
Các bước cài đặt ban đầu trên VPS:
- Cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y - Cài đặt các gói tiện ích cần thiết:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common - Thêm kho lưu trữ chính thức của Docker và cài đặt:
curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh - Thêm người dùng hiện tại vào nhóm docker (để chạy lệnh không cần sudo):
sudo usermod -aG docker $USER. Bạn cần đăng xuất và đăng nhập lại để thay đổi có hiệu lực. - Cài đặt Docker Compose (phiên bản standalone):
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
Kiểm tra cài đặt bằng các lệnh docker --version và docker-compose --version. Bạn đã sẵn sàng với nền tảng container.
Thiết lập Nginx Proxy Manager (NPM) làm Reverse Proxy
Nginx Proxy Manager (NPM) là một giao diện web mã nguồn mở giúp quản lý proxy host, chứng chỉ SSL (Let's Encrypt) một cách dễ dàng. Thay vì chỉnh sửa file cấu hình Nginx thủ công, bạn có thể cấu hình mọi thứ qua GUI.
Chúng ta sẽ chạy NPM bằng Docker Compose. Tạo một thư mục dành riêng cho NPM, ví dụ: /opt/npm.
sudo mkdir -p /opt/npm
cd /opt/npmTạo file docker-compose.yml với nội dung sau:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy-network
networks:
proxy-network:
driver: bridgeGiải thích cấu hình:
- Ports: Map cổng 80/443 của host sang container để nhận lưu lượng web. Cổng 81 dành cho giao diện quản trị web.
- Volumes: Lưu trữ dữ liệu cấu hình và chứng chỉ SSL ra bên ngoài container để không bị mất khi container khởi động lại.
- Networks: Tạo một mạng Docker tên
proxy-network. Tất cả các container website sau này cần kết nối vào mạng này để NPM có thể truy cập được chúng.
Khởi chạy NPM: docker-compose up -d. Truy cập giao diện quản trị tại http://[IP-VPS-của-bạn]:81. Thông tin đăng nhập mặc định là [email protected] / changeme. Bạn nên đổi mật khẩu ngay lập tức.
Triển khai Website Đầu tiên: WordPress với Docker Compose
Bây giờ, chúng ta sẽ triển khai một website WordPress làm ví dụ. Mỗi dự án nên nằm trong thư mục riêng biệt. Tạo thư mục /opt/wordpress-site.
sudo mkdir -p /opt/wordpress-site
cd /opt/wordpress-siteTạo file docker-compose.yml cho WordPress:
version: '3.8'
services:
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: secure_password_here
MYSQL_ROOT_PASSWORD: strong_root_password_here
volumes:
- db_data:/var/lib/mysql
networks:
- wp-network
wordpress:
depends_on:
- db
image: wordpress:php8.2-apache
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: secure_password_here
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
networks:
- wp-network
- proxy-network # Kết nối với mạng của NPM
volumes:
db_data:
wp_data:
networks:
wp-network:
driver: bridge
proxy-network:
external: true # Sử dụng mạng đã được tạo bởi NPMLưu ý quan trọng: Chúng ta khai báo mạng proxy-network là external và kết nối container wordpress vào đó. Điều này cho phép NPM (cũng đang ở trên proxy-network) có thể giao tiếp với container WordPress thông qua tên service là wordpress.
Khởi chạy website: docker-compose up -d. Kiểm tra container đang chạy với docker-compose ps.
Cấu hình Nginx Proxy Manager cho Tên miền
Giả sử bạn có tên miền example.com trỏ A record về IP của VPS. Truy cập giao diện NPM tại cổng 81.
- Vào Hosts > Proxy Hosts, click Add Proxy Host.
- Domain Names: Nhập
example.com(bạn có thể thêm cảwww.example.com). - Scheme:
http(vì container WordPress chạy HTTP nội bộ). - Forward Hostname / IP: Nhập tên service của container WordPress:
wordpress(đây là tên mạng nội bộ trong Docker). - Forward Port:
80(cổng mặc định của container WordPress image). - Bật Block Common Exploits và Websockets Support nếu cần.
- Trong tab SSL, chọn "Request a new SSL Certificate", bật "Force SSL" và "HTTP/2 Support". Nhập email của bạn và click Save. NPM sẽ tự động lấy chứng chỉ Let's Encrypt cho bạn.
Sau vài giây, bạn có thể truy cập https://example.com và sẽ thấy trang cài đặt WordPress. Quy trình tương tự được áp dụng cho bất kỳ website container nào khác. Chỉ cần thay đổi Forward Hostname thành tên service của container ứng dụng đó.
Quản lý, Giám sát và Bảo mật
Với nhiều container chạy cùng lúc, việc quản lý hiệu quả là rất quan trọng.
1. Giám sát cơ bản:
- Docker CLI: Sử dụng
docker psđể xem các container đang chạy,docker logs [tên-container]để xem log,docker statsđể xem tài nguyên CPU, RAM sử dụng. - Portainer (Tùy chọn): Một giao diện web quản lý Docker toàn diện. Có thể triển khai như một container khác để quản lý tất cả các Docker environment của bạn một cách trực quan.
2. Cập nhật và Sao lưu:
- Cập nhật Images: Định kỳ chạy
docker-compose pulltrong mỗi thư mục dự án để tải image mới nhất, sau đódocker-compose up -d --remove-orphansđể khởi động lại container với image mới. - Sao lưu Volumes: Dữ liệu quan trọng (database, file upload) nằm trong Docker volumes. Sử dụng lệnh
docker run --rm -v [tên-volume]:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz /datađể sao lưu volume thành file tar.gz.
3. Bảo mật cơ bản:
- Không chạy container as root: Nhiều image chính thức đã chạy với non-root user. Kiểm tra và sử dụng chúng.
- Giới hạn tài nguyên: Trong
docker-compose.yml, bạn có thể thêm cấu hìnhdeploy.resources.limitsđể giới hạn CPU, RAM cho mỗi container, ngăn một website chiếm dụng toàn bộ tài nguyên server. - Cập nhật Docker và Hệ điều hành: Luôn áp dụng các bản cập nhật bảo mật.
Kết luận: Tối ưu Chi phí và Nâng cao Hiệu quả
Việc sử dụng Docker để chạy nhiều website trên một VPS không chỉ là một kỹ thuật hiện đại mà còn là một chiến lược kinh tế thông minh. Thay vì phải thuê nhiều VPS riêng lẻ cho từng dự án nhỏ, bạn có thể hợp nhất chúng trên một server mạnh hơn, giảm đáng kể chi phí hàng tháng. Hơn nữa, Docker chuẩn hóa môi trường phát triển và production, giúp việc di chuyển dự án, thêm thành viên vào nhóm, và tự động hóa triển khai trở nên dễ dàng hơn bao giờ hết.
Bắt đầu với một website đơn giản như WordPress, sau đó mở rộng sang các ứng dụng Node.js, Python Django, hoặc thậm chí các dịch vụ backend API. Với kiến trúc dựa trên container và một reverse proxy trung tâm như Nginx Proxy Manager, bạn có toàn quyền kiểm soát và khả năng mở rộng gần như vô hạn trên nền tảng VPS của mình. Hãy bắt đầu thử nghiệm ngay hôm nay để khám phá sức mạnh thực sự của việc quản trị server hiện đại.
