Colima快速起步
安装
备注
colima 支持两种 容器运行时(Container Runtimes) :
Docker : 通过
colima start
启动如果没有带运行时
参数,则默认等同于colima start docker
,此时要求系统已经通过brew install docker
安装过 Docker Desktop ,否则报错`containerd运行时(runtime) : 通过
colima start containerd
启动则会通过 Lima: Linux Machines 运行一个 Ubuntu Linux 虚拟机来运行 containerd运行时(runtime)
通过 Homebrew 安装
colima
:
可以看到同时依赖安装了如下组件:
capstone, dtc, libslirp, libssh, libusb, vde, qemu and lima
备注
QEMU 目前(2025年)官方最新版本 qemu-10
仅支持macOS 14和15,在旧版本 macOS Big Sur上无法完成安装。我最终折腾很久才完成 Homebrew安装旧版本qemu 部署。
旧版macOS Big Sur不支持 vz
类型,所以必须安装 QEMU ,而且旧版homebrew不会自动以来安装qemu,需要单独完成 Homebrew安装旧版本qemu 部署。
根据安装提示,使用如下命令启动
colima
服务:
备注
brew services start colima
是在后台作为服务自动启动Colima,如果要在前台运行,可以直接使用 colima start
命令,例如:
colima
服务colima start --foreground
使用
colima start
是启动一个 容器运行时(Container Runtimes) 的Linux虚拟机,不带任何参数就默认使用 Docker ,此时要求系统已经 Homebrew 安装过 Docker Desktop我为了能够适应当前 Kubernetes 的只部署 containerd运行时(runtime) 运行时,没有完整的 Docker 组件,所以我使用的启动命令是:
colima start
指定 containerd运行时(runtime) 作为运行时colima start --runtime containerd
此时输出显示 Lima: Linux Machines 启动一个 Ubuntu Linux ARM 版本虚拟机(因为我是在ARM架构的 Apple ARM架构芯片M1 Pro Macbook Pro上):
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代码,如果 一切顺利 ... ,显然对于墙内用户是有点折腾的。
colima start
选项
运行 colima start help
命令可以看到,这个运行命令实际上有很多参数,提供了不同运行模式:
4c8g规格案例
我在 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 stop
colima start
2c4g规格案例
我在 MacBook Pro 15" Late 2013 上使用的是旧版本macOS Big Sur,也就是macOS 11,这种低版本intel架构macOS提示不支持
--vm-type=vz
,所以实际上是以 QEMU 方式运行
qemu
模式虚拟化的 2c4g
虚拟机运行 colima
# 如果macOS v14/15 ,支持Apple Virtualization,建议使用 vz (性能更好)
# colima start --runtime containerd --cpu 2 --memory 4 --vm-type=vz
# 不支持 --vm-type=vz 则是通过qemu运行
# 注意: 如果要支持代理,需要登陆到Colima虚拟机中安装docker服务并完成配置: https://cloud-atlas.readthedocs.io/zh-cn/latest/docker/colima/colima_proxy.html
colima start --runtime containerd --cpu 2 --memory 4
# 如果不指定runtime,会要求在macOS上 'brew install docker' ,我没有使用这个方法
# colima start --cpu 2 --memory 4
备注
根据 Lima: Linux Machines 官方文档 Lima VM types 说明, VZ
选项( Apple Virtualization )需要 macOS >= 13.0
(Lima >= 0.14)
多个docker虚拟机运行案例
如果没有指定 -p
或 --profile
指定配置名,那么会使用 default
作为实例的名字,也即是上文启动命令启动的名为 default
虚拟机。如果需要启动多个docker虚拟机,则需要通过参数完成:
-p, --profile string profile name, for multiple instances (default "default")
以下是启动一个名为 test
的 Colima 虚拟机(登陆到这个虚拟机内部则会看到虚拟机主机名是 colima-test
):
test
的虚拟机实例colima start --runtime containerd --cpu 2 --memory 4 --profile test
对应登陆这个虚拟机的时候也需要使用 -p
或 --profile
指定配置名:
test
的虚拟机实例colima ssh -p test
colima ssh
执行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
按照提示输入系统管理员用户密码后, 就会安装一个脚本文件 /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) 进行交互。当然,即使不执行 colima nerdctl install
其实也可以和Colima虚拟机中的 containerd运行时(runtime) 交互,就是一直使用 colima nerdctl
,安装的好处是方便了在Host主机上操作(简化了命令关键字)。
使用
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 start
或colima stop
就会读取这个配置文件启动或停止虚拟机,可以修改这个配置来更改虚拟机的设置
colima.yaml
colima.yaml
提供了很多创建虚拟机的配置,并且提供了详细的注释,所以只要简单浏览一下就能够了解如何调整配置。以下是一些有用的配置
运行容器案例
通过 Docker 镜像 定义,使用相同的方法,可以运行起不同的工作环境
异常和解决
lima
虚拟机文件和本地文件
警告
这段错误应该是我自己搞错环境导致的,我现在回想起来当时自己定义了 Colima存储管理 ,没有默认挂载当前用户的 $HOME
目录,导致Colima虚拟机内部路径和Host主机不一致。如果没有修改默认存储挂在,或者确保定制存储挂载依然包含用户的 $HOME
目录,就不会有这个问题。
使用 containerd
作为 containerd(容器运行时) ,我在执行 Gentoo镜像 :
nerdctl build
构建基础Gentoo镜像Dockerfilenerdctl 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 上工作时再解决