使用Docker的好处就是尽量减少了环境部署,开发交付环境一致,可靠性强,容易维护。使用Docker搭建MongoDB的最重要的一点是容器无状态化,即不在容器中保存数据,重新生成数据库容器,必须保证数据库数据不丢失,所有数据保存在数据卷中,方便随时备份和恢复。
创建数据Volume
docker volume create mongodbdata
创建MongoDB容器,并将数据映射到数据Volume中
docker run --name my-mongo --restart=always -v mongodbdata:/data/db -d mongo
此时就可以正常使用了,其他容器要使用MongoDB只需要 --link my-mongo
就可以了
备份数据库,这里有两种方法,分别是:通过创建挂载Volume的容器去备份数据到物理盘、直接从Volume的物理挂载点备份文件
1. 通过创建挂载Volume的容器去备份数据到物理盘
通过busybox容器的tar命令将数据Volume中的数据打包备份到本地
cd到需要存放备份文件的目录 docker run -v $(pwd):/backup -v mongodbdata:/mongodbdata busybox tar cvf /backup/$(date +%Y%m%d%H%M%S).tar /mongodbdata
还原数据库,通过busybox容器的tar命令将本地备份文件覆盖到数据Volume中
cd到存放备份文件的目录 docker run -v $(pwd):/backup -v mongodbdata:/mongodbdata busybox tar xvf /backup/backup.tar -C ./
2. 直接从Volume的物理挂载点备份文件
所有的Volume从原理上都是直接挂载物理盘的某个挂载点,所以可以找到挂载点并直接打包复制文件出来做备份
查看Volume的物理挂载点
docker volume inspect mongodbdata
[ { "CreatedAt": "2019-07-05T09:57:27+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/mongodbdata/_data", "Name": "mongodbdata", "Options": {}, "Scope": "local" } ]
可见该Volume的物理挂载点是/var/lib/docker/volumes/mongodbdata/_data
备份数据
tar cvf /root/backup/mongodb/$(date +%Y%m%d%H%M%S).tar /var/lib/docker/volumes/mongodbdata/_data
恢复备份
tar xvf /root/backup/mongodb/backup.tar -C /var/lib/docker/volumes/mongodbdata/_data