
背景这段时间负责公司运维工作多个私有云服务器快到期了因此线上服务和数据需要迁移备份但是如果在同一台机器上部署多个实例难免有端口冲突为了做到相互隔离和维护方便docker可能是最佳选择于是开始了我的迁移之旅备份服务器迁移过程中最重要的是数据为了确保数据不丢失最好是晚上停机备份# redis拷贝rdb文件和conf配置文件# mysql全量备份mysqldump --all-databases-uroot-pmysql_backup.sql# mysql容器备份配置文件/etc/mysql/mysql.conf.d/mysqld.cnfdockerexec-itid(container)mysqldump --all-databases-uroot-pmysql_backup.sql# 导出单个库如果在db_name 前加--databases 最终在xxx.sql里面会有create database db_name;和use db_name;语句dockerexec-itid(container)mysqldump-uroot-pdb_namemysql_backup.sql# mongo备份整库到指定文件mongodump--authenticationDatabaseadmin-uadmin-p123-dxc_log--archive./xc_log.archive# 数据量大时可使用gzip压缩mongodump--authenticationDatabaseadmin-uadmin-p123-dxc_log--port27017-o./mongo_back/--gzip# mongodb容器导出数据dockerexecmongo-cexec mongodump -uadmin -p123456 --authenticationDatabaseadmin -d xc_log --archive./xc_log.archive[mongodump命令详解]备份文件传输可使用scp命令和xftp软件推荐使用rsync同步整个项目目录# 将backup文件夹传送到远程的目录可列出多个回车后需要输入密码scp-r backup rootip:/workspace/shlg# 传送文件scp mysql_backup.sql mysqld.conf rootip:/workspace/shlg部署服务器环境配置如 gitnginx等这里不多讲docker安装安装过程请自行搜索[Ubuntu安装docker]创建自定义网络虚拟网桥这样容器可以与同一网络中的其他容器通信# 默认为 bridge 模式dockernetwork create tongji_net# 打印所有网络dockernetworkls# 查看网络信息dockernetwork inspect tongji_net关于network的更多解释见数据库redis如有备份文件请把rdb文件拷贝至data目录下# 拉取合适的版本dockerpull redis:5.0-alpine# 生成容器dockerrun-itd--nameshlg_redis-v/workspace/shlg/redis/data:/data-v/workspace/shlg/redis/redis.conf:/etc/redis/redis.conf--networktongji_net--ip172.18.0.25--restartalways redis:5.0-alpine配置文件需改为如下设置# 关闭守护进程否则起不来 daemonize no # 生产上可不用修改默认为127.0.0.1仅限本机访问 bind 0.0.0.0mysql如需设置时区请加上-e TZAsia/Shanghai# --name 容器名称# -p 端口映射# -v 目录挂载# -e 设置root密码等# --network 绑定网络# --ip 绑定ipdockerrun-d--nameshlg_mysql-p3406:3306-v/workspace/shlg/mysql/data:/var/lib/mysql-v/workspace/shlg/mysql/my.cnf:/etc/my.cnf-eMYSQL_ROOT_PASSWORD123456--networktongji_net--ip172.18.0.24 mysql:5.7.31数据恢复dockerexec-itid(container)mysql-uroot-p123456./mysql_backup.sql# 数据库实例恢复单数据库mysql-uroot-pqd_xc_v3./qd_xc_v3.sql# 数据库实例恢复所有数据库mysql-uroot-p./mysql_backup.sql用户角色配置# 5.7之前的版本 grant all privileges on *.* to test172.18.0.% identified by password with grant option; # 如果想配置某个数据库的权限改成 grant all privileges on database_name.* to test172.18.0.% identified by password with grant option; flush privileges; show grants for test127.0.0.1; # 8.0之后的版本 CREATE USER test% IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO test% WITH GRANT OPTION; FLUSH PRIVILEGES; # 撤销权限 revoke shutdown on *.* from user%;mongodbdocker run-itd--name shlg_mongodb-v/workspace/shlg/mongodb/data:/data/db--network tongji_net--ip172.18.0.26mongo:4.0数据恢复# 此命令暂未生效dockerexec-ishlg_mongodb mongorestore-uadmin-p123--authenticationDatabaseadmin-dxc_log--gzip/workspace/shlg/mongodb/xc_log# 有效dockerexec-ishlg_mongodbsh-cexec mongorestore -u admin -p 123 --authenticationDatabase admin --archive/workspace/shlg/xc_log.archive可以直接进入容器内部无需密码设置用户角色docker exec -it shlg_mongodb mongo use admin db.createUser({user:admin,pwd:mongo123,roles:[{role:root,db:admin}]}) use xc_log db.createUser({user:shlg,pwd:123456,roles:[{role:dbOwner,db:xc_log}]})然后在/etc/mongod.conf文件的 security 下加上下面的代码重启服务即可生效security: authorization: enabled[mongorestore命令]node服务这里有多个node服务exports、log、join、xiaochuang_3.0shared是公共字典将它们部署到一个容器内需要打包成镜像再根据镜像生成容器在项目同级目录下新建Dockerfile文件内容如下FROM node:10.24-alpine ENVTZAsia/Shanghai RUN apk updateapkaddtzdataecho${TZ}/etc/timezoneln-sf/usr/share/zoneinfo/${TZ}/etc/localtimerm/var/cache/apk/* COPY exports /workspace/exports COPY log /workspace/log COPYjoin/workspace/join COPY xiaochuang_3.0 /workspace/xiaochuang_3.0 COPY shared /workspace/shared COPY script.sh /workspace/script.sh ENTRYPOINT[./workspace/script.sh]注意如果系统的文件存储在项目所在目录下且存的是绝对地址的话容器内的项目根目录必须保持和原系统一致否则会找不到文件。配置容器内项目启动脚本当前目录新建 script.sh 内容如下#!/bin/shcd/workspace/lognpmrun start-prodcd/workspace/exportsnpmrun start-prodcd/workspace/joinnpmrun start-prodcd/workspace/xiaochuangnpmrun start-prod给当前文件新增可执行权限chmod 755 script.sh在项目上一级目录新建init.sh名字自定义内容如下# 删除旧镜像docker rmi shlg_node:old# 标记新镜像为旧镜像docker tag shlg_node:latestshlg_node:olddocker rmi shlg_node:latest# 根据该目录下的Dockerfile打包镜像如果打包过程报错提示包无法下载请加上 --networkhostdocker build-t shlg_node:latest/workspace/shlg/workspace/--networkhost# 生成新的容器docker rm-f shlg_nodedocker run-d--name shlg_node-v/workspace/shlg/workspace/xiaochuang_3.0:/workspace/xiaochuang-v/workspace/shlg/workspace/exports:/workspace/exports-v/workspace/shlg/workspace/log:/workspace/log-v/workspace/shlg/workspace/join:/workspace/join-v/workspace/shlg/workspace/shared:/workspace/shared-v/workspace/shlg/workspace/logs:/root/logs--network tongji_net--ip172.18.0.52shlg_node:latest# 查看最新20条并跟踪启动日志docker logs--tail20-f shlg_node如果遇到容器无法启动的情况可能是因为docker容器运行必须有一个前台进程如果没有前台进程执行容器认为空闲就会自行退出。xiaochuang_3.0是项目主体所以得去掉package.json 中启动命令start-prod里的--daemon选项。如果后端项目要连接宿主机的数据库请把连接信息中的host改为该容器的网关ip可使用docker inspect container查看Gateway设置即为虚拟网卡ip确保路径映射和ip无误后最后运行脚本sh init.sh稍等几分钟中途没有报错的话容器自动运行最后大功告成~_~