Colima + nerdctl 零基础教程:告别 Docker Desktop,拥抱轻量容器世界
本文以 MAC OS 为基础
引子
大家好,我是奕川说AI,欢迎关注,一起探讨 AI 技术。
今天这篇和 AI 关系不大,但是日常又非常有用的工具,Docker 工具。
前段时间,公司内部发邮件,通知所有安装 Docker Desktop 需要标注自己 Docker Desktop 的使用。因为 Docker Desktop 商业授权原因,不得不的规避,于是便开始找替代方案,最终确定使用 Colima 和 nerdctrl 的方案。
这篇教程就是介绍如何在 MacOS 使用 Colima 和 nerdctrl。
Colima 与 nerdctl 是什么?
Docker Desktop 虽然功能强大,其实大部分日常开发用不了那么多能力,而且资源占用较高,最关键的事商业许可政策对部分用户不够友好,而我们其实日常开发用的就是最基础的能力就行。
Colima 的出现,为我们提供了一个不错的替代方案。它基于 Lima 项目,通过启动一个轻量级的 Linux 虚拟机来运行容器,实现了自动文件共享和端口转发等功能,同时支持 Intel 和 M系列的Macs。
nerdctl 则是 containerd 的一个命令行客户端,它与 Docker CLI 的使用习惯高度兼容,让你几乎可以无缝切换。更重要的是,nerdctl 还支持 Docker Compose 语法,以及一些 containerd 的高级功能,例如延迟拉取(stargz)和运行加密镜像(ocicrypt)。
简单来说,Colima 负责提供底层的 Linux 虚拟机和容器运行时环境,而 nerdctl 则作为我们与容器交互的"瑞士军刀",让你在 macOS 上也能享受到接近原生的 Linux 容器体验。
环境配置:从零开始
1. 安装 Homebrew
如果你还没有安装 Homebrew,它是 macOS 上不可或缺的包管理器。打开终端,运行以下命令进行安装:
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. 安装 Colima、Docker CLI 和 Docker Compose
Docker CLI 工具不是 Desktop,后面我们会替换为 nerdctrl
接下来,我们通过 Homebrew 安装 Colima、Docker CLI 和 Docker Compose。请注意,这里安装的是 Docker 的命令行工具,而非臃肿的 Docker Desktop 图形界面。
bash
brew install colima docker docker-compose
Colima 的安装会同时依赖 Lima 虚拟化平台和 QEMU 等组件。
3. 启动 Colima 服务
Colima 默认会创建一个拥有 2 个 CPU、2GiB 内存和 60GiB 存储的虚拟机。你可以通过 colima start
命令以默认配置启动 Colima。
bash
colima start
首次运行可能需要下载虚拟机镜像,耗时取决于你的网络状况。之后,启动虚拟机通常只需 30 秒左右。
如果你希望 Colima 在系统启动时自动运行,可以将其注册为系统服务:
bash
brew services start colima
你也可以定制虚拟机的配置,例如分配更多的 CPU、内存或磁盘空间。在启动时,可以通过 --cpu
、--memory
和 --disk
参数进行设置。
bash
colima start --cpu 4 --memory 8 --disk 120
注意:磁盘大小在虚拟机创建后不能更改,但 CPU 和内存可以在任何时候修改。如果需要修改现有虚拟机的配置,需要先停止 Colima,然后重新启动并应用新的参数。
bash
colima stop
colima start --cpu 4 --memory 8
4. 绑定 Docker CLI 到 Colima
Colima 启动后,它会创建一个 Docker 上下文。我们需要将 Docker CLI 绑定到这个上下文,才能使用 docker
命令与 Colima 运行的容器进行交互。
bash
docker context use colima
现在,你可以尝试运行 docker ps
命令,如果看到类似 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
的输出,说明 Colima 已经成功启动,并且 Docker CLI 已经连接到它。
容器运行时选择:Docker vs. containerd
Colima 在初始启动时,允许你指定容器运行时,默认为 Docker。然而,Kubernetes 社区已经逐渐放弃了对 Docker Engine 的直接支持,转而推荐使用 containerd 等符合 CRI(Container Runtime Interface)标准的运行时。
如果你希望使用更轻量、更符合 Kubernetes 生态的 containerd 作为运行时,可以在启动 Colima 时指定 --runtime containerd
参数。
bash
colima start --runtime containerd
在这种情况下,你需要使用 nerdctl
命令与 containerd 交互。Colima 建议运行 colima nerdctl install
来在 $PATH
中安装 nerdctl
别名脚本。
nerdctl:你的新容器命令行工具
nerdctl 的功能和用法与 Docker CLI 几乎相同,但它还支持 Docker 中不存在的一些 containerd 前沿功能。
常用 nerdctl 命令示例:
- 拉取镜像 :
nerdctl pull nginx:alpine
- 查看镜像 :
nerdctl images
- 运行容器 :
nerdctl run -d --name nginx -p 8080:80 nginx:alpine
- 查看运行中的容器 :
nerdctl ps
- 停止容器 :
nerdctl stop nginx
- 删除容器 :
nerdctl rm nginx
- 查看容器日志 :
nerdctl logs -f --tail=100 nginx
- 进入容器 :
nerdctl exec -it <容器ID/名称> /bin/bash
nerdctl 也支持 Docker Compose 语法,只需将 docker-compose
替换为 nerdctl compose
。
yaml
# docker-compose.yml 示例
version: '3'
services:
nginx:
image: 'nginx:alpine'
container_name: nginx
environment:
- TZ=Asia/Shanghai
ports:
- '8080:80'
然后运行:
bash
nerdctl compose -f docker-compose.yml up -d
案例实战:启动 MySQL、Redis 和 pgvector
现在,我们来尝试在 Colima + nerdctl 环境中启动一些常见的服务。
1. 启动 MySQL 数据库
我们将使用 nerdctl run
命令启动一个 MySQL 8.0 容器。
bash
# 创建数据和配置目录
mkdir -p ~/colima_data/mysql/{conf,data}
cd ~/colima_data/mysql/
# 创建 MySQL 配置文件 my.cnf
cat <<EOF > conf/my.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
!includedir /etc/mysql/conf.d/
EOF
# 启动 MySQL 容器
nerdctl run -d \
--restart always \
-p 3306:3306 \
--name mysql \
--privileged=true \
-v ~/colima_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v ~/colima_data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=your_root_password \
mysql:8.0
注意 :请将 your_root_password
替换为你自己的密码。--privileged=true
选项在某些情况下可能需要,但出于安全考虑,应尽量避免在生产环境中使用。
验证 MySQL 是否运行:
bash
nerdctl ps
你应该能看到名为 mysql
的容器正在运行。
2. 启动 Redis 缓存服务
启动 Redis 容器非常简单:
bash
nerdctl run -d --name redis -p 6379:6379 redis:alpine
验证 Redis 是否运行:
bash
nerdctl ps
3. 启动 PostgreSQL 并配置 pgvector
pgvector 是 PostgreSQL 的一个扩展,使其能够高效存储和查询向量数据,支持相似性搜索,这对于 AI 应用非常有用。
我们将使用 docker-compose.yaml
文件来启动 PostgreSQL 并配置 pgvector。
首先,创建一个 docker-compose.yaml
文件:
yaml
version: '3.8'
services:
postgres_db:
image: postgres:15
container_name: postgres_db
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: your_postgres_password
POSTGRES_DB: postgres
TZ: Asia/Shanghai
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
interval: 10s
timeout: 5s
retries: 5
command: ["postgres", "-c", "max_connections=200"]
volumes:
pgdata:
注意 :请将 your_postgres_password
替换为你自己的密码。
然后,在 docker-compose.yaml
文件所在的目录运行:
bash
nerdctl compose up -d
容器启动后,我们需要进入 PostgreSQL 容器内部安装并启用 pgvector 扩展。
bash
# 进入 PostgreSQL 容器
nerdctl exec -it postgres_db bash
# 在容器内连接 PostgreSQL 数据库
psql -U postgres -d postgres
# 在 psql 命令行中安装 pgvector 扩展
CREATE EXTENSION vector;
# 退出 psql
\q
# 退出容器
exit
验证 pgvector 是否安装成功,可以再次进入容器并连接数据库,然后运行 \dx
命令查看已安装的扩展。
常见问题与注意事项
- 镜像架构不匹配 :对于 Apple Silicon (M1/M2) Mac,如果遇到镜像架构不匹配的问题,可以尝试在
nerdctl pull
或nerdctl run
命令中添加--platform linux/arm64
来强制使用 ARM 架构的镜像。 - 挂载目录权限 :如果遇到文件挂载权限问题,可以尝试调整 Colima 虚拟机的挂载 UID/GID。这通常需要停止 Colima,然后使用
--mount-type=9p --mount-ownership [$UID]:$(id -g)
参数重新启动。 - 代理配置 :如果你在公司网络或需要代理才能访问外部网络,可能需要为 Colima 配置代理。这可以通过编辑 Colima 的配置文件
~/.colima/default/colima.yaml
来实现,添加env
和docker.registry-mirrors
配置项。
yaml
# ~/.colima/default/colima.yaml 示例
docker:
registry-mirrors:
- https://docker.mirrors.ustc.edu.cn
- https://hub-mirror.c.163.com
env:
HTTP_PROXY: http://127.0.0.1:8118
HTTPS_PROXY: http://127.0.0.1:8118
配置完成后,需要重启 Colima 使其生效。
总结
Colima 搭配 nerdctl 为 macOS 上的容器开发提供了一个轻量、高效且开源的替代方案。它不仅完美支持 Apple Silicon 芯片,还提供了与 Docker CLI 兼容的命令行体验,并能轻松集成 Kubernetes。通过本教程,你应该已经掌握了 Colima 和 nerdctl 的基本配置和使用,并成功运行了 MySQL、Redis 和 pgvector 等服务。
告别臃肿的 Docker Desktop,拥抱 Colima + nerdctl 带来的极简容器世界吧!