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

trnvg8h3  于 2023-03-29  发布在  Docker
关注(0)|答案(9)|浏览(567)

有没有一种方法可以使用Firefox下载Docker镜像/容器,而不使用内置的docker-pull
我被公司的防火墙和代理服务器封锁了,我无法通过它。
我的问题是,我不能使用Docker来获取图像,也就是说,Docker保存/拉取和其他Docker提供的功能,因为它被防火墙阻止了。

oxiaedzo

oxiaedzo1#

只是一个替代方案-这是我在组织中为couchbase映像所做的,其中我被代理阻止。

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

~$ $ docker save couchbase > couchbase.tar
~$ ls -lh couchbase.tar
-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)

$ docker load < couchbase.tar.xz
1wnzp6jl

1wnzp6jl2#

我不得不自己处理这个问题-从一台可以访问互联网但没有Docker客户端的受限机器上下载镜像,以便在另一台可以访问互联网但没有Docker客户端的受限机器上使用。我将我的问题发布到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 -i ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#
svgewumm

svgewumm3#

我改编了一个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
3pvhb19x

3pvhb19x4#

使用Skopeo。这是一个专门为这个(和其他)目的而设计的工具。
安装后,只需执行:

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

复制这些文件并按您喜欢的方式导入。

c9qzyr3d

c9qzyr3d5#

首先,检查您的Docker守护进程是否配置为使用代理。使用boot 2docker和docker-machine,例如this is done on docker-machine create,带有--engine-env选项。
如果这只是一个证书问题(即Firefox确实访问了Docker Hub),请尝试安装该证书:

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 pull,以至于您甚至无法从Firefox访问Docker Hub,那么您需要docker save / docker load镜像存档。从您访问Docker Hub的机器(以及Docker pull成功的机器)保存它。将其加载到您的公司机器上(当然,在您的IT系统管理员批准之后)。
注意:你不能轻易地“只”下载一个映像,因为它通常是基于你也需要下载的其他映像之上的。这是docker pull为你做的。这也是docker save做的(创建一个由 * 所有 * 必要映像组成的归档)。
OP Ephreal在评论中补充道:
[I]我也没有让我的公司镜像工作。但是我发现我可以下载Docker文件并从头开始重新创建镜像。这本质上与下载镜像相同。

k10s72fa

k10s72fa6#

因此,根据定义,Docker pull client命令实际上需要与Docker守护进程对话,因为Docker守护进程会为您逐个组装层。
把它想象成一个POST请求--它在Docker守护进程本身中引起状态的变化。当你执行拉操作时,你并不是在HTTP上“拉”任何东西。
你可以通过REST从Docker注册表中拉取所有单独的层,但这实际上与拉取的语义不同,因为拉取是一个专门告诉守护进程去获取你所关心的映像的所有层的操作。

t1rydlwq

t1rydlwq7#

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

8yoxcaq7

8yoxcaq78#

我最初问题的答案和解决方案是,我发现我可以下载Docker文件和所有必要的支持文件,并从头开始重新创建镜像。这与下载镜像基本相同。
这个解决方案已经在上面的问题和评论中,我只是把它钉在这里。
这对我来说已经不是问题了,因为我的公司已经改变了政策,允许docker pull命令工作。

hsvhsicv

hsvhsicv9#

谢谢@Ham Co的回答,
我采用了一个golang工具来实现一个独立于操作系统的解决方案:
golang http pull docker image

./gopull download redis

获取docker可导入的归档文件redis.tar
参考文献:
https://github.com/NotGlop/docker-drag

相关问题