Colima快速起步

安装

备注

colima 支持两种 容器运行时(Container Runtimes) :

macOS 平台安装colima
brew install colima

可以看到同时依赖安装了如下组件:

capstone, dtc, libslirp, libssh, libusb, vde, qemu and lima
  • 根据安装提示,使用如下命令启动 colima 服务:

macOS 平台通过 brew services 命令启动 colima 服务
brew services start colima

备注

brew services start colima 是在后台作为服务自动启动Colima,如果要在前台运行,可以直接使用 colima start 命令,例如:

前台运行 colima 服务
colima start --foreground

使用

使用 colima start 指定 containerd运行时(runtime) 作为运行时
colima start --runtime containerd

此时输出显示 Lima: Linux Machines 启动一个 Ubuntu Linux ARM Atlas 版本虚拟机(因为我是在ARM架构的 Apple ARM架构芯片M1 Pro Macbook Pro上):

输出显示启动ARM版本的 Ubuntu Linux
INFO[0000] starting colima
INFO[0000] runtime: containerd
INFO[0002] starting ...                                  context=vm
> Using the existing instance "colima"
> Starting the instance "colima" with VM driver "qemu"
> QEMU binary "/opt/homebrew/bin/qemu-system-aarch64" seems properly signed with the "com.apple.security.hypervisor" entitlement
> "Attempting to download the image" arch=aarch64 digest="sha512:bbfd97c7aa9dc0f240cbe09f75f98eb19812ce5da1536e4bca2044c0528fd409b3c8f2c3ba85e54707544e3c6619d585504b3eca7ba8b3f3fbaba141cec0181c" location="https://github.com/abiosoft/colima-core/releases/download/v0.6.7/ubuntu-23.10-minimal-cloudimg-arm64.qcow2"
> [hostagent] Attempting to download UEFI code https://gitlab.com/kraxel/qemu/-/> [hostagent] Downloading UEFI code https://gitlab.com/kraxel/qemu/-/raw/704f7ca> [hostagent] 770.81 KiB / 1.51 MiB (49.71%) ? p/s
> [hostagent] 1.51 MiB / 1.51 MiB (100.00%) 376.33 KiB/s
> [hostagent] decompressing .bz2 with [bzip2 -d]
> [hostagent] Decompressing data
INFO[0371] provisioning ...                              context=containerd
INFO[0371] starting ...                                  context=containerd
INFO[0373] done

此时会从GitHub上下载对应架构的虚拟机镜像以及UEFI代码,如果 一切顺利 ... ,显然对于墙内用户是有点折腾的。

备注

这里有一个麻烦是GFW对GitHub访问干扰非常严重,往往难以完成下载。我的解决方法是:

colima start 选项

运行 colima start help 命令可以看到,这个运行命令实际上有很多参数,提供了不同运行模式:

  • 我在 MacBook Pro 2018 上构建一个使用 vz 模式的 4c8g 虚拟机运行 colima :

使用 vz 模式虚拟化的 4c8g 虚拟机运行 colima
colima start --runtime containerd --cpu 4 --memory 8 --vm-type=vz
  • 启动后检查运行的虚拟机:

执行 colima list 可以看到运行的虚拟机
colima list

显示刚才启动的 4c8g 虚拟机:

显示 4c8g 虚拟机
PROFILE    STATUS     ARCH      CPUS    MEMORY    DISK     RUNTIME       ADDRESS
default    Running    x86_64    4       8GiB      60GiB    containerd
  • 如果需要修订 Colima存储管理 ,则配置修订后需要重启 colima 虚拟机:

重启 colima 虚拟机
colima stop
colima start

colima ssh

执行SSH可以登陆到 colima 虚拟机内部:

通过SSH登陆到colima虚拟机内部
colima ssh

清理colima

如果不再需要 colima ,可以 delete 掉虚拟机:

执行 colima delete 删除不需要的colima虚拟机(所有数据丢失!!!)
colima delete

此时会提示信息警告,确认 y 之后删除:

执行 colima delete 删除提示警告数据完全删除
are you sure you want to delete colima and all settings? [y/N] y
INFO[0004] deleting colima                              
INFO[0004] deleting ...                                  context=containerd
INFO[0006] done

这个删除会清理掉用户 ~/.colima/ 目录下对应的虚拟机配置以及该目录下 ssh_config 证书配置。当再次创建colima会重新生成配置

colima nerdctl

既然我安装的是 containerd运行时(runtime) 运行时,那么就需要配套的 nerdctl 交互。通过以下方式安装 nerdctl alias (实际上是一行脚本) 到 $PATH 就可以使用 colima nerdctl 子命令进行交互( 非常类似 Kubectl插件 ),也可以直接使用 nerdctl

通过 colima install 安装 nerdctl
colima nerdctl install

按照提示输入系统管理员用户密码后,就会安装一个脚本文件 /usr/local/bin/nerdctl ,这个脚本非常简单,就是 colima nerdctl 的一个包装:

/usr/local/bin/nerdctl
#!/usr/bin/env sh

/opt/homebrew/bin/colima nerdctl --profile default -- "$@"

这样我们就既可以使用 colima nerdctl 也可以直接使用 nerdctl 来和系统中安装运行在虚拟机中的 containerd运行时(runtime) 进行交互

  • 使用 nerdctl 检查:

nerdctl 检查
nerdctl ps

此时,还没有任何运行容器,所以显示是空的

nerdctl 检查此时还没有容器运行
CONTAINER ID    IMAGE                             COMMAND        CREATED          STATUS    PORTS    NAMES

接下来使用方法和 Docker Desktop 相同,可以使用 nerdctl 来实现镜像的拉取、容器运行等操作

Colima配置概述

Colima的配置可以通过 $COLIMA_HOME 设置特定的配置文件位置,否则默认就是 $HOME/.colima

$HOME/.colima 目录下你可以找到

  • ssh_config 配置文件,这个配置文件指定了如何登陆到 colima 虚拟机内部进行维护

  • default 目录下保存了刚才我创建的虚拟机配置,

    • colima.yaml 就是创建虚拟机的配置,当再次执行 colima startcolima stop 就会读取这个配置文件启动或停止虚拟机,可以修改这个配置来更改虚拟机的设置

colima.yaml

colima.yaml 提供了很多创建虚拟机的配置,并且提供了详细的注释,所以只要简单浏览一下就能够了解如何调整配置。以下是一些有用的配置

运行容器案例

通过 Docker 镜像 定义,使用相同的方法,可以运行起不同的工作环境

异常和解决

lima 虚拟机文件和本地文件

使用 containerd 作为 containerd(容器运行时) ,我在执行 Gentoo镜像 :

采用 nerdctl build 构建基础Gentoo镜像Dockerfile
nerdctl build -t gentoo-base -f Dockerfile .

出现如下报错:

采用 nerdctl build 构建基础Gentoo镜像出现的报错显示 lima 虚拟机中缺少对应文件
bash: line 1: cd: /Users/huataihuang/docs/docker/gentoo_image/base: No such file or directory

原因是执行 nerdctl 是在 macOS 上,这个命令访问的运行 containerd(容器运行时) 位于 Lima: Linux Machines 虚拟机中,当虚拟机目录和本地 macOS 目录不是映射等同关系时,就会导致无法找到目录文件。

有没有办法将 macOS 本地目录映射到虚拟机内部呢?

备注

这个问题应该是 containerd 后端特有的,我以前使用 Docker Desktop 就不存在这个异常,说明 Docker Desktop 做了相应转换

暂无时间排查,我目前主要是在 Gentoo Docker 上完成,暂时绕过这个问题。等后面在 macOS 上工作时再解决

参考