325

我想知道 Docker 的图像究竟存储在我的本地主机中的哪个位置。我可以共享我的 Docker-Image 而不使用Docker-HubDockerfile真实”Docker-Image 吗?当我将 Docker-Image 推送到 Docker-Hub 时到底发生了什么?

4

4 回答 4

301

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

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

当你推送你的镜像时,这些层会被发送到注册表(默认情况下是 docker hub 注册表……除非你用另一个注册表前缀标记你的镜像)并存储在那里。拉取的时候,layer id用来检查本地是否已经有layer或者需要下载。您可以使用docker history来查看使用了哪些图层(其他图像)(以及在某种程度上,哪个命令创建了该图层)。

至于在不推送到 docker hub 注册表的情况下共享图像的选项,您的最佳选择是:

  • docker save图像或docker export容器。这会将 tar 文件输出到标准输出,因此您会喜欢执行类似docker save 'dockerizeit/agent' > dk.agent.latest.tar. 然后你可以使用docker loaddocker import在不同的主机上。

  • 托管您自己的私人注册表。-过时,见评论 docker 注册表图像。我们构建了一个支持 s3 的注册表,您可以根据需要启动和停止它(所有状态都保存在您选择的 s3 存储桶中),这很容易设置。这也是一种有趣的方式来观察推送到注册表时会发生什么

  • 使用另一个注册表,例如quay.io(我没有亲自尝试过),尽管您对 docker hub 的任何担忧可能也适用于此。

于 2014-06-30T07:44:37.340 回答
76

根据这篇博客,可以通过执行以下命令共享一个没有 docker 注册表的 docker 镜像:

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

完成此命令后,可以将图像复制到服务器并按如下方式导入:

docker load --input latestversion-1.0.0.tar
于 2018-02-18T21:28:57.407 回答
47

将 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>
于 2018-06-12T23:53:42.423 回答
8

[更新]

最近,出现了 Amazon AWS ECR(弹性容器注册表),它提供了一个 Docker 映像注册表,您可以通过 AWS IAM 访问管理服务控制对它的访问。当您推送图像时,ECR 还可以对您的图像运行 CVE(漏洞)检查。

创建 ECR 并获得“URL”后,您可以根据您创建的权限根据需要推送和拉取:因此可以根据需要将其设为私有或公开。

定价取决于存储的数据量和数据传输成本。

https://aws.amazon.com/ecr/

[原答案]

如果您不想使用 Docker Hub 本身,您可以在 JFrog 的 Artifactory 下托管您自己的 Docker 存储库:

https://www.jfrog.com/confluence/display/RTF/Docker+Repositories

然后它将在您自己的服务器上运行。

其他托管供应​​商可用,例如 CoreOS:

http://www.theregister.co.uk/2014/10/30/coreos_enterprise_registry/

买了 quay.io

于 2015-09-30T09:37:12.240 回答