使用docker部署应用有着各种优势,但其挂载卷volume若是都交由docker管理,备份时无法使用拷贝文件、粘贴到新服务器这种方式去备份还原。
因此本文阐述如何通过正确的姿势去备份和还原使用了docker volume的应用。
一、备份volume
1、编写备份脚本
for i in "$@"; do
echo "开始备份:"$i
# 创建
docker run -it -d --name container_back -v $i:/volume alpine >/dev/null 2>&1
# 打包压缩
docker exec -it container_back tar -cjf /image_volume_back.tar.bz2 -C /volume ./ >/dev/null 2>&1
# 打包成一个新的images
docker commit -p container_back container_back >/dev/null 2>&1
# 将images导出为文件
docker save -o $i.tar container_back >/dev/null 2>&1
docker stop container_back >/dev/null 2>&1
docker rm container_back >/dev/null 2>&1
echo "完成备份:"$i
done
2、查看待备份volumn
docker volume ls
## 结果如下
DRIVER VOLUME NAME
local community_db_community-minio-config
local community_db_community-minio-data
local community_db_community-mysql-data
local community_db_community-redis-data
local portainer_data
3、开始备份
拼接要备份volumn到命令后,以空格隔开
sh back.sh community_db_community-minio-config community_db_community-minio-data community_db_community-mysql-data community_db_community-redis-data
4、查看备份结果
备份成功会打成压缩包,查看压缩包大小,大于1KB以上一般就算备份成功
ls
## 结果如下
back.sh community_db_community-minio-config.tar community_db_community-minio-data.tar community_db_community-mysql-data.tar community_db_community-redis-data.tar
二、备份stack脚本
文中以community项目为例
登录ptr管理面板
community.yml
version: '3.7'
services:
fxcloud-register:
image: registry.cn-hangzhou.aliyuncs.com/fx-community/register:2.0.0
ports:
- 8848:8848
environment:
MYSQL_PASSWORD: zgfxrc.sql2020
networks:
- community-network
deploy:
update_config:
delay: 5s
order: start-first
fxcloud-gateway:
image: registry.cn-hangzhou.aliyuncs.com/fx-community/gateway:2.0.0
ports:
- 8849:8849
networks:
- community-network
environment:
MYSQL_PASSWORD: zgfxrc.sql2020
deploy:
update_config:
delay: 5s
order: start-first
fxcloud-auth:
image: registry.cn-hangzhou.aliyuncs.com/fx-community/auth:2.0.0
networks:
- community-network
environment:
MYSQL_PASSWORD: zgfxrc.sql2020
deploy:
update_config:
delay: 5s
order: start-first
fxcloud-upms:
image: registry.cn-hangzhou.aliyuncs.com/fx-community/upms:2.0.0
networks:
- community-network
environment:
MYSQL_PASSWORD: zgfxrc.sql2020
deploy:
mode: replicated
replicas: 1
update_config:
delay: 5s
order: start-first
fxcloud-community:
image: registry.cn-hangzhou.aliyuncs.com/fx-community/community:3.2.0
networks:
- community-network
environment:
MYSQL_PASSWORD: zgfxrc.sql2020
deploy:
mode: replicated
replicas: 1
update_config:
delay: 5s
order: start-first
fxcloud-visitor:
image: registry.cn-hangzhou.aliyuncs.com/fx-community/visitor:2.3.0
networks:
- community-network
environment:
MYSQL_PASSWORD: zgfxrc.sql2020
deploy:
update_config:
delay: 5s
order: start-first
networks:
community-network:
external: true
community_db.yml
version: '3'
services:
fxcloud-mysql:
image: mysql:8.0.17
ports:
- 23306:3306
volumes:
- community-mysql-data:/var/lib/mysql
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
environment:
- MYSQL_ROOT_PASSWORD=zgfxrc.cn
- TZ=Asia/Shanghai
networks:
- community-network
deploy:
placement:
constraints:
- node.role == manager
fxcloud-redis:
image: redis:5.0.5
#command: redis-server --port 6379 --requirepass zgfxrc.cn --appendonly yes
ports:
- 6379:6379
volumes:
- community-redis-data:/data
networks:
- community-network
deploy:
placement:
constraints:
- node.role == manager
fxcloud-minio:
image: huanghs/minio:2.2.0
command: server /data
ports:
- 9000:9000
volumes:
- community-minio-data:/data
- community-minio-config:/root/.minio
environment:
- MINIO_DOMAIN=fxcloud-minio
- MINIO_ACCESS_KEY=huanghaisong
- MINIO_SECRET_KEY=huanghaisong
networks:
- community-network
deploy:
placement:
constraints:
- node.role == manager
networks:
community-network:
external: true
volumes:
community-mysql-data:
community-redis-data:
community-minio-data:
community-minio-config:
三、备份前端文件及nginx的conf
使用宝塔的登录拷贝即可,未使用宝塔的如下
1、备份nginx conf文件
例如nginx安装在/etc/nginx
目录下
cd /etc/nginx/conf.d/
ls
##
firm.conf park.conf
备份其中firm.conf
和park.conf
文件
2、备份前端文件
查看firm.conf映射的root
目录,备份即可
如park.conf中的root可能为root /root/workspace/community-ui/dist;
,则备份该目录的所有文件
四、还原volume
1、编写还原脚本
在目录下创建reduct.sh文件并填入以下内容
for i in "$@"; do
echo "开始还原:"$i
# 建立 Docker Volume
docker volume create $i
# 还原文件为 Image
docker load -i $i.tar
# 挂载 Docker Volume之后,透过命令将原先 Image 内的压缩档解压缩到 Docker Volume,完成之后自动删掉 Alpine 的 Container
docker run --rm -v $i:/volume container_back sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /image_volume_back.tar.bz2 ;"
docker rmi container_back
echo "完成还原:"$i
done
2、将tar传到新服务器
3、执行还原指令
sh reduct.sh community_db_community-minio-config community_db_community-minio-data community_db_community-mysql-data community_db_community-redis-data
4、检查还原的voume大小是否与旧服务器的一致
docker system df -v
### 末尾会看到
Local Volumes space usage:
VOLUME NAME LINKS SIZE
community_db_community-minio-config 0 0B
community_db_community-minio-data 0 19.91MB
community_db_community-mysql-data 0 286.8MB
community_db_community-redis-data 0 13.64kB
五、还原stack服务
登录ptr,按照所备份的stack yml创建即可,需注意