article_image

在实际开发和运维过程中,Docker 镜像的拉取有时会因为网络问题或者镜像源的限制变得困难。

再加上最近 Docker 的国内镜像源被下线,导致在国内拉取 Docker 镜像变得越来越困难。尤其是在一些受限网络环境中,拉取 Docker 镜像可能会变得非常耗时甚至不可能。再加上生产环境一般不会配置网络方面的额外代理。

就我自己的使用场景而言,在 NAS 中直接拉取 Docker 镜像的功能几乎已经用不了了。所以我需要找一个方法,尽可能简便的解决这一问题。

根本 pull 不下来

本文将介绍如何在本地电脑上拉取 gitea/act_runner 镜像并导出为 tar 文件,然后将其离线转移到另一个系统上进行加载。

在本地电脑上拉取镜像

首先你需要在个人电脑上安装 Docker,最简单的方法就是去 docker 的官网,下载图形化的 Docker Desktop 进行安装。

🔗 下载 Docker Desktop

1. 拉取指定架构的镜像

我们先讨论最常见的情况,如果你在 x86 的 Windows 电脑上操作,并且这个镜像也会用在 x86 的服务器、NAS 上,你可以省略指定架构的参数,直接拉取镜像:

docker pull gitea/act_runner

但是这里会遇到第一个问题,如果你在 M 芯片的 Mac 电脑上拉取,再继续后面的步骤会出现报错。

这是因为当我们直接使用 docker pull 命令的时候,是 docker 自动判断了当前设备的架构进行对应的镜像拉取的。

因为一般来说,服务器都是 x86 架构的。而个人电脑可能会分为 x86 架构(Windows 电脑)和 ARM 架构(M 芯片的 Mac 电脑)。一旦本地环境的架构和生产环境的架构有不同,就需要手动指定架构了。其实也很简单。

如果你在 M 芯片的 Mac 上操作,就需要拉取指定架构的镜像。通过以下命令可以指定为 linux/amd64 架构:

docker pull --platform linux/amd64 gitea/act_runner

同理,如果你想在 Windows 电脑上拉取镜像,跑在 Mac 电脑上(虽然很少见),你得根据 Mac 电脑的 ARM 架构,指定为 linux/arm64 架构:

docker pull --platform linux/arm64 gitea/act_runner

提示:如果你不确定到底是什么架构的,可以去网上搜索对应设备的型号,找到 CPU,再搜索该 CPU 的架构(可以直接询问 AI)。

参考链接:如何查找 Synology NAS 的 CPU 型号? - Synology 知识中心

让 AI 告诉你架构

2. 导出镜像为 tar 文件

接下来的步骤就容易多了。

拉取完镜像后,我们可以使用 docker save 命令将镜像导出为一个 tar 文件,便于传输和备份:

docker save -o gitea_act_runner.tar gitea/act_runner

这样就可以在运行这行命令的目录下,找到 gitea_act_runner.tar 这个压缩包文件。

将 tar 文件转移到服务器

导出后的 tar 文件可以通过任意文件传输工具或方法转移到服务器,例如 scp, rsync, U 盘等。这里我们以 scp 为例,将 tar 文件传输到服务器:

scp gitea_act_runner.tar user@192.168.1.100:/path/to/destination

在服务器上导入镜像

在服务器上,我们需要使用 docker load 命令来加载 tar 文件,从而恢复出原先的 Docker 镜像:

docker load -i /path/to/destination/gitea_act_runner.tar

通过以上步骤,就可以成功地将 gitea/act_runner 镜像从一个系统转移到另一个系统,并确保它是 linux/amd64 架构的版本。

在群晖 NAS 上导入镜像

在群晖 NAS 上更为简单,转移和导入都可以通过图形化界面完成。

你只需要在 Container Manager 中,打开“映像”,进行“操作 - 导入 -从文件添加 - 从本地设备”,然后选择你刚刚打包好的 tar 文件即可。

导入镜像

快速笔记

由于这个操作会经常遇到,我总结了一份 Cheat Sheet,你可以把下面这段内容保存下来,以便未来快速使用。

在个人电脑上

# 拉取指定架构的镜像
docker pull --platform linux/amd64 【镜像名称】

# 导出镜像为 tar 文件
docker save -o package.tar 【镜像名称】

文件传输

使用 scp 将文件传输到目标系统(假设目标系统 IP 为 192.168.1.100):

scp package.tar user@192.168.1.100:/path/to/destination

在目标系统上

# 加载镜像
docker load -i /path/to/destination/package.tar

按照这些步骤,就可以成功地将 Docker 镜像离线转移到其他系统。


author_avatar

#UNTAG Developer