Giới thiệu
WordPress là một phần mềm nguồn mở dùng để tạo và quản lý nội dung website. Nó hoạt động như một hệ thống quản lý nội dung (CMS) cho phép người dùng tạo, chỉnh sửa, đăng và quản lý các bài viết, trang web một cách đơn giản thông qua giao diện trực quan. Để cài đặt WordPress một cách hiệu quả và linh hoạt, Docker là một công cụ mạnh mẽ giúp triển khai ứng dụng trong môi trường container hóa. Docker Compose là một phần mở rộng của Docker, cho phép bạn định nghĩa và chạy nhiều container cùng lúc chỉ bằng một file cấu hình.
Hướng dẫn này sẽ chỉ cho bạn cách cài đặt WordPress trên Docker với sự hỗ trợ của Nginx và Mariadb, cho phép chạy cả HTTP và HTTPS.
Tổng quát các phần cài đặt

- db/: Thư mục này dùng để lưu trữ dữ liệu của MariaDB. Nó giúp duy trì dữ liệu ngay cả khi container MariaDB bị xóa hoặc khởi động lại.
- nginx/: Chứa các file cấu hình cho Nginx, bao gồm file cấu hình chính nginx.conf, và các file chứng chỉ SSL (fullchain.pem và privkey.pem) nếu có.
- nginx.conf: File cấu hình của Nginx, xác định cách Nginx xử lý các yêu cầu đến và chuyển tiếp đến WordPress.
- fullchain.pem và privkey.pem: Các file chứng chỉ SSL để hỗ trợ HTTPS. Nếu chưa có chứng chỉ, có thể sử dụng Let’s Encrypt để tạo.
- wordpress/: Thư mục chứa mã nguồn của WordPress. Tất cả các file WordPress được lưu tại đây, bao gồm các theme, plugin, và nội dung tùy chỉnh.
- docker-compose.yml: Đây là file cấu hình chính của Docker Compose, định nghĩa các dịch vụ (services) như wordpress, mariadb, và nginx, cùng với các mạng (networks) và volume.
- .env: chứa các biến môi trường để cấu hình các dịch vụ trong docker-compose.yml.
Cài đặt
Chuẩn bị môi trường
- Cài đặt Docker và Docker Compose trên máy chủ của bạn.
- Tạo một thư mục mới cho dự án: mkdir wordpress-docker && cd wordpress-docker
mkdir wordpress-docker && cd wordpress-docker
Tạo file cấu hình docker-compose.yml
Tạo file docker-compose.yml với nội dung sau:
services:
wordpress:
image: wordpress:latest
container_name: wordpress
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
volumes:
- ./wordpress:/var/www/html
depends_on:
- db
networks:
- wordpress_network
db:
image: mariadb:latest
container_name: mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./db:/var/lib/mysql
networks:
- wordpress_network
nginx:
image: nginx:latest
container_name: nginx
restart: always
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./wordpress:/var/www/html
- ./nginx/fullchain.pem:/etc/nginx/fullchain.pem
- ./nginx/privkey.pem:/etc/nginx/privkey.pem
ports:
- "80:80"
- "443:443"
networks:
- wordpress_network
networks:
wordpress_network:
driver: bridge
- wordpress:
- Image: Sử dụng image WordPress mới nhất (wordpress:latest).
- Container Name: Container sẽ có tên là wordpress.
- Restart Policy: Tự động khởi động lại container khi bị dừng hoặc gặp lỗi (restart: always).
- Environment Variables:
- WORDPRESS_DB_HOST: Đặt địa chỉ của cơ sở dữ liệu là db:3306, nghĩa là dịch vụ db sẽ được sử dụng qua cổng 3306.
- WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD, WORDPRESS_DB_NAME: Các biến này lấy giá trị từ các biến môi trường tương ứng (${MYSQL_USER}, ${MYSQL_PASSWORD}, ${MYSQL_DATABASE}) trong file .env để kết nối đến cơ sở dữ liệu.
- Volumes: Gắn thư mục ./wordpress từ máy chủ vào đường dẫn /var/www/html trong container, giúp lưu trữ dữ liệu WordPress bên ngoài container.
- Dependencies:
- depends_on: Xác định rằng dịch vụ wordpress phụ thuộc vào db, đảm bảo MariaDB khởi động trước.
- Networks: Kết nối vào wordpress_network, cho phép các container giao tiếp với nhau trong cùng một mạng.
- db (MariaDB)
- Image: Sử dụng image MariaDB mới nhất (mariadb:latest).
- Container Name: Container sẽ có tên là mariadb.
- Restart Policy: Tự động khởi động lại container khi cần (restart: always).
- Environment Variables:
- MYSQL_ROOT_PASSWORD: Đặt mật khẩu cho tài khoản root của MariaDB.
- MYSQL_DATABASE: Tạo cơ sở dữ liệu ban đầu có tên theo giá trị của ${MYSQL_DATABASE}.
- MYSQL_USER, MYSQL_PASSWORD: Tạo tài khoản người dùng cơ sở dữ liệu với tên và mật khẩu lấy từ các biến môi trường.
- Volumes: Gắn thư mục ./db từ máy chủ vào đường dẫn /var/lib/mysql trong container, giúp lưu trữ dữ liệu của MariaDB bên ngoài container.
- Networks: Kết nối vào wordpress_network để giao tiếp với dịch vụ wordpress.
- nginx:
- Image: Sử dụng image Nginx mới nhất (nginx:latest).
- Container Name: Container sẽ có tên là nginx.
- Restart Policy: Tự động khởi động lại container khi cần (restart: always).
- Volumes:
- /nginx/nginx.conf:/etc/nginx/nginx.conf : Gắn file cấu hình Nginx nginx.conf từ ./nginx/nginx.conf vào đường dẫn /etc/nginx/nginx.conf trong container.
- /wordpress:/var/www/html : Gắn thư mục ./wordpress từ máy chủ vào /var/www/html, cho phép Nginx truy cập vào nội dung của WordPress.
- /nginx/fullchain.pem:/etc/nginx/fullchain.pem, /nginx/privkey.pem:/etc/nginx/privkey.pem : Gắn chứng chỉ SSL fullchain.pem và privkey.pem để sử dụng HTTPS.
- Ports: Mở cổng 80 (HTTP) và 443 (HTTPS) trên máy chủ để trỏ đến Nginx.
- Networks: Kết nối vào wordpress_network, giúp Nginx giao tiếp với WordPress.
Tạo file cấu hình nginx.conf
Tạo thư mục nginx và file nginx.conf với cấu hình sau:
mkdir nginx
cd nginx/
vi nginx.confTại hàng 20 bạn thay tên-miền www.tên-miền thành tên website cần cài đặt
Ví dụ: server_name phongdinh.id.vn www.phongdinh.id.vn;
# nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# Thiết lập log
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Thiết lập server block
server {
listen 80; # Lắng nghe trên cổng HTTP 80
server_name <tên-miền> <www.tên-miền>;
listen 443 ssl;
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
# Chuyển tiếp yêu cầu tới WordPress container
location / {
proxy_pass https://api.phongdinh.info.vn:80; # Địa chỉ container WordPress
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;
}
# Đường dẫn để phục vụ yêu cầu xác minh từ Let's Encrypt (nếu cần cho SSL sau này)
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
Đặt các file chứng chỉ SSL fullchain.pem và privkey.pem trong thư mục nginx/
Tạo file .env
Tại thư mục gốc chứa dữ án là wordpress-docker/ tạo file .env với nội dung sau:
vi .envThay DB_USER, DB_NAME, DATABASE,USER, <password> thành các thông tin của bạn.
# Cấu hình WordPress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=phongdh_wordpress
WORDPRESS_DB_PASSWORD=<password>
WORDPRESS_DB_NAME=phongdh_wordpress
# Cấu hình MariaDB
MYSQL_ROOT_PASSWORD=<password>
MYSQL_DATABASE=phongdh_wordpress
MYSQL_USER=phongdh_wordpress
MYSQL_PASSWORD=<password>
Khởi động các container
Sau khi tạo các file cấu hình hoàn tất, đứng tại thư mục chứa dữ án wordpress-docker/ chạy lệnh sau để khởi động các container:
docker-compose up -d
Cấu hình SSL miễn phí với Let’s Encrypt
Nếu bạn chưa có chứng chỉ SSL và muốn cài đặt, Bạn có thể sử dụng Let’s Encrypt để tạo chứng chỉ SSL miễn phí.
Tạo các thư mục certbot/conf và certbot/www
mkdir -p ./certbot/conf ./certbot/www- certbot/conf:
- Mục đích: Lưu trữ cấu hình và chứng chỉ SSL của Let’s Encrypt.
- Nội dung:
- Chứng chỉ SSL
- Khóa riêng tư
- Cấu hình renewal của Certbot
- Logs của Certbot
- certbot/www:
- Mục đích: Sử dụng cho quá trình xác thực HTTP-01 của Let’s Encrypt.
- Nội dung: Các file tạm thời được tạo ra trong quá trình xác thực domain
Thêm cấu hình cho certbot vào file docker-compose.yml
Thêm cấu hình cho service mới certbot vào file docker-compose.yml để quản lý chứng chỉ SSL với thông tin sau
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"Sửa lại cấu hình phần service nginx theo thông tin sau:
nginx:
image: nginx:latest
container_name: nginx
restart: always
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./wordpress:/var/www/html
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
ports:
- "80:80"
- "443:443"
networks:
- wordpress_network
Thêm cấu hình cho nignx.conf
Mở file nginx/nginx.conf và chỉnh sửa cấu hình ở phần https thành cấu hình sau:
http {
server {
listen 80;
server_name phongdinh.id.vn www.phongdinh.id.vn;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name phongdinh.id.vn www.phongdinh.id.vn;
ssl_certificate /etc/letsencrypt/live/phongdinh.id.vn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/phongdinh.id.vn/privkey.pem;
location / {
proxy_pass https://api.phongdinh.info.vn: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;
}
}
}
Hướng dẫn cài đặt SSL
Khổi động lại containers bằng lệnh sau:
docker-compose up -dDừng container Nginx:
docker-compose stop nginxChạy Certbot để lấy chứng chỉ SSL:
docker-compose run --rm certbot certonly --webroot -w /var/www/certbot -d phongdinh.id.vn -d www.phongdinh.id.vn --email [email protected] --agree-tos --no-eff-emailLưu ý: Thay thế phongdinh.id.vn và [email protected] bằng tên miền và email của bạn.
Khởi động lại Nginx:
docker-compose up -d --force-recreate nginxCấu hình WordPress
Sau khi khởi động các container thành công ở bước trên, bạn truy cập tên miền để kiểm tra và thiết lập các bước cài đặt wordpress ban đầu nhé!

Kết luận
Việc cài đặt WordPress bằng Docker Compose mang lại nhiều lợi ích, như dễ dàng triển khai, quản lý và bảo trì. Bằng cách phân chia các thành phần như WordPress, MariaDB và Nginx thành các container riêng biệt, bạn có thể tối ưu hóa hiệu suất và đảm bảo tính ổn định cho hệ thống.
Quy trình từng bước đã giúp thiết lập một môi trường WordPress an toàn và hiệu quả với chứng chỉ SSL, lưu trữ dữ liệu lâu dài, và dễ dàng cấu hình.
