Table of Contents
前言
WordPress on Docker 備份
是接續之前寫的 Docker 架設 WordPress feat Let’s Encrypt
這個站本身就是利用 Docker 創建出來的
但 Docker 本身就不是設計來把資料持久化的
一個不小心……
全站資料就會不見
所以這篇來分享一下如何備份、如何還原(遷站)
首先,來複習一下需要備份什麼
先當作大家都是跟我架站流程相似
如果你/妳架站方式不同,但也是用 Docker
也可以參考參考哦~
當初架站使用了 3 個 docker image,分別為
- nginx: 作為反向代理,下面為當初執行的指令
# 本文當初架設的指令
docker run -d
--network tocvlan \
--ip=172.20.10.242 \
--restart always \
--name nginx \
-v /root/nginx_data/:/etc/nginx/conf.d/:ro\
-v /root/certbot_data/www:/var/www/certbot/:ro \
-v /root/certbot_data/conf:/etc/nginx/ssl/:ro \
nginx:latest
/root/nginx_data
裡面放著我們對 nginx 的設定
這是必須備份的檔案之一
- certbot: 申請 Let’s Encrypt 的工具
# 本文當初架設的指令
docker stop certbot
docker system prune --volumes -f
docker run -it \
--name certbot \
-v /root/certbot_data/www:/var/www/certbot/:rw \
-v /root/certbot_data/conf:/etc/letsencrypt/:rw \
certbot/certbot:latest certonly -v --webroot --webroot-path /var/www/certbot/ -d blog.tocandraw.com
/root/certbot_data
裡面放著申請好的 SSL 認證
嚴格來說並非必須備份的,如果是要換網域或是單純想申請新的,可以不備份這個
- wordpress: 站的本體
# 本文當初架設的指令
docker run -d \
--network tocvlan \
--ip=172.20.10.241 \
--restart always \
--name=wordpress \
-e WORDPRESS_DB_HOST=資料庫位置 \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=資料庫密碼 \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_TABLE_PREFIX=wp_ \
-v /root/wordpress_data:/var/www/html \
-v /root/wordpress_data/wordpress.ini:/usr/local/etc/php/conf.d/wordpress.ini \
wordpress:latest
/root/wordpress_data
裡面放著最重要的結晶!!
沒有備份,就是跟過去的自己說再見👋👋
除了靜態資料之外,資料庫也有資料需要備份
裡面存了所有使用者資料、文章與標籤之間的關聯等等
資料庫的表也是得備份的東西之一
確定好需要備份的路徑後,開始備份~
環境
- OS: Debian 11
WordPress on Docker 備份
- 停止運行的容器
- 複製前面確定好的容器資料
- 導出資料庫的表
- 打包
- 重啟容器
停止運行的容器
docker container stop wordpress
docker container stop nginx
複製前面確定好的容器資料
# 建立一個資料夾來放備份
mkdir tmp
cp -r /root/wordpress_data ./tmp
cp -r /root/nginx_data ./tmp
cp -r /root/certbot_data ./tmp
導出資料庫的表
這邊會使用到 mysql/mariadb
的指令 mysqldump
可以透過以下指令安裝
![WordPress on Docker 備份](https://tocandraw.com/wp-content/uploads/2023/10/WordPress-on-Docker-%E5%82%99%E4%BB%BD-101-1024x385.png)
apt install mariadb-server -y
# 安裝過後,要把服務停掉,不然他會自動啟動,白白浪費資源
systemctl disable mysql
導出資料表
# 宣告目前的時間變數,放在待會的檔名中
now=$(date +"%Y%m%d_%H%M")
mysqldump -h 172.20.10.20 -u root -p資料庫密碼 資料庫名稱 > ./tmp/wordpress_db_$now.sql
-h: 資料庫 host ip
-u: 資料庫使用者名稱
-p: 資料庫密碼(這個比較特別,密碼與 p 之前不需要空格)
打包
tar -czvf $now.tar.gz ./tmp/*
最後應該會得到一個 20220312_0602.tar.gz
可以利用 scp 或者其他方式存放第二份到別處
重啟容器
docker container restart wordpress
docker container restart nginx
完整腳本
#!/bin/bash
now=$(date +"%Y%m%d_%H%M")
docker container stop wordpress
docker container stop nginx
mkdir /root/wordpress_backup
mkdir tmp
cp -r /root/wordpress_data ./tmp
cp -r /root/nginx_data ./tmp
cp -r /root/certbot_data ./tmp
mysqldump -h 資料庫位置 -u root -p資料庫密碼 資料庫名稱 > ./tmp/wordpress_db_$now.sql
tar -czvf $now.tar.gz ./tmp/*
mv $now.tar.gz /root/wordpress_backup
chmod 777 /root/wordpress_backup/$now.tar.gz
# 只存放 14 天內的備份
find /root/wordpress_backup -name "*.gz" -type f -atime +14
rm -rf ./tmp
docker container restart wordpress
docker container restart nginx
可以寫成 cron 來定時執行
這邊就不贅述了
結論
謝謝有耐心看到這邊~
在下一篇文章中,將會教學如何利用備份資料還原或者遷站
![](https://blog.tocandraw.com/wp-content/uploads/2022/02/app_icon.png)