如何保存所有Docker镜像并复制到另一台机器

How to save all Docker images and copy to another machine

我的系统上有以下图像列表,我想将所有这些图像复制到远程计算机上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
u14_py269           latest              6a1ec0b508b3        4 days ago          885.9 MB
u12_py273           latest              c2a804894851        4 days ago          686 MB
u12_core            latest              0d61eba80df2        4 days ago          629.1 MB
c6_py266            latest              cb1a94742d59        4 days ago          1.32 GB
c6_core             latest              77c2ed19d87f        4 days ago          1.278 GB
c7_py275            latest              bb1d3de68452        4 days ago          1.117 GB
c7_core             latest              ca14a76e9cca        4 days ago          1.081 GB
u14_py35            latest              d110c7e4a1f5        5 days ago          914.5 MB
u14_py34            latest              085a37cb8614        5 days ago          830.7 MB
u14_py276           latest              8927c6167930        5 days ago          834.1 MB
u14_core            latest              93ead5abc25b        5 days ago          776.9 MB
centos              centos6             36877b5acebb        5 days ago          228.9 MB
ubuntu              latest              36248ae4a9ac        5 days ago          188 MB
ubuntu              12.04               94a7cb19a65b        5 days ago          137.8 MB
edgester/gerrit     latest              ce4e3238052a        6 days ago          735.2 MB
u14_as374_py276     latest              fa5fb7189d70        11 days ago         1.497 GB
c721_as373_py275    latest              03ccf6961d0c        11 days ago         844.3 MB
c721_as373_py35     latest              b5fece3dd45b        11 days ago         1.127 GB
c171_con_core       latest              8af0d24a38a0        2 weeks ago         377.2 MB
u14_as374_php55     latest              29df638e363a        3 weeks ago         1.073 GB
j_u14_as374_php55   latest              29df638e363a        3 weeks ago         1.073 GB
centos              centos7             c8a648134623        8 weeks ago         196.6 MB
centos              latest              c8a648134623        8 weeks ago         196.6 MB
j_u14_as374_py276   latest              28f379d60882        10 weeks ago        871.5 MB
ubuntu              14.04               89d5d8e8bafb        10 weeks ago        187.9 MB

目前我正在使用保存和加载Docker图像中建议的方法,但我相信必须有更好的方法来处理所有图像。


如果要一次导出所有图像,请创建一个大tar文件:

1
docker save $(docker images -q) -o /path/to/save/mydockersimages.tar

如果要在一个.tar文件中保存多个图像:

1
2
IDS=$(docker images | awk '{if ($1 ~ /^(debian|centos)/) print $3}')
docker save $IDS -o /path/to/save/somedockersimages.tar

最后,如果要导出多个多个图像,每个图像有一个.tar文件(磁盘效率不高:每个.tar文件中都保存有公共层):

1
2
3
4
5
6
docker images | awk '{if ($1 ~ /^(openshift|centos)/) print $1"" $2"" $3 }' | tr -c"a-z A-Z0-9_.
-""%" | while read REPOSITORY TAG IMAGE_ID
do
  echo"== Saving $REPOSITORY $TAG $IMAGE_ID =="
  docker  save   -o /path/to/save/$REPOSITORY-$TAG-$IMAGE_ID.tar $IMAGE_ID
done

您还可能希望保存图像列表,以便对还原的图像进行标记:

1
docker images | sed '1d' | awk '{print $1"" $2"" $3}' > mydockersimages.list

在远程机器上,您可以执行以下操作:

1
docker load -i /path/to/save/mydockersimages.tar

并标记导入的图像:

1
2
3
4
5
while read REPOSITORY TAG IMAGE_ID
do
        echo"== Tagging $REPOSITORY $TAG $IMAGE_ID =="
        docker tag"$IMAGE_ID""$REPOSITORY:$TAG"
done < mydockersimages.list

有关保存/加载的详细信息,请阅读:如何在不使用存储库的情况下将Docker映像从一台主机复制到另一台主机


name:tag将所有图像保存到一个tar文件中:

1
docker save $(docker images | sed '1d' | awk '{print $1":" $2 }') -o allinone.tar

然后,加载所有图像:

1
docker load -i allinone.tar


对于承载命令的Windows服务器来说,这有点不同。使用ethansn答案,我发现以下方法有效-使用go格式:

1
    docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allinone.tar

加载命令:

1
    docker load -i allinone.tar

完美工作,无需导入机器下载任何图像。


您可以使用bash迭代对每个映像上运行docker save -o docker images的响应,然后(假设将它们全部保存到一个文件夹中)将其压缩并scp到远程主机。


使用注册表,您可以拥有类似于git的工作流。在本地修改容器,提交对本地映像的更改,然后将映像推送到注册表。然后您可以从远程机器中提取图像。

您可以使用公共Docker集线器,也可以设置自己的注册表服务器。

https://docs.docker.com/注册表/


非常感谢您所有的雨篷,但我找到了一个基本和安全的解决方案:

1
2
3
4
5
docker save -o ubuntu.tar myjenk:latest jenkins/jenkins:lts

REPOSITORY          TAG                    
myjenk              latest    
jenkins/jenkins     lts

恢复图像后:

1
docker load < ubuntu.tar