如何在不使用pull命令的情况下下载Docker镜像?

How do I download Docker images without using the pull command?

有没有一种方法可以下载Docker图像/容器,例如使用火狐,而不使用内置的docker-pull

我被公司防火墙和代理阻止了,我无法从中钻一个洞。

我的问题是我不能使用Docker来获取图像,也就是说,Docker保存/拉和其他Docker提供的功能,因为它被防火墙阻止了。


只是另一种选择——这是我在我的组织中为CouchBase映像所做的,在该映像中,代理阻止了我。

在我的个人笔记本电脑(OS X)上

1
2
3
4
5
6
~$ $ docker save couchbase > couchbase.tar
~$ ls -lh couchbase.docker
-rw-------  1 vikas  devops   556M 12 Dec 21:15 couchbase.tar
~$ xz -9 couchbase.tar
~$ ls -lh couchbase.tar.xz
-rw-r--r--  1 vikas  staff   123M 12 Dec 22:17 couchbase.tar.xz

然后,我把压缩后的焦油球上传到Dropbox,然后下载到我的工作机器上。由于某种原因Dropbox已打开:)

在我的笔记本电脑上(Centos 7)

1
$ docker load < couchbase.tar.xz

工具书类

  • https://docs.docker.com/engine/reference/commandline/save/
  • https://docs.docker.com/engine/reference/commandline/load/下载/


我只需要自己处理这个问题——从一台有互联网接入的受限机器上下载图像,但是没有Docker客户机在另一台有Docker客户机的受限机器上使用,但是没有互联网接入。我将我的问题发布到DevOps堆栈交换站点:

  • 不使用Docker从Docker Hub下载Docker图像

在码头社区的帮助下,我找到了解决问题的方法。下面是我的解决方案。

因此,moby项目在moby github账户上有一个shell脚本,可以从docker hub下载图片,格式可以导入docker:

  • 下载-frozen-image-v2.sh

脚本的用法语法如下:

1
download-frozen-image-v2.sh target_dir image[:tag][@digest] ...

然后可以使用tardocker load导入图像:

1
tar -cC 'target_dir' . | docker load

为了验证脚本是否按预期工作,我从Docker Hub下载了一个Ubuntu映像并将其加载到Docker中:

1
2
3
4
user@host:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@host:~$ tar -cC 'ubuntu' . | docker load
user@host:~$ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

实际上,我必须首先将数据从Internet客户端(未安装Docker)复制到目标/目标计算机(已安装Docker):

1
2
3
user@nodocker:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@nodocker:~$ tar -C 'ubuntu' -cf 'ubuntu.tar' .
user@nodocker:~$ scp ubuntu.tar user@hasdocker:~

然后加载并使用目标主机上的图像:

1
2
3
user@hasdocker:~ docker load ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#


首先,检查Docker守护进程是否配置为使用代理。例如,对于boot2docker和docker machine,这是在docker machine create上完成的,使用--engine-env选项。

如果这只是一个证书问题(例如,火狐访问Docker Hub),请尝试安装该证书:

1
2
3
4
5
openssl s_client -connect index.docker.io:443 -showcerts /dev/null | openssl x509 -outform PEM > docker.pem
sudo cp docker.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
sudo systemctl restart docker
sudo docker run hello-world

另一个解决方法(不是推荐的解决方案)是访问Docker Hub,而不依赖于--insecure-registry的证书:

如果防火墙主动阻止任何Docker拉,甚至无法从Firefox访问Docker Hub,那么您需要docker save/docker load一个图像存档。把它从你访问Docker Hub(以及Docker Pull成功的地方)的机器上保存下来。将它加载到您的公司计算机上(当然,在您的IT系统管理员批准之后)。

注意:您不能轻易地"只"下载一个图像,因为它通常基于您需要下载的其他图像之上。这就是docker pull为您所做的。这也是docker save所做的(创建一个包含所有必要图像的归档文件)。

手术室在评论中补充道:

[I] didn't get my corp image to work either.
But I found that I could download the Docker file and recreate the image my self from scratch.
This is essentially the same as downloading the image.


我修改了一个python脚本,使其具有操作系统独立解决方案:码头拖曳

这样使用它,它将创建一个tar归档文件,您可以使用docker load导入该文件:

1
2
3
python docker_pull.py hello-world
python docker_pull.py alpine:3.9
python docker_pull.py kalilinux/kali-linux-docker

如果您的公司防火墙(和策略)允许连接到远程ssh服务器,另一个可能是您的一个选项。在这种情况下,您可以简单地设置一个ssh隧道,通过它来隧道任何到Docker注册表的流量。


因此,根据定义,docker pull client命令实际上需要与docker守护进程通信,因为docker守护进程为您逐个组装层。

把它想象成一个post请求——它在docker守护进程本身中导致了状态的突变。当您进行拉操作时,不会通过HTTP"拉"任何东西。

您可以从Docker注册表中提取所有单独的层,但实际上这与pull的语义不同,因为pull是一个操作,专门告诉守护进程去获取您关心的图像的所有层。