Docker实现镜像批量导出与导入的完整指南
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 批量保存镜像到.tar文件</a></li><li><a href="#_label1">2. 批量加载镜像</a></li><li><a href="#_label2">3. 使用示例</a></li><li><a href="#_label3">4.方法补充</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 批量保存镜像到.tar文件</h2><div class="jb51code"><pre class="brush:bash;">#!/bin/bash
# 保存目录
SAVE_DIR=/root/docker_images_backup
mkdir -p $SAVE_DIR
# 获取本地所有镜像列表 (Repository:Tag + IMAGE ID)
docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | while read img id; do
# 如果 TAG 是 <none>,使用 IMAGE ID 代替
if [[ $img == *"<none>"* ]]; then
img=$id
fi
# 生成文件名,将 / 和 : 替换为 _
filename=$(echo $img | sed 's/[\/:]/_/g').tar
echo "Saving $img -> $SAVE_DIR/$filename"
# 执行 docker save 导出镜像
docker save -o $SAVE_DIR/$filename $img
done
</pre></div>
<p>功能说明:</p>
<ul><li>自动处理 <code><none></code> 标签的镜像。</li><li>每个镜像导出为独立 tar 文件,命名格式 <code>REPOSITORY_TAG.tar</code>。</li><li>方便迁移和备份。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>2. 批量加载镜像</h2>
<div class="jb51code"><pre class="brush:bash;">#!/bin/bash
# 镜像 tar 文件目录
LOAD_DIR=/root/docker_images_backup
# 遍历目录下所有 tar 文件
for tarfile in $LOAD_DIR/*.tar; do
echo "Loading $tarfile ..."
docker load -i $tarfile
done
</pre></div>
<p>功能说明:</p>
<ul><li>自动加载目录下所有 <code>.tar</code> 文件到本地 Docker。</li><li>可以用于迁移到新服务器或重建环境。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>3. 使用示例</h2>
<p>保存镜像:</p>
<div class="jb51code"><pre class="brush:bash;">bash save_all_images.sh
</pre></div>
<p>在新服务器加载镜像:</p>
<div class="jb51code"><pre class="brush:bash;">bash load_all_images.sh
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4.方法补充</h2>
<p>下文详细介绍了如何在Docker中批量导出和导入镜像,包括停止和删除容器、查找镜像、创建镜像目录、导出镜像到tar文件以及导入导出的脚本示例。</p>
<p>image_tar为存储镜像目录</p>
<p><strong>删除所有容器</strong></p>
<p>1.首先需要停止所有运行中的容器</p>
<div class="jb51code"><pre class="brush:bash;">docker stopdocker ps -a -q
</pre></div>
<p>docker ps -a -q 意思是列出所有容器(包括未运行的),只显示容器编号,其中</p>
<ul><li>-a : 显示所有的容器,包括未运行的。</li><li>-q : 静默模式,只显示容器编号。</li></ul>
<p><strong>删除所有容器,将上面命令中的 stop 改为 rm 即可:</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker rm docker ps -a -q
</pre></div>
<p><strong>删除所有镜像</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker rmi docker images -q
</pre></div>
<p>docker images -q 意思是列出本地镜像,只显示镜像 ID;docker rmi 意思是删除本地一个或多个镜像。</p>
<p><strong>按条件删除镜像</strong></p>
<p>删除无标签镜像(即 TAG 为 none 的镜像 dangling image)</p>
<div class="jb51code"><pre class="brush:bash;">docker rmi docker images -q | awk '/^<none>/ { print $3 }'
</pre></div>
<p>也可以使用如下命令删除</p>
<div class="jb51code"><pre class="brush:bash;">docker rmi $(docker images -q -f dangling=true)
</pre></div>
<p>删除包含某关键字的镜像</p>
<div class="jb51code"><pre class="brush:bash;">docker rmi --force docker images | grep test-api | awk '{print $3}' //其中test-api为关键字
</pre></div>
<p><strong>导出镜像</strong></p>
<div class="jb51code"><pre class="brush:bash;">#!/bin/bash
### 批量docker镜像的_脚本
# 获取到 "image:tag" 格式的镜像名
IMG_NAME=`docker images | grep -v TAG | awk '{print $1":"$2}'`
# echo $IMG_NAME | awk '{gsub(/ /,"\n",$0)} {print $0}'
# 如果原本镜像名中存在 "/" 是需要去掉的
# 定义镜像存放目录
DIR="./image_tar"
if [ ! -d "$DIR" ]; then
echo -e "\033[34m${DIR}\033[0m 不存在"
mkdir -p "$DIR"
echo -e "\033[34m${DIR}\033[0m 已创建"
else
echo -e "\033[34m${DIR}\033[0m 已存在"
fi
echo ""
for IMAGE in $IMG_NAME
do
echo -e "正在保存 \033[33m${IMAGE}\033[0m"
SAVE_NAME=`echo $IMAGE | awk -F: '{print $1"_"$2}' | sed 's/\//_/g'`
docker save $IMAGE -o ${DIR}/${SAVE_NAME}.tar
echo -e "已保存到 \033[34m${DIR}/\033[31m${SAVE_NAME}.tar\033[0m"
echo ""
done
</pre></div>
<p><strong>导入镜像</strong></p>
<div class="jb51code"><pre class="brush:bash;">#!/bin/bash
# 批量导出docker镜像_在此处填写镜像文件的保存目录
IMAGE_DIR="./image_tar"
for IMAGE in `ls $IMAGE_DIR`
do
echo -e "正在导入镜像 \033[33m$IMAGE\033[0m"
docker load -i ${IMAGE_DIR}/${IMAGE}
echo -e "已成功导入镜像 \033[33m$IMAGE\033[0m"
echo ""
done
</pre></div>
<p>到此这篇关于Docker实现镜像批量导出与导入的完整指南的文章就介绍到这了,更多相关Docker镜像导入导出内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁:
[1]