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

时间:2016-06-19 09:29:30

标签: docker docker-registry

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

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

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

8 个答案:

答案 0 :(得分:23)

只是另一种选择 - 这就是我在我的组织中为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

参考

答案 1 :(得分:10)

我不得不自己处理这个问题 - 从具有Internet访问权限的受限制机器下载图像,但没有Docker客户端用于使用Docker客户端的另一台受限制机器,但没有Internet访问权限。我将问题发布到DevOps Stack Exchange site

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

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

脚本的用法语法如下:

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 :(得分: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系统管理员批准后)。

注意:你不能轻易地&#34;只是&#34;下载图像,因为它通常基于您需要下载的其他图像。这就是docker pull为你做的事情。这就是docker save所做的事情(创建一个由 all 组成的必要图像的档案)。

OP Ephreal添加in the comments

  

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

答案 3 :(得分:1)

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

这个解决方案已经存在于上面的问题和评论中,我只是将其固定在这里。

尽管这对我来说不再是一个问题,因为我的公司已更改政策并允许docker pull命令正常工作。

答案 4 :(得分:0)

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

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

你可以从Docker注册表中通过REST获取所有单独的层,但这实际上与pull不同,因为pull是一个专门告诉守护进程去获取所有层的动作。你关心的形象。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我改编了一个python脚本以拥有一个与操作系统无关的解决方案: react-native-simple-dialogs

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

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

答案 7 :(得分:0)

使用Skopeo。这是专门用于(和其他)目的的工具。

安装后,只需执行:

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

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