最近个人服务器到期,在搭建新服务器的时候,基本全部docker化。所以涉及到宿主环境下的应用及数据迁移到docker container中。此文记录mongo迁移过程。

备份mongo数据

mongodump --username xxx --password xxx --db xxx --authenticationDatabase xxx -o ~/bak/mongodb/ > ~/logs/mongodb_bak_api.log

拉取mongo镜像

  • 配置阿里云镜像加速

    # dockerhub有点慢,mongo的镜像有300多M,所以过多使用阿里云提供的镜像加速服务
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://zv3w4pat.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  • 拉取镜像

    docker pull mongo  # 这样获取的是最新镜像

创建容器

端口直接映射到27017端口,通过 -v 参数映射两个目录到容器中,--atuh启用认证模式

docker run -d -p 27017:27017 -v mongo_configdb:/data/configdb -v mongo_db:/data/db --name mongo docker.io/mongo --auth

文件传输

将备份文件通过scp命令,拉到映射目录里去。这里有个要点,上面2个映射目录是相对路径,其真实路径是在/var/lib/docker/volumes/下。

# 在原机器上执行,ip替换真实ip
scp bak ip:/var/lib/docker/volumes/mongo_configdb/_data

为容器里的mongodb添加认证信息

docker exec -it mongo mongo admin
db.createUser({ user: 'username', pwd: 'password', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
exit
docker exec -it mongo mongo dbname
db.createUser({ user: 'username', pwd: 'password', roles: [{ role: "readWrite", db: "dbname" }] });
# 测试,返回1则正常
db.auth("username","password")
1

还原数据

docker exec -it mongo bash
cd path #到data下的备份文件所在目录
mongorestore -h localhost:27017 -d dbname --dir 备份文件所在目录 -u username -p password

END