使用 Docker 做 MongoDB 備份與還原與排程

備份步驟

產生 docker-mongodump image

# 下載 docker-mongodump
git clone https://github.com/RammusXu/docker-mongodump.git
# build 成 image
cd docker-mongodump
docker build -t rammus/mongodump .

直接備份

docker run --rm -v /root/mongodump:/backup --link mongo1:mongo -e MONGO_USERNAME=root -e MONGO_PASSWORD='rootpassword' rammus/mongodump no-cron

or

新增一個定期備份的 container

docker run -d -v /root/mongodump:/backup --link mongo1:mongo -e MONGO_USERNAME=root -e MONGO_PASSWORD='rootpassword' -e 'CRON_SCHEDULE=0 18 * * *' --name mongodump rammus/mongodump

恢復備份範例

ATTENTION: 恢復備份不會恢復 admin.system.user

新增一個新的 mongo container

docker run -d --name some-mongo mongo --auth

將之前備份的資料複製到 container

docker cp 20170621_093135 some-mongo:/

進到 container

docker exec -it some-mongo bash

進到 mongo

mongo

新增一組 restore 用的帳號

use admin
db.createUser({
user: "re", pwd: "re",
roles: [{role: "restore",db:"admin"}]
});

Ctrl+C 離開 mongo

> ^C
bye

開始 mongorestore

mongorestore --gzip --archive=/20170621_093135 -u re -p 're'

Troubleshooting

如果是使用 mongo --auth 的話, 必須先在 admin 加入 role:restore 才能夠正確的 mongorestore

root@78376710787e:/# mongorestore --gzip --archive=/20170621_093135
2017-06-22T02:01:40.123+0000 preparing collections to restore from
2017-06-22T02:01:40.190+0000 Failed: error getting auth version of server: not authorized on admin to execute command { getParameter: 1, authSchemaVersion: 1 }
root@cbeed461ba74:/# mongo
> use admin
switched to db admin
>
> db.createUser({
... user: "re", pwd: "re",
... roles: [{role: "restore",db:"admin"}]
... });
Successfully added user: {
"user" : "re",
"roles" : [
{
"role" : "restore",
"db" : "admin"
}
]
}