如何在不使用Docker-Hub的情况下共享我的Docker-Image?


257

我想知道Docker的映像确切存储在本地主机中的什么位置。我可以不使用Docker-HubDockerfile而是“真实”的Docker-Image 来共享我的Docker-Image吗?当我将Docker-Image“推”到Docker-Hub时到底发生了什么?


2
供将来参考:一篇关于移动
docker

Answers:


243

Docker映像存储为文件系统层。Dockerfile中的每个命令都会创建一个层。您还可以通过docker commit进行一些更改(docker run可能通过)在命令行中使用来创建图层。

这些图层默认情况下存储在/var/lib/docker。虽然您可以(从理论上)从那里挑选文件并将其安装在其他Docker服务器中,但使用Docker使用的内部表示形式可能不是一个好主意。

当您推送映像时,这些层将发送到注册表(默认情况下为docker hub注册表…,除非您使用其他注册表前缀标记映像)并存储在那里。推送时,图层ID用于检查您是否已经在本地拥有该图层或需要下载该图层。您可以docker history用来查看使用了哪些层(其他图像)(在某种程度上,哪个命令创建了该层)。

至于无需推送至Docker Hub注册表即可共享映像的选项,最佳选择是:

  • docker save图片或docker export容器。这会将tar文件输出到标准输出,因此您需要执行docker save 'dockerizeit/agent' > dk.agent.latest.tar。然后,您可以使用docker loaddocker import在其他主机中。

  • 托管您自己的私人注册表。- 已经过时了,看评论 泊坞窗注册表图像。我们构建了一个支持s3的注册表,您可以根据需要启动和停止它(所有状态都保存在您选择的s3存储桶中),这对于设置很简单。这也是观察推送到注册表时发生的情况的一种有趣方式

  • 使用类似quay.io的其他注册表(我个人没有尝试过),尽管您对Docker Hub的任何担心也可能在这里适用。


6
供将来参考,指向Docker注册表映像的链接已过时。您现在应该使用Docker Registry 2.0github /
docker

1
我不确定注册表2.0是否可以立即替代原始版本。它似乎错过了一些基本功能,例如搜索stackoverflow.com/questions/30113726/docker-registry-2-0-api-v2
JoshRivers

1
有关docker save以下问题的问题:当我将源自另一个图像(例如python:2.7)的图像推送到注册表时,父图像无需上载一次,除非更改。我可以保存部分图像以实现类似的文件大小优化吗?我正在经历这些麻烦,因为我是一个有多个图像的业余爱好者,并且我不想为私人注册表付费。
彼得

4
您能否仅从docker build主机上的git存储库中提取src文件(包括Dockerfile)?
jshxe

1
我的构建的@Jishaxe部分是npm install...我无法在主机上构建,因为它的内存很少,并且此步骤始终失败(请参阅:github.com/npm/npm/issues/5021
Soft Bullets

46

基于此博客,可以通过执行以下操作来共享没有docker Registry的docker映像:

docker save --output latestversion-1.0.0.tar dockerregistry/latestversion:1.0.0

完成此命令后,可以将映像复制到服务器并将其导入,如下所示:

docker load --input latestversion-1.0.0.tar

18

将Docker映像发送到远程服务器可以通过3个简单的步骤完成:

  1. 在本地,将Docker映像另存为.tar
docker save -o <path for created tar file> <image name>
  1. 在本地,使用scp.tar传输到远程

  2. 在远程服务器上,将映像加载到docker:

docker load -i <path to docker image tar file>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.