Skip to content
Thuan Bui's Blog
Go back

Đóng gói website WordPress chuyển sang chạy trên nền Docker + OpenLiteSpeed

Cách đây vài ngày, trong bài viết hướng dẫn cài đặt Docker & Docker Compose, có một bạn đã hỏi cách đóng gói 1 website WordPress có sẵn kèm theo PhpMyAdmin để chạy trong Docker:

Bạn có thể làm riêng 1 bài hướng dẫn đóng gói 1 site wordpress có sẵn (đủ hết file source + db) kèm PHPmyadmin để chạy trong 1 docker được không. Mình đang mắc ở chỗ này.
Cảm ơn bạn nhiều.

Nhân tiện vừa mới mò xong cách cài đặt WordPress + OpenLiteSpeed + MariaDB + PhpMyAdmin trên nền Docker, mình sẽ hướng dẫn luôn cách chuyển 1 website WordPress đang chạy trực tiếp trên hệ điều hành Linux sang chạy trên nền Docker.

Website mình thực hiện demo là https://supersilk.vn - đang được thiết lập trên Cyberpanel sử dụng OpenLiteSpeed webserver.

Để cho dễ hiểu, mình sẽ thống nhất tên gọi như sau

Mục tiêu của bài hướng dẫn này là chuyển website supersilk.vn từ VPS A sang VPS B.

I. VPS A: Sao lưu database

Đầu tiên, truy cập vào VPS A, chuyển đến thư mục wp-content của website supersilk.vn và sử dụng wp-cli để sao lưu database hiện tại.

Terminal window
cd /home/supersilk.vn/public_html/wp-content
wp db export --allow-root

Chờ vài giây, hệ thống sẽ thông báo database đã được sao lưu thàn công.

Terminal window
Success: Exported to 'uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql'.

Kiểm tra lại nội dung thư mục wp-content sẽ thấy xuất hiện file .sql này

Terminal window
ls -a
Terminal window
. index.php plugins themes uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql
.. languages tablepress-combined.min.css updraft w3tc-config
advanced-cache.php litespeed tablepress-custom.css upgrade wflogs
ewww mu-plugins tablepress-custom.min.css uploads wp-cloudflare-super-page-cache

Mình sẽ copy toàn bộ thư mục wp-content này qua VPS B ở bước sau

II. VPS B: Tạo tên miền và cài đặt WordPress

VPS B cần phải thiết lập thành công OpenLiteSpeed chạy trên nền Docker. Xem lại bài viết dưới đây để biết cách cài đặt

https://thuanbui.me/wordpress-mariadb-openlitespeed-phpmyadmin-docker-compose/?swcfpc=1

1. Tạo tên miền mới

Tạo tên miền supersilk.vn

Terminal window
bash bin/domain.sh --add supersilk.vn

2. Cài đặt WordPress

Tạo database cho tên miền supersilk.vn

Terminal window
bash bin/database.sh --domain supersilk.vn

Cài đặt WordPress

Terminal window
./bin/appinstall.sh --app wordpress --domain supersilk.vn

III. Copy dữ liệu từ VPS A qua VPS B

Ở bước này, mình sẽ copy thư mục wp-content từ VPS A qua VPS B, sử dụng lệnh rsync. Thao tác được thực hiện trên VPS B

Truy cập vào thư mục wp-content trên VPS B

Terminal window
cd /home/ols-docker-env/sites/supersilk.vn/html/wp-content

Dùng lệnh rsync để sao chép dữ liệu từ VPS A qua VPS B

