上一篇博客写了下Docker容器迁移的记录,如果只迁移几个容器还好,但一旦要备份的容器多了就比较麻烦,所以写了两个简单的Shell脚本完成Docker容器的迁移。有问题请提出,感谢❤
在Windows上编辑Shell脚本后放到Linux上去运行的时候,如果出现“坏的解释器”这样的错误提示,可能是因为Windos和Linux的换行符不一样导致的。
解决办法:在Linux使用vi/vim编辑要运行的.sh文件
执行 :set ff=unix 命令修改文件的内容格式就可以了
1.完成容器备份成镜像和打包(原服务器上执行):
#! /bin/bash
#备份容器并打成tar包脚本
#备份镜像tar包的导出路径(根据实际修改)
backupDir="/root/docker_backup"
#若导出文件夹路径不存在,则自动生成
[ ! -d backupDir ] && `mkdir -p $backupDir`
#将当前运行的所有容器id以及名称存放到containerInfoList
containerInfoList=`docker ps | awk '{print $1}'| sed '1d'`
for containerId in $containerInfoList
do
#镜像名称
imageName=`docker ps | grep $containerId | awk -F ' {2,}' '{print $7}'`
#自定义镜像名称
newImageName="$imageName"
#执行commit命令(回显新镜像id) 2020.9.8更新:这里后来发现docker版本不同,docker commit回显的数据不同。我这里第二列就是镜像Id,有的版本第三列才是。可以自己先输出回显内容,再根据需要过滤。
newImageId=`docker commit -p $containerId ""$newImageName":backup" | awk -F ':' '{print $2}'`
#执行save命令
`docker save -o ""${backupDir}"/"${newImageName}".tar" "${newImageName}:backup"`
done
2.完成备份镜像的加载(目标服务器上执行):
#! /bin/bash
#加载镜像脚本
#备份镜像所存放路径(根据实际修改)
backupDir="/root/docker_backup"
#获取备份镜像所在路径下所有镜像名称(名称中不可带冒号,若带冒号,删除docker tag 命令)
imageBackupList=`ls $backupDir`
#echo "imageBackupList:"$imageBackupList""
for imageName in $imageBackupList
do
#load命令加载镜像
imageId=`docker load -i ""${backupDir}"/"${imageName}"" | awk -F ':' '{print $2}'`
#修改镜像名称与标签 根据自己需求改名称
newImageName=$imageName
# echo "newImageName:"$newImageName""
docker tag ${imageId} ""$newImageName":backup"
done
这是第一次写ShellScript,不知道有什么适合的编辑器。然后因为Java写得多,用的IDE是IDEA,就在IDEA装了个ShellScript的智能提示插件后开写了,用IDEA的旁友可以玩玩。插件是这个:
还有一款轻量级的编辑软件:Sublime Text也挺不错的。