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.
Mục Lục
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-root
Code 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 -a
Code 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-cache
Code 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.vn
Code language: Dockerfile (dockerfile)
2. Cài đặt WordPress
Tạo database cho tên miền supersilk.vn
bash bin/database.sh --domain supersilk.vn
Code 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-content
Code 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 -y
Code 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 ps
Code 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 openlitespeed
Code 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/bash
Code 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-content
Code 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-cache
Code 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-root
Code 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.php
Code 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/hosts
Code 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.vn
Code 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 @
và 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.vn
Code 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 .htaccess
Code 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 litespeed
Code 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!
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 😀
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ế
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.
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.
Để 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ệnhdocker-compose up -d
Các dịch vụ Docker khác cũng thao tác tương tự.
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
bài viết rất tuyệt vời & đúng là điều Nam đang tìm kiếm