编程笔记

lifelong learning & practice makes perfect

译|将 Docker 镜像推送到远程主机

今天我需要将一些 Docker 镜像发送到远程服务器,但我懒得推送到像 Docker Hub 这样的注册中心。那需要我登录两次:一次在我的笔记本电脑上,一次在远程服务器上,这太麻烦了。我可以 SSH 进入服务器,为什么不直接发送镜像呢?

我们可以使用命令 docker image save my_image:foo 将镜像保存为 tarball。这会将 tarball 转储到终端,或者我们可以使用 --output my_image.tar 标志将输出保存到文件中。注意:此 tarball 未压缩。例如,您可以使用 gzip 压缩:docker image save my_image:foo | gzip > my_image.tar.gz

Docker 也可以做相反的事情:从 tarball 加载镜像。该命令是 docker image load。此命令需要来自 stdin 的 tarball,但我们也可以指定要从中读取的文件:docker image load --input my_image.tar

由于这两个命令使用相同的数据格式,我们可以将它们与管道结合起来:docker image save my_image:foo | docker image load,从而避免中间文件。

这里有一个小技巧:我们可以使用 SSH 在两个命令“之间”,就像一个网络管道,将 docker image save 的输出从我的笔记本电脑发送到远程服务器中 docker image load 的输入:

1
2
3
4
5
6
$ docker image save hello-world:latest | ssh user@server.com docker image load
Getting image source signatures
Copying blob sha256:63a41026379f4391a306242eb0b9f26dc3550d863b7fdbb97d899f6eb89efe72
Copying config sha256:74cc54e27dc41bb10dc4b2226072d469509f2f22f1a3ce74f4a59661a1d44602
Writing manifest to image destination
Loaded image: docker.io/library/hello-world:latest

我们也可以做相反的事情:从远程服务器获取镜像。该命令只是交换了 SSH 的位置:ssh user@server.com docker image save hello-world:latest | docker image load

我之前提到过导出的 tarball 未压缩。您可以使用 gzipxz 压缩它们,它们可以正常工作。如果还在目标计算机上运行“解压缩器”,您也可以使用其他压缩格式,例如:docker image save foo | bzip2 | ssh user@host 'bunzip2 | docker image load'

这里我假设您可以访问 Docker,要么是 root 用户或 root 等效用户(如果您的用户在 docker 组中,则很危险),要么以 rootless 模式运行 Docker(尽管从未见过有人这样做)。

好消息是:Podman 具有相同的命令,并且它们的工作方式相同 :) 所以:

  • podman image save IMAGE | ssh user@server.com podman image load
  • podman image save IMAGE | gzip | ssh user@server.com podman image load
  • ssh user@server.com podman image save IMAGE | podman image load
  • ssh user@server.com 'podman image save IMAGE | gzip' | podman image load

我们还可以使用这种 save | load 方法将镜像从同一台机器上的 Docker 发送到 Podman。我的笔记本电脑上有 rootfull Docker 和 [rootless] Podman,它们不共享镜像。Docker 拥有的镜像在 Podman 中不可用。但我可以将一个镜像从一个发送到另一个:podman image save IMAGE | sudo docker image load,现在 Podman 和 Docker 具有相同的镜像。

原文

欢迎关注我的其它发布渠道

Gitalking ...