Terminal window
rsync -avz root@<IP-Address-VPS-A>:/home/supersilk.vn/public_html/wp-content/* .

Nếu gặp lỗi rsync not found, bạn cần cài đặt rsync vào hệ thống

Terminal window
sudo apt install rsync -y

Tuỳ thuộc vào kích thước của thư mục wp-content gốc mà thời gian copy sẽ kéo dài từ 1-2 phút đến vài chục phút là sẽ hoàn thành.

Thiết lập lại phân quyền cho các file trong thư mục wp-content

Terminal window
chown -R 1000:1000 *

IV. Phục hồi database trên VPS B

Có hai cách để phục hồi database gốc của website supersilk.vn trên VPS B:

Mình sẽ sử dụng WP-CLI vì có thể thao tác trực tiếp ngay trên Terminal, khỏi phải mở trình duyệt web.

Để có thể sử dụng WP-CLI, mình cần phải truy cập vào bên trong container đang chạy OpenLiteSpeed.

Kiểm tra tên của Container đang chạy OpenLiteSpeed

docker ps

Kết quả

Terminal window
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
698edc2ca5db bitnami/phpmyadmin:5.0.2-debian-10-r72 "/app-entrypoint.sh …" 21 hours ago Up 15 hours 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp ols-docker-env_phpmyadmin_1
ec0b4867a898 mariadb:10.5.9 "docker-entrypoint.s…" 21 hours ago Up 15 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp ols-docker-env_mysql_1
aa764cbd0a1b litespeedtech/openlitespeed:1.7.15-lsphp74 "/entrypoint.sh" 21 hours ago Up 14 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:7080->7080/tcp, :::7080->7080/tcp, 0.0.0.0:443->443/udp, :::443->443/udp openlitespeed

Theo kết quả trả về, container đang chạy OpenLiteSpeed có tên openlitespeed

Truy cập vào terminal của container openlitespeed

docker exec -it openlitespeed /bin/bash

Terminal sẽ được chuyển về địa chỉ như sau

Terminal window
/var/www/vhosts#

Truy cập vào thư mục chứa file sql

Terminal window
cd supersilk.vn/html/wp-content

Kiểm tra nội dung thư mục này

Terminal window
ls

Tìm tên file .sql trong kết quả trả về: uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql

Terminal window
advanced-cache.php plugins updraft
ewww tablepress-combined.min.css upgrade
index.php tablepress-custom.css uploads
languages tablepress-custom.min.css w3tc-config
litespeed themes wflogs
mu-plugins uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql wp-cloudflare-super-page-cache

Nhập file sql này vào cơ sở dữ liệu của supersilk.vn sử dụng lệnh wp db

Terminal window
wp db import uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql --allow-root

Chờ vài phút là xong.

V. Cập nhật wp-config.php

Kiểm tra nội dung file wp-config.php bên VPS A để xem các thông số đặc biệt, thường nằm ở đầu file và cần copy các thông số này qua file wp-config.php bên VPS B.

Có 1 thông số cần chú ý là $table_prefix = '12780_';

Nếu bên VPS A sử dụng $table*prefix khác thông số mặc định wp*, bạn cần phải chỉnh sửa tương ứng bên VPS B thì website mới hiển thị ra đúng.

Để chỉnh sửa wp-config.php, mình cần phải thoát ra khỏi bash của container openlitespeed và thao tác trên bash của hệ điều hành

Terminal window
exit
cd /home/ols-docker-env/sites/supersilk.vn/html
nano wp-config.php

VI. Chỉnh sửa hosts

Chỉnh sửa file hosts trên máy tính để truy cập vào supersilk.vn mà chưa cần phải đổi A Record trên DNS.

Mình sử dụng Mac OS, sử dụng Terminal để edit file /etc/hosts

Terminal window
sudo nano /etc/hosts

Thêm dòng này vào cuối file hosts, sau đó lưu lại

Terminal window
<IP-Address-VPS-B> supersilk.vn

Ví dụ: 123.123.321.321 supersilk.vn

Mở trình duyệt ở chế độ Private Mode và truy cập vào http://supersilk.vn để kiểm tra website đã hiển thị đúng như bản gốc chưa

Nếu chưa ra giống, bạn đã làm sai hoặc thiếu bước nào đó ở trên.

VII. Cập nhật A Record và tạo SSL

Sau khi chắc chắn website supersilk bên VPS B đã hoạt động ngon lành, mình sẽ thực hiện thao tác cuối cùng: cập nhật A Record trên DNS và tạo chứng chỉ SSL cho website.

1. Cập nhật A Record

Mình truy cập vào dịch vụ quản lý DNS của tên miền supersilk.vn, thay đổi A Record @www trỏ về địa chỉ IP của VPS B.

2. Tạo chứng chỉ SSL

Sử dụng acme.sh để tạo chứng chỉ SSL miễn phí cho tên miền supersilk.vn

Terminal window
cd /home/ols-docker-env
./bin/acme.sh --domain supersilk.vn

3. Chỉnh sửa .htaccess

Để mọi truy cập http tự động chuyển hướng sang https, mình sẽ chỉnh sửa lại file .htaccess trong thư mục html của supersilk.vn

Terminal window
cd /home/ols-docker-env/sites/supersilk.vn/html
nano .htaccess

Thêm vào đoạn này vào trên cùng và lưu lại

Terminal window
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

4. Khởi động lại OpenLiteSpeed

Để những thay đổi trong file .htaccess có hiệu lực, mình cần phải khởi động lại OpenLiteSpeed

cd /home/ols-docker-env/
docker-compose restart litespeed

VIII. Hoàn thành

Website https://supersilk.vn của mình giờ đã được chuyển nhà thành công qua chạy trên nền Docker + OpenLiteSpeed.

Với cách thiết lập trên Docker này, mỗi khi cần chuyển qua sử dụng trên VPS mới, mình chỉ cần rsync toàn bộ thư mục ols-docker-env qua nhà mới, sau đó kích hoạt lại Docker Compose là xong. Nhờ vậy, tiết kiệm được rất nhiều thời gian so với cách cài đặt WordPress truyền thống: cài trực tiếp trên hệ điều hành.

Nếu theo dõi thấy hoạt động ổn định, sắp tới mình sẽ chuyển toàn bộ tất cả website sang chạy trên nền Docker kiểu này luôn cho dễ quản lý.

Chúc bạn thực hiện thành công!


Share this post on:

Previous Post
Tối ưu Docker + OpenLiteSpeed: tắt PhpMyAdmin, cài thêm PHP Extension, chỉnh sửa php.ini
Next Post
Thay đổi máy chủ cho website WordPress dùng SSL Let's Encrypt không bị downtime