在实际的运维工作中,总是免不了一些批量操作的事情,比如,批量添加用户,批量修改用户密码,批量创建文件夹,批量移动复制文件等等操作。如果都是手工操作的话,无疑是一个劳心费力的事情,因此,我们才需要编写脚本来快速处理这些重复的工作。
那么,docker也镜像其实也是可以导出为文件,然后在导入到另一个docker环境内的,说人话就是迁移工作,如何快速的导出docker镜像呢?当然还是脚本最为方便了,例如下面这个脚本将会把本机内的所有镜像统统打包到/data/docker/image_tar这个目录下。
一,
docker镜像的批量导出
#!/bin/bash
# 获取到 "image:tag" 格式的镜像名
IMG_NAME=`docker images | grep -v TAG | awk '{print $1":"$2}'`
# 定义镜像存放目录
DIR="/data/docker/image_tar"
if [ ! -d "$DIR" ]; then
echo -e "\033[34m\033[0m 不存在"
mkdir -p "$DIR"
echo -e "\033[34m\033[0m 已创建"
else
echo -e "\033[34m\033[0m 已存在"
fi
echo ""
for IMAGE in $IMG_NAME
do
echo -e "正在保存 \033[33m\033[0m"
SAVE_NAME=`echo $IMAGE | awk -F: '{print $1"_"$2}' | sed 's/\//_/g'`
docker save $IMAGE -o /.tar
echo -e "已保存到 \033[34m/\033[31m.tar\033[0m"
echo ""
done
其实导出dockers镜像为文件有两个难点,
第一是docker save 命令是需要docker镜像名称:版本号这样的形式 ,因此将所有的镜像名称:版本号通过命令docker images | grep -v TAG | awk '{print $1":"$2}'做了一个拼接。
第二是,导出的文件名称如何定义的简洁明了,因此,通过命令定义保存的名字是镜像名称+版本号,而镜像名称内通常又带有仓库名称/ 这样的形式,而这样命名的文件会在后面的使用中出问题,因此, sed 's/\//_/g',将文件名称做了优化。
第三,
最后的 echo "" 是为了输出的美观,保证行行清晰,美观,别的意思没有。
二,
docker镜像文件的批量导入
docker镜像文件的导入就非常简单了,也不需要专门编写脚本了,通常是一句话的for循环就可以啦,比如上面定义的文件存放路径/data/docker/image_tar 里面已经有所需的镜像文件了,那么,在任何地方执行以下命令就可以啦:
for i in `ls /data/docker/image_tar/*`;do docker load <$i;done
当然,for循环的变量也可以这样写:
for i in ;do docker load <$i;done
等等写法,据我所知就 四 五种方法,不过还是第一个最简单啦(打的字比较少嘛,就简单了),好了,就不扯淡了,docker镜像的导入导出就介绍到这啦。