服务器迁移及docker部署

背景

这段时间负责公司运维工作,多个私有云服务器快到期了,因此线上服务和数据需要迁移备份,但是如果在同一台机器上部署多个实例难免有端口冲突,为了做到相互隔离和维护方便,docker可能是最佳选择,于是开始了我的迁移之旅:

备份

服务器迁移过程中最重要的是数据,为了确保数据不丢失,最好是晚上停机备份

# redis:拷贝rdb文件和conf配置文件
# mysql全量备份
mysqldump --all-databases -uroot -p > mysql_backup.sql
# mysql容器备份,配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf
docker exec -it id(container) mysqldump --all-databases -uroot -p > mysql_backup.sql
# 导出单个库(如果在db_name 前加--databases ,最终在xxx.sql里面会有create database db_name;和use db_name;语句)
docker exec -it id(container) mysqldump -uroot -p db_name > mysql_backup.sql
# mongo备份整库到指定文件
mongodump --authenticationDatabase=admin -u admin -p '123' -d xc_log  --archive=./xc_log.archive
# 数据量大时可使用gzip压缩
mongodump --authenticationDatabase=admin -u admin -p '123' -d xc_log --port 27017 -o ./mongo_back/ --gzip
# mongodb容器导出数据
docker exec mongo -c 'exec mongodump -uadmin -p"123456" --authenticationDatabase=admin -d xc_log --archive' > ./xc_log.archive

mongodump命令详解

备份文件传输,可使用scp命令和xftp软件,推荐使用rsync同步整个项目目录

# 将backup文件夹传送到远程的目录,可列出多个,回车后需要输入密码 
scp -r backup root@ip:/workspace/shlg
# 传送文件
scp mysql_backup.sql mysqld.conf root@ip:/workspace/shlg

部署

服务器环境配置,如 git,nginx等,这里不多讲

docker安装

安装过程请自行搜索:Ubuntu安装docker

创建自定义网络(虚拟网桥),这样容器可以与同一网络中的其他容器通信,

# 默认为 bridge 模式
docker network create tongji_net
# 打印所有网络
docker network ls
# 查看网络信息
docker network inspect tongji_net

关于network的更多解释见 链接

数据库

redis

如有备份文件,请把rdb文件拷贝至data目录下

# 拉取合适的版本
docker pull redis:5.0-alpine
# 生成容器
docker run -itd --name shlg_redis -v /workspace/shlg/redis/data:/data -v /workspace/shlg/redis/redis.conf:/etc/redis/redis.conf --network tongji_net --ip 172.18.0.25 --restart=always redis:5.0-alpine

配置文件需改为如下设置

# 关闭守护进程,否则起不来
daemonize no
# 生产上可不用修改,默认为127.0.0.1,仅限本机访问
bind 0.0.0.0

mysql

如需设置时区请加上 -e TZ="Asia/Shanghai"

# --name 容器名称
# -p 端口映射
# -v 目录挂载
# -e 设置root密码等
# --network 绑定网络
# --ip 绑定ip
docker run -d --name shlg_mysql -p 3406:3306 -v /workspace/shlg/mysql/data:/var/lib/mysql -v /workspace/shlg/mysql/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD='123456' --network tongji_net --ip 172.18.0.24 mysql:5.7.31

数据恢复

docker exec -it id(container) mysql -uroot -p"123456" < ./mysql_backup.sql
# 数据库实例恢复单数据库
mysql -uroot -p qd_xc_v3 < ./qd_xc_v3.sql
# 数据库实例恢复所有数据库
mysql -uroot -p < ./mysql_backup.sql

用户角色配置

# 5.7之前的版本
grant all privileges on *.* to 'test'@'172.18.0.%' identified by 'password' with grant option;
# 如果想配置某个数据库的权限,改成
grant all privileges on database_name.* to 'test'@'172.18.0.%' identified by 'password' with grant option;
flush privileges;
show grants for 'test'@'127.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'@'%';

mongodb

docker run -itd --name shlg_mongodb -v /workspace/shlg/mongodb/data:/data/db --network tongji_net --ip 172.18.0.26 mongo:4.0 

数据恢复

# 此命令暂未生效
docker exec -i shlg_mongodb mongorestore -u admin -p "123" --authenticationDatabase admin -d xc_log --gzip < /workspace/shlg/mongodb/xc_log
# 有效
docker exec -i shlg_mongodb sh -c 'exec 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:'mongo@123',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.0,shared是公共字典,将它们部署到一个容器内,需要打包成镜像,再根据镜像生成容器,在项目同级目录下新建Dockerfile文件,内容如下:

FROM node:10.24-alpine
ENV TZ=Asia/Shanghai
RUN apk update && apk add tzdata && echo "${TZ}" > /etc/timezone && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && rm /var/cache/apk/*
COPY exports /workspace/exports
COPY log /workspace/log
COPY join /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/sh
cd /workspace/log && npm run start-prod
cd /workspace/exports && npm run start-prod
cd /workspace/join && npm run start-prod
cd /workspace/xiaochuang && npm run start-prod

给当前文件新增可执行权限

chmod 755 script.sh

在项目上一级目录新建init.sh,名字自定义,内容如下:

# 删除旧镜像
docker rmi shlg_node:old
# 标记新镜像为旧镜像
docker tag shlg_node:latest shlg_node:old
docker rmi shlg_node:latest
# 根据该目录下的Dockerfile打包镜像,如果打包过程报错提示包无法下载请加上 --network=host
docker build -t shlg_node:latest /workspace/shlg/workspace/ --network=host
# 生成新的容器
docker rm -f shlg_node && docker 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 --ip 172.18.0.52 shlg_node:latest
# 查看最新20条并跟踪启动日志
docker logs --tail=20 -f shlg_node

如果遇到容器无法启动的情况,可能是因为docker容器运行必须有一个前台进程,如果没有前台进程执行,容器认为空闲,就会自行退出。xiaochuang_3.0是项目主体,所以得去掉package.json 中启动命令start-prod里的 --daemon选项。

如果后端项目要连接宿主机的数据库,请把连接信息中的host改为该容器的网关ip,可使用docker inspect container查看
Gateway设置,即为虚拟网卡ip

确保路径映射和ip无误后最后运行脚本:sh init.sh,稍等几分钟,中途没有报错的话,容器自动运行,最后大功告成 ~_~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容