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

  • VPS A: là VPS đang cài đặt Cyberpanel, đang host website Supersilk.vn hiện tại.
  • VPS B: là VPS mình cài đặt WordPress + OpenLiteSpeed + PhpMyAdmin trên nền Docker.

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.

cd /home/supersilk.vn/public_html/wp-content
wp db export --allow-rootCode language: Bash (bash)

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

Success: Exported to 'uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql'.Code language: JavaScript (javascript)

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

ls -aCode language: Nginx (nginx)
.                   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-cacheCode language: CSS (css)

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

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

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

bash bin/domain.sh --add supersilk.vnCode language: Dockerfile (dockerfile)

2. Cài đặt WordPress

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

bash bin/database.sh --domain supersilk.vnCode language: Nginx (nginx)

Cài đặt WordPress

./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

cd /home/ols-docker-env/sites/supersilk.vn/html/wp-contentCode language: Bash (bash)

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

rsync -avz root@<IP-Address-VPS-A>:/home/supersilk.vn/public_html/wp-content/* .Code language: JavaScript (javascript)

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

sudo apt install rsync -yCode language: Nginx (nginx)

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

chown -R 1000:1000 *Code language: CSS (css)

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:

  • Sử dụng PhpMyAdmin
  • Sử dụng WP-CLI

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 psCode language: Nginx (nginx)

Kết quả

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   openlitespeedCode language: YAML (yaml)

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/bashCode language: Bash (bash)

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

/var/www/vhosts#Code language: PHP (php)

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

cd supersilk.vn/html/wp-contentCode language: Bash (bash)

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

ls

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

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-cacheCode language: CSS (css)

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

wp db import uVXDBmGR0IfXkq-2022-03-16-c7c8742.sql --allow-rootCode language: JavaScript (javascript)

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

exit
cd /home/ols-docker-env/sites/supersilk.vn/html
nano wp-config.phpCode language: Bash (bash)

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

sudo nano /etc/hostsCode language: Nginx (nginx)

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

<IP-Address-VPS-B> supersilk.vnCode language: CSS (css)

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

cd /home/ols-docker-env
./bin/acme.sh --domain supersilk.vnCode language: Bash (bash)

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

cd /home/ols-docker-env/sites/supersilk.vn/html
nano .htaccessCode language: Bash (bash)

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

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

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 litespeedCode language: Bash (bash)

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!

[convertkit form=7087807]

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *


7 Comments

  1. Cảm ơn bạn rất nhiều. Mục đích mình hỏi về wordpress trong docker đúng là để chuyển qua lại các vps cho dễ.
    Như mình đang làm là dùng wordpress trong docker. Cài xong cài nginx proxy manager để kích hoạt HTTPS và điều hướng sub domain luôn. SSL thì mình dùng của cloudflare chứ ko dùng lets encrypt. Combo này tiện và nhanh hơn nhiều so với cài thẳng trong linux 😀

  2. Có một cách mình hay làm thấy khoẻ hơn 1 chút (ko xịn như cách này) đó là:
    Trên web cũ dùng duplicator để đóng gói lại website, sau khi đóng gói sẽ có 1 link tới file nén và 1 file php.
    Trên ssh vps mới dùng lệnh wget để download file nén trên+file install.php, rồi chạy file install.php trên là ok. nó sẽ tự config db cho mình.
    Ưu điểm là dùng 1 lệnh, dễ nhớ.
    Nhược điểm là đối với website nặng hoặc db nặng trên 10GB thì có thể ko nén được.
    Hướng dẫn dùng docker wordpress thì thật đỉnh, tò mò mãi làm sao a làm đc website chịu tải ngon mà linh hoạt thế

    1. Cám ơn bạn đã chia sẻ. Cách dùng plugin Duplicator này đúng là đơn giản dễ nhớ hơn, nhưng phải truy cập vào WordPress để thao tác. Mình thích làm trực tiếp trên Terminal, cảm thấy nhanh hơn phải bấm bấm trong WordPress Dashboard.

      1
  3. Chào Thuận,

    Cảm ơn về bài viết của bạn. Mấy ngày qua mình đọc bài bạn viết và ứng dụng trên vps rất nhiều, tính mình hay thích vọc, hôm qua thuê luôn vps để thực hiện. Mình có thắc mắc, làm thế nào để chuyển tất cả các docker (gồm 1 site wordpress có sẵn đủ hết file source + db + PHPmyadmin) và các docker đã tạo (gồm nginx, openlitespeed, portainer, reddis) trên vps A sang vps B? Việc này có thể thực hiện được không? Nếu thực hiện được, mình mong Thuận hãy làm viết riêng một bài về vấn đề này. Cảm ơn.

    1. Để chuyển docker của Openlitespeed, cách mình thường làm là dừng Docker Container bằng lệnh docker-compose down, sau đó rsync toàn bộ thư mục ols-docker-env qua VPS khác, sau đó khởi tạo lại bằng lệnh docker-compose up -d
      Các dịch vụ Docker khác cũng thao tác tương tự.

  4. Hi bạn, Mình có chạy docker compose với mysql, wordpress:5.4-php7.3, phpmyadmin. Mình có restore database và wp-content. sau đó phân lại quyền wp-content này rồi nhưng web không truy cập được. Mình có dùng nginx proxy ở một vps khác