如何在不使用 pull 命令的情况下下载 Docker 个图像?
How do I download Docker images without using the pull command?
有什么方法可以让我下载 Docker image/container,例如使用 Firefox 而不是使用内置 docker-pull
.
我被公司防火墙和代理挡住了,钻不进去
我的问题是我无法使用 Docker 获取图像,即 Docker save/pull 和其他 Docker 提供的功能,因为它被防火墙阻止了.
首先,检查您的 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 Hub 的机器(以及 docker 拉取成功的地方)保存它。将其加载到您的公司计算机上(当然,在您的 IT 系统管理员批准之后)。
注意:您不能轻易地 "just" 下载图像,因为它通常基于您也需要下载的其他图像之上。这就是 docker pull
为您所做的。这也是 docker save
所做的(创建一个由 所有 必要图像组成的档案)。
OP Ephreal adds :
[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.
只是一个替代方案 - 这就是我在我的组织中为 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 打开了 :)
在我的工作笔记本电脑上(美分OS 7)
$ docker load < couchbase.tar.xz
参考资料
我不得不自己处理这个问题 - 从具有 Internet 访问权限但没有 Docker 客户端的受限计算机下载图像以在具有 Docker 客户端的另一台受限计算机上使用,但不能上网。我将我的问题发布到 DevOps Stack Exchange site:
在 Docker 社区的帮助下,我找到了解决问题的方法。以下是我的解决方案。
原来Moby Project has a shell script on the Moby GitHub account which can download images from Docker Hub格式可以导入Docker:
脚本的使用语法如下:
download-frozen-image-v2.sh target_dir image[:tag][@digest] ...
然后可以使用 tar
和 docker 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)复制到 target/destination 机器( 安装了 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:/#
因此,根据定义,Docker 拉客户端命令实际上需要与 Docker 守护进程对话,因为 Docker 守护进程为您一层一层地组装。
将其视为 POST 请求 - 它在 Docker 守护程序本身中引起状态突变。当您进行拉取时,您不会 'pulling' 通过 HTTP 进行任何操作。
您可以从 Docker 注册表中通过 REST 拉取所有单独的层,但这实际上与拉取的语义不同,因为拉取是一个专门告诉守护进程去和获取您关心的图像的所有图层。
如果您的公司防火墙(和策略)允许连接到远程 SSH 服务器,则另一种可能是您的选择。在这种情况下,您可以简单地设置一个 SSH 隧道,通过它隧道任何流量到 Docker 注册表。
我改编了一个 python 脚本以获得 OS 独立解决方案:
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
我最初问题的答案和解决方案是我发现我可以下载 Docker 文件和所有必要的支持文件并从头开始重新创建我自己的图像。这和下载图片本质上是一样的。
这个解决方案在上面的问题和评论里都有,我就贴在这里了。
虽然这对我来说不再是问题,因为我的公司已经改变了政策并允许 docker 拉命令工作。
使用Skopeo。它是专门为此(和其他)目的而制作的工具。
安装后只需执行:
mkdir ubuntu
skopeo --insecure-policy copy docker://ubuntu ./ubuntu
复制这些文件并根据需要导入。
有什么方法可以让我下载 Docker image/container,例如使用 Firefox 而不是使用内置 docker-pull
.
我被公司防火墙和代理挡住了,钻不进去
我的问题是我无法使用 Docker 获取图像,即 Docker save/pull 和其他 Docker 提供的功能,因为它被防火墙阻止了.
首先,检查您的 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,那么您需要
注意:您不能轻易地 "just" 下载图像,因为它通常基于您也需要下载的其他图像之上。这就是 docker pull
为您所做的。这也是 docker save
所做的(创建一个由 所有 必要图像组成的档案)。
OP Ephreal adds
[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.
只是一个替代方案 - 这就是我在我的组织中为 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 打开了 :)
在我的工作笔记本电脑上(美分OS 7)
$ docker load < couchbase.tar.xz
参考资料
我不得不自己处理这个问题 - 从具有 Internet 访问权限但没有 Docker 客户端的受限计算机下载图像以在具有 Docker 客户端的另一台受限计算机上使用,但不能上网。我将我的问题发布到 DevOps Stack Exchange site:
在 Docker 社区的帮助下,我找到了解决问题的方法。以下是我的解决方案。
原来Moby Project has a shell script on the Moby GitHub account which can download images from Docker Hub格式可以导入Docker:
脚本的使用语法如下:
download-frozen-image-v2.sh target_dir image[:tag][@digest] ...
然后可以使用 tar
和 docker 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)复制到 target/destination 机器( 安装了 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:/#
因此,根据定义,Docker 拉客户端命令实际上需要与 Docker 守护进程对话,因为 Docker 守护进程为您一层一层地组装。
将其视为 POST 请求 - 它在 Docker 守护程序本身中引起状态突变。当您进行拉取时,您不会 'pulling' 通过 HTTP 进行任何操作。
您可以从 Docker 注册表中通过 REST 拉取所有单独的层,但这实际上与拉取的语义不同,因为拉取是一个专门告诉守护进程去和获取您关心的图像的所有图层。
如果您的公司防火墙(和策略)允许连接到远程 SSH 服务器,则另一种可能是您的选择。在这种情况下,您可以简单地设置一个 SSH 隧道,通过它隧道任何流量到 Docker 注册表。
我改编了一个 python 脚本以获得 OS 独立解决方案: 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
我最初问题的答案和解决方案是我发现我可以下载 Docker 文件和所有必要的支持文件并从头开始重新创建我自己的图像。这和下载图片本质上是一样的。
这个解决方案在上面的问题和评论里都有,我就贴在这里了。
虽然这对我来说不再是问题,因为我的公司已经改变了政策并允许 docker 拉命令工作。
使用Skopeo。它是专门为此(和其他)目的而制作的工具。
安装后只需执行:
mkdir ubuntu
skopeo --insecure-policy copy docker://ubuntu ./ubuntu
复制这些文件并根据需要导入。