我有一个已构建的 Docker 映像:
» docker images --no-trunc | grep discoball/nginx
discoball/nginx latest 623444f1777c 21 hours ago 126 MB
我想将其移动到远程服务器;docker save
并且docker load
似乎有命令能够将图像序列化为文件或从文件反序列化,这正是我所需要的。但是,我无法真正让它们工作。
我保存了图片:
» docker save discoball/nginx > nginx-latest.tar.gz
然后尝试在远程恢复它:
» cat nginx-latest.tar.gz | ssh "$IP" docker load
该命令执行成功。但是,docker images
远程指示镜像未成功;相反,似乎仍存在旧版本:
» ssh "$IP" docker images --no-trunc | grep discoball/nginx
discoball/nginx latest 2678dc27dd46 21 hours ago 126 MB
请注意,图像 ID 不同;我猜这是我的图像的旧版本。在服务器上搜索图像 ID 本身也不会产生任何结果:
» ssh "$IP" docker images --all | grep 623444
(last command returned 1.)
»
我究竟做错了什么?
所以现在我正在深入研究生成的.tar.gz
文件;repositories
其中的文件似乎表明远程机器是正确的:
» tar -xf nginx-latest.tar.gz -O repositories
{"discoball/nginx":{"latest":"2678dc27dd46469bc8692c2e5ad71b57ae573b1444531fcd1f76798638f84f5c"}}
这就是我在远程服务器上看到的数字。但为什么我把docker save
这个数字写出来了,而不是623444f1777c
?(docker 镜像 ID 不就是镜像和/或层的加密哈希吗?)如果远程服务器做有相同的图像,为什么它有不同的图像 ID?(我现在不知道如何验证这一点,因为到目前为止,我会说“相同的图像”是“相同的图像 ID”……)
答案1
在本地机器上
docker save MYIMAGE:TAG -o myimage.tgz
复制myimage.tgz
到远程机器,然后你就可以
docker load -i myimage.tgz
无论如何,传输Dockerfile
及其工件并直接在远程服务器中构建新映像可能会更容易。无论哪种方式对您来说都更好。