Chạy WordPress Với Docker: Hướng Dẫn Từ Local Đến Production

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-apache tố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/html từ 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:

Khoi Pro (Nguyễn Minh Khôi)

Founder of Code Tốt (codetot.vn). WordPress developer and performance optimization specialist. Author at Chuyên DEV (chuyendev.com). Personal site: khoipro.com.