使用containerD手动加载容器镜像
最近,我需要手动将一些容器映像加载到作为容器运行时运行containerd(而不是Docker)的Linux系统中。我说“手动加载一些镜像”是因为该系统与Internet隔离,因此仅运行容器并containerd自动从镜像注册表中提取镜像是行不通的。解决缺少Internet访问的过程并不困难,但似乎没有任何文档可以证明,而我可以使用常规Web搜索轻松找到该文档。我认为在此处发布它可能会帮助将来寻求
最近,我需要手动将一些容器映像加载到作为容器运行时运行containerd(而不是Docker)的Linux系统中。我说“手动加载一些镜像”是因为该系统与Internet隔离,因此仅运行容器并containerd自动从镜像注册表中提取镜像是行不通的。解决缺少Internet访问的过程并不困难,但似乎没有任何文档可以证明,而我可以使用常规Web搜索轻松找到该文档。我认为在此处发布它可能会帮助将来寻求此信息的个人。
对于具有管理员/操作意识的用户,进行交互的主要方式containerd是通过ctr命令行工具。该工具使用与Docker非常相似的命令语法,因此熟悉Docker的用户应该能够ctr轻松高效地工作。
在我的特定示例中,我有一个可以访问Internet的堡垒主机,而在该堡垒后面的几个主机没有Internet访问。堡垒背后的主机需要预先加载容器镜像。因此,我使用该ctr工具在堡垒上获取和准备镜像,然后将镜像传输到隔离的系统中并加载它们。这是我遵循的过程:
- 在堡垒主机上,首先我使用来从公共注册表下载(拉出)映像ctr image pull(我将在此使用的示例是Calico节点容器映像,由Kubernetes集群中的Calico CNI使用):
ctr image pull docker.io/calico/node:v3.11.2
(请注意,sudo所有这些ctr命令可能都需要;这取决于您的系统配置。)
对于隔离系统也需要的所有其他镜像,我重复了此过程。
如果您有一个运行Docker的系统(例如本地笔记本电脑),则可以docker pull在此处使用;请注意,您可能需要调整镜像/镜像注册表的路径/URL。
- 仍然在堡垒主机上,我将提取的镜像导出到独立的存档中:
ctr image export calico-node-v3.11.2.tar \
docker.io/calico/node:v3.11.2
该命令的一般格式如下:
ctr image export <output-filename> <image-name>
如果您不知道镜像名称(根据containerd),请使用ctr image ls。
如果您正在使用安装了Docker的系统(也许您正在使用本地笔记本电脑),那么docker save <image-name> -o <output-filename>
将为您提供一个镜像,您可以在后续步骤中使用该镜像。
- 将独立的归档文件传输到其他系统后(使用您喜欢的任何方式;我使用scp),然后containerd使用以下命令将镜像加载(或导入)到其中:
ctr image import <filename-from-previous-step>
根据需要重复其他镜像。顺便说一句,看来在ctr image import
命令中使用通配符是行不通的。我必须手动指定每个要导入的文件。
如果您需要这些镜像可用于Kubernetes,则必须确保将-n=k8s.io标志添加到ctr image import命令中,如下所示:
ctr -n=k8s.io images import <filename-from-previous-step>
- 确认镜像(一个或多个)都存在,并通过识别containerd使用ctr image ls。
如果k8s.io在上一步中导入镜像时指定了名称空间(以便使镜像可供Kubernetes使用),则可以验证CRI(容器运行时接口,Kubernetes与之通信的方式containerd)通过crictl images再次运行来查看这些镜像。,sudo根据您的配置可能是必需的)。
那应该为您做!
我如何测试
为了测试此过程,我在AWS上使用了多个Ubuntu 18.04实例。一个实例可以访问互联网(堡垒主机);其他人没有。实例是使用Packer和Ansible通过AMI以及Kubernetes “镜像构建器”存储库中的剧本(特别是用于构建Kubernetes Cluster API镜像的剧本)构建的,因此containerd本文中提到的所有其他CLI工具都是已经安装并可供使用。
其他资源
我确实containerd在搜索时找到了一些网站,并提供了一些信息,并希望将它们包括在此处以表示感谢和其他上下文:
希望本文中的信息对您有所帮助。如果您有任何问题,意见,建议或更正,欢迎您在Twitter上与我联系,或给我发送电子邮件(我的电子邮件地址不太难找到)。
更新:我在上面的步骤1和步骤2中添加了一些Docker命令,供可能正在使用Docker支持的系统(例如本地笔记本电脑)的用户从Internet检索镜像,这些镜像将被传输到支持containerdPowered的系统用于导入。
更多推荐
所有评论(0)