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

Posted

技术标签:

【中文标题】如何在不使用 Docker-Hub 的情况下共享我的 Docker-Image?【英文标题】:How to share my Docker-Image without using the Docker-Hub? 【发布时间】:2014-08-20 09:26:40 【问题描述】:

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

【问题讨论】:

供以后参考:moving docker images around上的一篇好文章 【参考方案1】:

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

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

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

【讨论】:

为了将来参考,docker 注册表镜像的链接已经过时。您现在应该使用Docker Registry 2.0 和github/docker/distribution 上的代码 我不确定 Registry 2.0 是否是原始版本的现成替代品。好像漏掉了一些基本功能,比如搜索***.com/questions/30113726/docker-registry-2-0-api-v2 关于docker save的问题:当我将来自另一个图像(比如说python:2.7)的图像推送到注册表时,父图像不需要多次上传,除非它变化。我可以保存部分图像以实现类似的文件大小优化吗?我跳过了这些障碍,因为我是一个拥有多个图像的爱好者,我不想为私人注册表付费。 你能不能只从 git repo 中提取 src 文件,包括 Dockerfile 和主机上的docker build @Jishaxe 我构建的一部分是到npm install...我无法在我的主机上构建,因为它的内存非常少,而且这一步总是失败(参见:github.com/npm/npm/issues/5021)跨度> 【参考方案2】:

[更新]

最近出现了 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

【讨论】:

也可以在谷歌云控制台上使用,虽然我没有尝试在组织外共享【参考方案3】:

将 docker 镜像发送到远程服务器只需 3 个简单的步骤:

    在本地,将 docker 镜像保存为 .tar
docker save -o <path for created tar file> <image name>

    在本地,使用 scp.tar 传输到远程

    在远程服务器上,将镜像加载到 docker:

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

【讨论】:

【参考方案4】:

基于this blog,可以通过执行以下命令共享一个没有 docker 注册表的 docker 镜像:

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

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

docker load --input latestversion-1.0.0.tar

【讨论】:

我猜这样你会丢失缓存/重用未更改的图层?因为即使只有很小的变化,您也总是会上传完整的图像?

以上是关于如何在不使用 Docker-Hub 的情况下共享我的 Docker-Image?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不安装的情况下阅读共享的 Spotify 播放列表的内容?

如何在不提供用户名和密码的情况下访问共享文件夹[关闭]

Automake:如何在不安装的情况下构建共享库

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]

如何在不使用 inotifywait 的情况下监视目录的文件更改?

如何在不使用非公共 API 的情况下禁用 UITextView 上的共享并被苹果拒绝?