How do I download Docker images without using the pull command?
有没有一种方法可以下载Docker图像/容器,例如使用火狐,而不使用内置的
我被公司防火墙和代理阻止了,我无法从中钻一个洞。
我的问题是我不能使用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] ... |
然后可以使用
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上完成的,使用
如果这只是一个证书问题(例如,火狐访问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,而不依赖于
如果防火墙主动阻止任何Docker拉,甚至无法从Firefox访问Docker Hub,那么您需要
注意:您不能轻易地"只"下载一个图像,因为它通常基于您需要下载的其他图像之上。这就是
手术室在评论中补充道:
[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归档文件,您可以使用
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是一个操作,专门告诉守护进程去获取您关心的图像的所有层。