我想知道Docker的图像到底存储在我的本地主机的哪里。 我可以分享我的Docker-Image而不使用Docker-Hub或Dockerfile,而是“真正的”Docker-Image吗?当我将Docker-Image“推送”到Docker-Hub时,到底发生了什么?


Docker映像存储为文件系统层。Dockerfile中的每个命令都创建一个层。你也可以在做了一些修改后,从命令行使用docker commit(可能是通过docker run)来创建层。

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

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

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

docker save an image or docker export a container. This will output a tar file to standard output, so you will like to do something like docker save 'dockerizeit/agent' > dk.agent.latest.tar. Then you can use docker load or docker import in a different host. Host your own private registry. - Outdated, see comments See the docker registry image. We have built an s3 backed registry which you can start and stop as needed (all state is kept on the s3 bucket of your choice) which is trivial to setup. This is also an interesting way of watching what happens when pushing to a registry Use another registry like quay.io (I haven't personally tried it), although whatever concerns you have with the docker hub will probably apply here too.


(更新)

最近,有亚马逊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


根据这篇博客,你可以在没有docker注册表的情况下共享docker镜像:

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

一旦这个命令已经完成,你可以复制镜像到一个服务器,并导入它如下:

docker load --input latestversion-1.0.0.tar

将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>