在实际开发和运维过程中,Docker 镜像的拉取有时会因为网络问题或者镜像源的限制变得困难。
再加上最近 Docker 的国内镜像源被下线,导致在国内拉取 Docker 镜像变得越来越困难。尤其是在一些受限网络环境中,拉取 Docker 镜像可能会变得非常耗时甚至不可能。再加上生产环境一般不会配置网络方面的额外代理。
就我自己的使用场景而言,在 NAS 中直接拉取 Docker 镜像的功能几乎已经用不了了。所以我需要找一个方法,尽可能简便的解决这一问题。
本文将介绍如何在本地电脑上拉取 gitea/act_runner
镜像并导出为 tar 文件,然后将其离线转移到另一个系统上进行加载。
在本地电脑上拉取镜像
首先你需要在个人电脑上安装 Docker,最简单的方法就是去 docker 的官网,下载图形化的 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 知识中心
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 镜像离线转移到其他系统。