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 |
如果要在一个
1 2 | IDS=$(docker images | awk '{if ($1 ~ /^(debian|centos)/) print $3}') docker save $IDS -o /path/to/save/somedockersimages.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映像从一台主机复制到另一台主机
用
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迭代对每个映像上运行
使用注册表,您可以拥有类似于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 |