Cài WordPress trên VPS bằng Docker có thể triển khai bằng hai dịch vụ trong Docker Compose: WordPress phục vụ website và MySQL lưu cơ sở dữ liệu. Tài liệu Docker Official Image cung cấp mô hình này cùng các biến kết nối tương ứng. Điểm cần làm đúng ngay từ đầu là lưu riêng dữ liệu website và cơ sở dữ liệu, để việc thay container không đồng nghĩa với bỏ dữ liệu.
Hướng dẫn dưới đây là cấu hình mẫu để dựng bản thử trên VPS Linux đã có Docker Engine và Docker Compose; chưa phải cấu hình hoàn chỉnh cho website công khai. Các lệnh dành cho người đọc thực hiện trên máy của mình, không phải kết quả đã được tác giả chạy thử. Không có cam kết về số website hay hiệu năng: cần kiểm tra tải thực tế trước khi quyết định tài nguyên.
1. Chuẩn bị môi trường và cấu hình Compose
Nếu chưa có Docker, hãy làm theo hướng dẫn cài đặt chính thức đúng hệ điều hành; riêng Ubuntu có quy trình cài Docker Engine và gói docker-compose-plugin. Sau đó kiểm tra bằng hai lệnh bên dưới. Chỉ tiếp tục khi Docker truy cập được daemon và Compose trả về phiên bản. Nếu gặp lỗi quyền hoặc dịch vụ chưa chạy, xử lý môi trường trước, thay vì sửa cấu hình WordPress.
Kiểm tra trên VPS:
docker info
docker compose version
Tạo một thư mục dự án riêng, đặt tệp compose.yaml và hai tệp db_password.txt, db_root_password.txt trong đó. Điền hai mật khẩu mạnh, khác nhau; không dùng mật khẩu minh họa hoặc đưa tệp bí mật vào kho mã công khai. Docker Compose chuyển secret thành tệp trong /run/secrets và chỉ cấp cho dịch vụ được khai báo. Đây vẫn là tệp trên máy chủ, nên cần bảo vệ cả bản gốc và bản sao lưu.
Nội dung compose.yaml mẫu:
services:
db:
image: mysql:8.4
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_password
- db_root_password
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:apache
restart: unless-stopped
depends_on:
- db
ports:
- "127.0.0.1:8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- wp_data:/var/www/html
secrets:
db_password:
file: ./db_password.txt
db_root_password:
file: ./db_root_password.txt
volumes:
db_data:
wp_data:
Trong ví dụ, MySQL tạo database wordpress và người dùng tương ứng khi khởi tạo dữ liệu mới; WordPress dùng đúng tên database, tài khoản và mật khẩu đó. Hai thẻ mysql:8.4 và wordpress:apache là lựa chọn minh họa, không phải cam kết cố định nội dung image. Trước triển khai thật, hãy xác nhận thẻ còn được cung cấp và ghi lại image đang dùng để phục vụ quay lui.
Hai volume có nhiệm vụ khác nhau: db_data gắn vào /var/lib/mysql, còn wp_data gắn vào /var/www/html. Theo Docker, volume tồn tại độc lập với container và được Compose sử dụng lại trong những lần khởi động sau. Tuy nhiên, lưu bền không thay thế sao lưu: xóa nhầm volume hoặc mất ổ đĩa vẫn đòi hỏi một bản phục hồi riêng.

2. Khởi động, kiểm tra và truy cập bản thử
Trong thư mục chứa compose.yaml, kiểm tra cấu hình rồi khởi động:
docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 db wordpress
Lệnh config kiểm tra cấu hình Compose; up -d chạy dịch vụ ở nền. Hãy đọc trạng thái và log thay vì coi việc lệnh kết thúc là bằng chứng website đã hoạt động.
Khai báo depends_on trong mẫu chỉ sắp xếp thứ tự khởi động, không bảo đảm MySQL đã sẵn sàng nhận kết nối. Nếu WordPress báo lỗi kết nối database lúc đầu, kiểm tra log MySQL và chờ quá trình khởi tạo hoàn tất. Nếu lỗi còn tồn tại, đối chiếu tên database, tài khoản và secret. Với volume MySQL đã có dữ liệu, sửa biến khởi tạo không tự đổi mật khẩu trong database hiện hữu.
Cổng 8080 được gắn vào địa chỉ loopback của VPS. Để mở bản thử từ máy cá nhân, dùng SSH chuyển tiếp cổng; thay user và VPS_IP bằng thông tin của bạn:
ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@VPS_IP
Giữ phiên này mở rồi truy cập http://127.0.0.1:8080 trong trình duyệt. Nếu máy cá nhân đang dùng cổng 8080, đổi cổng đầu tiên và địa chỉ truy cập tương ứng.
Hoàn tất trình cài đặt WordPress, sau đó kiểm tra đăng nhập, tạo bài nháp và tải một tệp thử. Đây là bước kiểm tra đề xuất, không phải kết quả đo kiểm của cấu hình. Với website công khai, cần chuẩn bị tên miền và HTTPS; nếu đặt reverse proxy kết thúc TLS phía trước, tài liệu WordPress image yêu cầu truyền X-Forwarded-Proto phù hợp. Không dùng địa chỉ loopback của bản thử làm địa chỉ website chính thức.

3. Sao lưu và quay lui trước khi nâng cấp
WordPress lưu nội dung ở cả cơ sở dữ liệu và hệ thống tệp, vì vậy chỉ giữ compose.yaml hoặc chỉ sao chép thư mục upload là chưa đủ. Theo hướng dẫn sao lưu của WordPress và Docker, cần giữ bản xuất database, tệp website và cấu hình cần thiết. Nên thử phục hồi vào môi trường riêng trước khi tin vào bản sao lưu; bảo vệ secret đi kèm và giữ một bản ngoài VPS.
Khi cần tháo bản chạy thử mà giữ volume, dùng:
docker compose down
Khi cần dựng lại cùng dự án:
docker compose up -d
Không thêm --volumes hoặc -v nếu còn cần dữ liệu: tùy chọn đó yêu cầu xóa các named volume được khai báo. Cũng không dùng thao tác xóa volume như cách chữa lỗi kết nối database.
Trước nâng cấp, lưu cấu hình, thông tin image và bản sao lưu đồng bộ tệp cùng database. Nếu thay đổi gây lỗi, dừng ghi dữ liệu và phục hồi bộ dữ liệu tương ứng khi cần; chỉ đổi về image cũ không bảo đảm đảo ngược thay đổi trong database hay volume. Docker Official Image còn lưu ý WordPress mặc định có thể tự cập nhật bên trong volume, nên cần quản lý cả cập nhật ứng dụng, theme và plugin.

Nguồn tham khảo
docker.com (14 tài liệu)
- /_/wordpress
- /compose/how-tos/use-secrets
- /engine/install/ubuntu
- /engine/install
- /_/mysql
- /engine/storage/volumes
- /reference/cli/docker/compose
- /reference/cli/docker/compose/config
- /reference/cli/docker/compose/up
- /reference/cli/docker/compose/ps
- /reference/cli/docker/compose/logs
- /compose/how-tos/startup-order
- /engine/network/port-publishing
- /reference/cli/docker/compose/down

