WordPress on Docker 備份

前言

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 備份

  1. 停止運行的容器
  2. 複製前面確定好的容器資料
  3. 導出資料庫的表
  4. 打包
  5. 重啟容器

停止運行的容器

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 備份
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 來定時執行
這邊就不贅述了

結論

謝謝有耐心看到這邊~
在下一篇文章中,將會教學如何利用備份資料還原或者遷站


毛毛

可愛宅宅工程師、內容創作者
興趣是寫東東、寫東東跟寫東東。

Follow @Chindada Sponsor