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

Posted

技术标签:

【中文标题】如何在不使用 pull 命令的情况下下载 Docker 镜像?【英文标题】:How do I download Docker images without using the pull command? 【发布时间】:2016-10-20 17:16:39 【问题描述】:

有没有一种方法可以让我使用 Firefox 下载 Docker 映像/容器,而不是使用内置的 docker-pull

我被公司防火墙和代理阻止了,我无法通过它。

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

【问题讨论】:

你可以通过代理浏览互联网吗?如果可以,docker 支持代理服务器拉取图片。 我无法访问 docker hub。我得到一个 x509: 由未知机构签署的证书。我的公司正在使用 zScaler 作为中间人防火墙 @Ephreal 为什么将答案标记为不是解决方案的解决方案?应该有一个实际的解决方案。 docker内部基本上也只是对某种文件进行http下载。 How to copy docker images from one host to another without via repository?的可能重复 @erikbwork 我已将答案设置为解决方案,因为它指的是添加到答案底部的我自己的解决方案。另外关于另一个问题的重复性。它不适用,因为解决方案是使用我无法使用的 docker save 选项。 【参考方案1】:

首先,检查您的 Docker 守护程序是否配置为使用代理。使用 boot2docker 和 docker-machine,例如 this is done on docker-machine create,使用 --engine-env 选项。

如果这只是一个证书问题(即 Firefox 确实访问了 Docker Hub),try and install that certificate:

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

另一种解决方法(不是推荐的解决方案)would be to access Docker Hub without relying on certificate with --insecure-registry

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

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

OP Ephreal 加上in the comments:

[我] 也没有让我的公司形象工作。 但我发现我可以下载 Docker 文件并自己从头开始重新创建映像。 这与下载图像基本相同。

【讨论】:

所以我的问题的答案是否定的。 @Ephreal 我已编辑答案以添加证书安装。你能浏览hub.docker.com或index.docker.io(应该重定向到docker hub)吗? 我试过了,但 zscaler 是一个中间人。每笔交易都是通过它们完成的,我们只看到我们与它们的 TSL 连接。并且没有Firefox也无法访问互联网。我现在用 linux 的 corp 映像制作了自己的 vm,并在上面安装了 docker。我之前尝试的是通过 Windows 使用 docker,在这种情况下它使用自己的超薄 linux vm。 @Ephreal OK(Windows 确实使用了基于 TinyCore 的 boot2docker)。看起来 docker save/load 是你导入图像的方式。 @SergeyMorozov Добро пожаловать!【参考方案2】:

只是另一种选择 - 这是我在我的组织中为 couchbase 图像所做的事情,我被代理阻止了。

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

~$ $ 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

然后,我将压缩的 tar 球上传到 Dropbox 并下载到我的工作机器上。出于某种原因,Dropbox 已打开 :)

在我的工作笔记本电脑上 (CentOS 7)

$ docker load < couchbase.tar.xz

参考文献

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

【讨论】:

谢谢;不知道您可以将图像保存到 tar 球中。我会试试这个。 这是一种解决方法,不直接回答 OP 的问题 谢谢,这对我有用!请注意,您必须先使用 docker pull couchbase 拉取图像,然后再运行 docker save 命令(否则 docker save 将找不到参考图像) 这没有回答问题,具体是如何在不先执行docker pull 的情况下保存图像。据我所知,docker save 仅适用于本地图像。所以你必须先做一个拉动。【参考方案3】:

我只需要自己处理这个问题 - 从具有 Internet 访问权限但没有 Docker 客户端的受限机器下载图像,以便在具有 Docker 客户端但无法访问 Internet 的另一台受限机器上使用。我将我的问题发布到DevOps Stack Exchange site:

Downloading Docker Images from Docker Hub without using Docker

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


原来Moby Project 在Moby GitHub account 上有一个shell 脚本,可以从Docker Hub 以可以导入Docker 的格式下载图像:

download-frozen-image-v2.sh

脚本的使用语法如下:

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

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

tar -cC 'target_dir' . | docker load

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

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已安装):

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:~

然后在目标主机上加载并使用镜像:

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

【讨论】:

我可以下载 ubuntu:latest 但仅此而已!其他一切似乎都需要一个“摘要”键,但我不知道如何找到那个键。 (错误 401 未经授权) 我可以确认,只有 ubuntu 似乎可以工作。另外,我不得不更改脚本:registryBase='https://index.docker.io'.【参考方案4】:

因此,根据定义,Docker pull 客户端命令实际上需要与 Docker 守护进程对话,因为 Docker 守护进程会为您一层一层组装。

把它想象成一个 POST 请求——它会导致 Docker 守护进程本身的状态突变。进行拉取时,您并没有通过 HTTP '拉取'任何东西。

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我改编了一个 python 脚本以获得独立于操作系统的解决方案: docker-drag

这样使用它,它会创建一个 TAR 存档,您可以使用 docker load 导入该存档:

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

【讨论】:

有什么想法吗? ``` 70de4b41273e:拉取完成 [171] Traceback(最近一次调用最后):文件“docker_pull.py”,第 86 行,在 file.write(unzLayer.read()) 文件“/usr/lib/python2 .7/gzip.py”,第 261 行,在读取 self._read(readsize) 文件“/usr/lib/python2.7/gzip.py”,第 303 行,在 _read self._read_gzip_header() 文件“/usr/ lib/python2.7/gzip.py",第 197 行,在 _read_gzip_header 中引发 IOError,'不是压缩文件'``` 似乎该脚本已被弃用。我收到“不是压缩文件”错误 @StevenWernerCS 这是因为您的互联网连接速度太慢,因此令牌已过期。我将处理此类情况的重新身份验证。此外,该脚本未被弃用并且仍在工作,如果您有任何问题,请打开错误问题。我会解决的。【参考方案7】:

我最初的问题的答案和解决方案是,我发现我可以下载 Docker 文件和所有必要的支持文件,并从头开始重新创建自己的映像。这与下载图像基本相同。

这个解决方案已经在上面的问题和cmet中了,我这里只是固定了。

这对我来说不再是问题,因为我的公司已经更改了政策并允许 docker pull 命令工作。

【讨论】:

【参考方案8】:

使用Skopeo。它是专门为此(和其他)目的而设计的工具。

安装后直接执行:

mkdir ubuntu
skopeo --insecure-policy copy docker://ubuntu ./ubuntu

复制这些文件并根据需要导入。

【讨论】:

以上是关于如何在不使用 pull 命令的情况下下载 Docker 镜像?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不使用 ScrollView/ListView 的情况下使用 Pull to Refresh 吗?

如何在不推动我的情况下从GitHub中提取更改?

如何在不编译/安装软件包的情况下下载软件包?

如何在不下载文件的情况下查找放置在谷歌云存储中的 csv 文件中的记录数

Swift mac应用程序,在不知道路径的情况下运行终端命令(因此它会在$ PATH中的每个路径中查找?

如何在不使用 android studio 的情况下下载 android 模拟器