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

问题描述 投票:24回答:6

有没有办法我可以使用Firefox下载Docker镜像/容器,而不使用内置的docker-pull

我被公司的防火墙和代理阻止了,我无法通过它来解决问题。

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

docker docker-registry
6个回答
27
投票

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

On my personal laptop (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开放了:)

On my work laptop (CentOS 7)

$ docker load < couchbase.tar.xz

参考


12
投票

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

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


所以事实证明Moby ProjectMoby GitHub account上有一个shell脚本,它可以从Docker Hub下载图像,格式可以导入Docker:

脚本的用法语法如下:

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 ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

2
投票

首先,检查您的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文件并从头开始重新创建我自己的图像。这与下载图像基本相同。


1
投票

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

将其视为POST请求 - 它会导致Docker守护程序本身发生状态变化。当你进行拉动时,你不会通过HTTP“拉”任何东西。

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


1
投票

我改编了一个python脚本,用于独立于操作系统的解决方案:qazxsw poi

像这样使用它,它将创建一个TAR存档,您可以使用docker-drag导入:

docker load

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.