Docker đang thay đổi cách các lập trình viên WordPress xây dựng và triển khai website. Thay vì phải cài đặt MAMP, XAMPP hay từng công cụ thủ công, bạn có thể thiết lập môi trường WordPress hoàn chỉnh chỉ với vài dòng lệnh. Bài viết này sẽ hướng dẫn bạn sử dụng serversideup/docker-wordpress để chạy WordPress trên Docker từ local development đến production.
Docker WordPress là gì?
Docker WordPress là cách đóng gói toàn bộ môi trường WordPress (web server, PHP, database) vào các container riêng biệt. Điều này mang lại:
- Môi trường đồng nhất giữa các máy dev, staging và production
- Dễ tái tạo chỉ với một câu lệnh
- Không xung đột phiên bản PHP, MySQL hay extension
- Tích hợp CI/CD dễ dàng
Dự án serversideup/docker-wordpress là boilerplate do đội ngũ Server Side Up phát triển, sử dụng image PHP Docker tối ưu cho WordPress, kết hợp với Traefik làm reverse proxy và MariaDB làm database.
Bước 1: Cài đặt môi trường Docker
Trước tiên, bạn cần cài Docker. Truy cập docker.com để tải Docker Desktop cho macOS/Windows hoặc Docker Engine cho Linux.
Sau khi cài, kiểm tra bằng lệnh:
docker --version
docker compose version
Bước 2: Clone repo và cài WordPress
Clone repo docker-wordpress về máy:
git clone https://github.com/serversideup/docker-wordpress.git
cd docker-wordpress
Tải và giải nén WordPress core vào thư mục public/:
wget -c https://wordpress.org/latest.tar.gz -O - | tar -xz -C public/ --strip=1 wordpress/
Thêm domain local vào file hosts:
echo "127.0.0.1 wordpress.dev.test" >> /etc/hosts
Bước 3: Chạy Docker Compose
Khởi động containers:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
Lần đầu chạy, MariaDB sẽ tạo database và user tự động. Kiểm tra logs:
docker compose logs mariadb
Bạn sẽ thấy:
[Note] [Entrypoint]: Creating database wordpress
[Note] [Entrypoint]: Creating user wordpress_database_user
Mở trình duyệt tại https://wordpress.dev.test để bắt đầu cài WordPress. Thông số database mặc định:
- Database Name: wordpress
- Username: wordpress_database_user
- Password: wordpress_database_password
- Database Host: mariadb
Cấu trúc dự án
Repo có cấu trúc như sau:
docker-wordpress/
├── public/ # WordPress core + wp-content
│ └── wp-content/
│ ├── plugins/ # Plugin tự viết
│ └── themes/ # Theme tự phát triển
├── .infrastructure/
│ ├── conf/traefik/ # Cấu hình Traefik
│ └── volume_data/mariadb/ # Dữ liệu database (persistent)
├── docker-compose.yml # Base config
├── docker-compose.dev.yml # Override cho dev
└── docker-compose.prod.yml # Override cho production
Docker Compose gồm 3 services chính:
- traefik: Reverse proxy, tự động xử lý SSL với Let’s Encrypt
- php: Image
serversideup/php:8.2-fpm-apachetối ưu cho WordPress - mariadb: Database MariaDB 11.4
Clone WordPress từ GitHub
Đây là phần quan trọng nhất. Để clone một WordPress site có sẵn từ GitHub về máy local, làm theo các bước sau:
Bước 1: Chuẩn bị Git repo
Trên production server, commit theme và plugin vào git repo (chỉ code tự viết, không commit WordPress core, không commit uploads):
cd /path/to/wordpress
git init
git add wp-content/themes/your-theme wp-content/plugins/your-plugin
git commit -m "Initial commit"
git remote add origin [email protected]:your-org/your-repo.git
git push -u origin main
Lưu ý: Không commit thư mục wp-content/uploads/ lên GitHub vì chứa media files dung lượng lớn. Dùng rsync hoặc scp để đồng bộ uploads giữa các môi trường.
Bước 2: Clone về local
Sau khi clone repo docker-wordpress, copy theme và plugins vào thư mục tương ứng, hoặc clone trực tiếp vào:
cd public/wp-content/themes
git clone [email protected]:your-org/your-theme.git
Bước 3: Export database từ production
Dùng WP-CLI trên production server:
wp db export /tmp/production-db.sql
Copy file SQL về máy local:
scp user@production-server:/tmp/production-db.sql /tmp/
Bước 4: Import database vào Docker
Copy file SQL vào container MariaDB và import:
docker cp /tmp/production-db.sql docker-wordpress-mariadb-1:/tmp/
docker exec -it docker-wordpress-mariadb-1 bash
mysql -u wordpress_database_user -p wordpress < /tmp/production-db.sql
Bước 5: Search-replace domain
Sau khi import, thay đổi domain từ production sang local:
docker exec -it docker-wordpress-php-1 bash
wp search-replace "https://example.com" "https://wordpress.dev.test" --all-tables
Bước 6: Cấu hình wp-config.php
Tạo file public/wp-config.php với thông số kết nối database Docker:
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress_database_user');
define('DB_PASSWORD', 'wordpress_database_password');
define('DB_HOST', 'mariadb');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
define('WP_HOME', 'https://wordpress.dev.test');
define('WP_SITEURL', 'https://wordpress.dev.test');
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
$table_prefix = 'wp_';
if (!defined('ABSPATH')) {
define('ABSPATH', __DIR__ . '/');
}
require_once ABSPATH . 'wp-settings.php';
Bước 7: Chạy và verify
Khởi động lại containers và kiểm tra:
docker compose restart
curl -I https://wordpress.dev.test/
# Kỳ vọng: HTTP/2 200
Deploy lên Production
Server Side Up sử dụng Docker Swarm cho production, với cấu hình trong docker-compose.prod.yml. Cách tiếp cận đơn giản nhất là:
- Mount
/var/www/htmltừ container ra host - Dùng git pull trên host để cập nhật code
- Cache qua redis nếu cần
Best Practices
Để tránh lỗi khi dùng Docker với WordPress, hãy nhớ:
- Luôn dùng Apache — nhiều plugin WordPress chỉ hoạt động đúng với Apache, không phải Nginx
- Không commit WordPress core — luôn tải WordPress mới từ wordpress.org, chỉ commit code tự viết
- Giữ plugin ở mức tối thiểu — càng ít plugin càng dễ maintain
- Luôn theo "The WordPress Way" — không dùng Roots Bedrock hay các framework làm thay đổi cấu trúc WordPress
- Dùng Traefik — tự động xử lý SSL, dễ cấu hình hơn Nginx Proxy Manager
Tổng kết
Docker WordPress với serversideup/docker-wordpack là giải pháp hiện đại giúp bạn chuẩn hóa môi trường phát triển WordPress. Việc clone một website có sẵn từ GitHub về local chỉ mất vài phút với các bước clone code, import database, search-replace domain. Với cách tiếp cận "The WordPress Way" và công cụ phù hợp, Docker thực sự là lựa chọn đáng cân nhắc cho mọi dự án WordPress chuyên nghiệp.
Nguồn tham khảo: