Skip to content

macOS 替换 Docker Desktop 的终极方案:Colima + 代理配置完全指南 ​

macOS 替换 Docker Desktop 的终极方案:Colima + 代理配置完全指南示意图

由于 Docker Desktop 在公司环境下的商业授权限制,许多开发者被迫寻找替代品。Rancher Desktop 虽然免费,但在部分机型上体验极差(卡顿、资源占用高)。

经过多方对比,Colima 凭借其轻量、极速、100% 开源免费的特性,成为了 macOS 上的最佳替代方案。但在特定的网络环境下,如何让 Colima 里的 Docker 顺利走宿主机(macOS)的代理,是一个极其折磨人的大坑。

本文将记录从卸载 Docker Desktop,到彻底解决 Colima 网络代理问题的全过程。

一、卸载 Docker Desktop 及残留清理 ​

使用 AppCleaner 或直接删除 /Applications/Docker.app 往往是不够的,Docker 会留下大量占用空间的隐藏文件。

彻底清理步骤:

  1. 删除应用程序本体和后台残留进程。
  2. 清理隐藏的虚拟磁盘和配置文件(这是释放几十 GB 空间的关键):
bash
sudo rm -rf ~/Library/Containers/com.docker.docker
sudo rm -rf ~/Library/Group\ Containers/group.com.docker
sudo rm -rf ~/.docker

二、安装与初始化 Colima ​

使用 Homebrew 安装 Colima 及其相关依赖:

bash
brew install colima docker docker-compose docker-buildx

提示

在 Intel 芯片的 Mac 上(如 2017 款 MBP),建议直接使用默认启动即可;如果是 Apple Silicon (M1/M2/M3) 芯片,建议开启原生虚拟化 vz。

首次启动(以 4 核 CPU、6GB 内存为例):

bash
colima start --cpu 4 --memory 6

三、痛点:网络受限环境下的代理配置折磨 ​

启动成功后,尝试拉取镜像:

bash
docker run --rm hello-world

在特定的网络环境下,大概率会遇到以下两种报错:

报错 1:DNS 解析失败(IPv6 的锅) ​

dial tcp: lookup registry-1.docker.io on [::1]:53: read udp ...: connection refused

这是因为 Docker 守护进程试图使用 IPv6 的本地环回去解析域名,但被防火墙或代理软件拦截。

报错 2:配置了 host.docker.internal 依然报错 ​

proxyconnect tcp: dial tcp: lookup host.docker.internal on [::1]:53: read udp ...: connection refused

很多教程会让你把代理地址写成 host.docker.internal(虚拟机访问宿主机的专用域名),但实测在 macOS + 代理软件增强模式下,这个域名依然会被错误地解析到 [::1] 导致失败。

四、终极破局:Lima 的底层代理注入魔法 ​

折腾了一圈固定局域网 IP 的方案后,发现一旦更换网络环境(有线、无线等),IP 就会变化,写死 IP 完全不可行。

真正的终极方案是:在宿主机配置 127.0.0.1,让 Lima 底层自动完成 NAT 转换。

1. 修改 Colima 配置文件 ​

打开配置文件:

bash
vim ~/.colima/default/colima.yaml

(建议先执行一次 colima start --edit 确保文件存在)

重点修改以下三处:

① 强制指定外部 DNS(顶层配置) ​

将 DNS 配置移到文件最外层,覆盖默认行为:

yaml
dns:
  - 8.8.8.8
  - 223.5.5.5

② 禁用 Docker 守护进程的 IPv6 ​

找到 docker: 字段,强制关闭 IPv6 解析:

yaml
docker:
  daemon.json:
    "ipv6": false

③ 注入宿主机代理环境变量 ​

在文件最底部的 env: 字段,直接写宿主机的 127.0.0.1 和你的代理软件 HTTP 端口(这里以 Clash 默认的 7890 为例):

yaml
env:
  HTTP_PROXY: http://127.0.0.1:7890
  HTTPS_PROXY: http://127.0.0.1:7890
  NO_PROXY: ::1,localhost,127.0.0.1,*.baidu.com,192.168.0.0/16,10.0.0.0/8

⚠️ 注意

请确保端口号 7890 与你的代理软件实际使用的 HTTP 代理端口一致。经过测试,由于 Lima 底层直接利用 NAT 机制转发本机流量,不需要开启代理软件的“允许局域网连接”即可生效。

2. 重启并生效 ​

bash
colima restart

五、核心原理:为什么会成功? ​

配置完成后,再次执行 docker run --rm hello-world,你会看到久违的 Hello from Docker!。

如果你执行 colima ssh 登录到虚拟机内部,你会发现一个非常神奇的现象:

bash
# 查看环境变量
env | grep -i proxy

# 输出结果:
https_proxy=http://192.168.5.2:7890
http_proxy=http://192.168.5.2:7890

你明明配置的是 127.0.0.1,为什么变成了 192.168.5.2?

查看虚拟机的 /etc/environment 文件,真相大白:

bash
cat /etc/environment

# 输出结果:
#LIMA-START
HTTPS_PROXY=http://192.168.5.2:7890
HTTP_PROXY=http://192.168.5.2:7890
NO_PROXY=kubernetes.docker.internal
#LIMA-END

这就是 Lima (Colima 的底层 VM 管理工具) 的自动注入机制:

  1. 当你填写 127.0.0.1 时,Lima 知道这是宿主机的本地环回地址。
  2. 在虚拟机内部,Lima 会自动将其替换为虚拟网络的默认网关地址(即 192.168.5.2)。
  3. Lima 将转换后的环境变量全局注入到虚拟机的系统环境(/etc/environment)中。

完美避坑

由于使用的是虚拟网络网关(192.168.5.2),无论你的 Mac 是在家里、公司,还是连接移动热点,网关地址永远不变。彻底解决了固定 IP 导致的各种问题,同时 colima ssh 进去后的 git、go 等命令行工具也能完美继承这套代理。

总结 ​

至此,你拥有了一套:

  • 完全免费、无授权限制的容器运行环境。
  • 性能极高(基于 macOS 原生 vz 框架或 qemu)。
  • 网络畅通(支持全局代理穿透,且无视网络环境变化)。

卸载笨重的 Docker Desktop,拥抱轻量的 Colima,让你的 Mac 重新焕发活力吧!

最后更新2026/10/28 08:56
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal