如何在不使用 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-Hub
或Dockerfile
而是使用“真正的”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 load
或docker 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 播放列表的内容?
如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]