12k
All articles

5 款适用于本地开发的 Docker 替代方案

比较适用于本地开发的五款 Docker Desktop 替代工具:Podman、OrbStack、Colima、Rancher Desktop 和 Lima,了解系统支持、费用及 Docker CLI 与 Compose 兼容性。

OpenReplay Team
OpenReplay Team
5 款适用于本地开发的 Docker 替代方案

值得在本地开发中试用的五款 Docker Desktop 替代方案分别是:Podman(搭配 Podman Desktop)、OrbStack、Colima、Rancher Desktop,以及 Lima(搭配 nerdctl)。其中只有部分工具会在你的 docker 命令背后保留真正的 Docker Engine。

也许 Postgres 容器一启动,你的电脑风扇就开始狂转;也许财务部门的同事问过公司到底为多少个 Docker Desktop 席位付费。无论哪种情况,你都想知道哪款替代工具仍然能运行你的 docker run 脚本和 Compose 文件。

本文不涉及镜像和容器的基础知识,相关内容可参阅Docker 镜像与容器入门指南。下面的每款工具都按照相同的维度进行评估:操作系统、费用、引擎、docker CLI 兼容性、Compose 兼容性、适用人群,以及安装并运行第一个容器所需的命令。

核心要点

  • 对于员工少于 250 人且年收入低于 1000 万美元的企业,Docker Desktop 可免费使用。规模更大的公司需要购买付费的 Pro、Team 或 Business 订阅。
  • OrbStack 和 Colima(默认模式下)在更轻量的虚拟机中运行 Docker Engine。Podman 以及 containerd 搭配 nerdctl 则完全替换了引擎。
  • 在 macOS 和 Windows 上,本文对比的所有工具仍然是在虚拟机中运行 Linux 容器。
  • podman compose 确实存在,但它会将工作转交给外部 provider(docker-compose 或 podman-compose),因此必须安装二者之一。
  • 如果切换工具后 docker 无法正常工作,请运行 docker context ls,查看 CLI 当前指向的是哪个引擎端点。

开发者为什么要在本地寻找 Docker 替代方案?

开发者放弃 Docker Desktop 通常出于以下三个原因之一:许可证、资源占用,或 macOS 上的文件共享速度。

  • 许可证。 根据 Docker Desktop 的许可条款,该应用对个人使用、教育用途、非商业开源项目,以及员工少于 250 人且年收入低于 1000 万美元的企业免费。超出任一限制的公司都需要购买付费的 Pro、Team 或 Business 订阅。
  • 内存与电量。 在 macOS 和 Windows 上,只要有容器在运行,Docker Desktop 就会运行其 Linux 虚拟机;即使容器处于空闲状态,该虚拟机也会占用内存并消耗电量。Docker Desktop 的 Resource Saver 模式只有在一段时间内(默认五分钟)没有任何容器运行后才会停止虚拟机。
  • 绑定挂载(bind mount)。 在 macOS 上,从宿主机挂载到容器中的文件必须跨越虚拟机边界。Docker 官方文档也指出,随着代码库规模增长,绑定挂载可能会变慢,这也是 Docker Desktop 推出同步文件共享(synchronized file shares)功能的原因。庞大的 node_modules 目录树和文件监听器(file watcher)最容易暴露出这种性能问题。

每款 Docker 替代方案究竟替换了什么?

Docker Desktop 是一款桌面应用,它打包了 Linux 虚拟机、Docker Engine 和图形界面。替换 Docker Desktop 并不等于替换 Docker Engine。这些替代方案可分为两类:

类别工具docker 命令的通信对象
在更轻量的虚拟机中运行 Docker EngineOrbStack、Colima(默认运行时)、Rancher Desktop(moby 模式)真正的 Docker 守护进程
替换引擎Podman、Lima/containerd 搭配 nerdctl、Rancher Desktop(containerd 模式)Podman 的 Docker 兼容 API;使用 nerdctl 时则没有通信对象。你主要使用的是模仿 Docker 语法的 CLI

在 Docker Engine 类别中,docker CLI 和 Compose 依然与 Docker 守护进程通信。在替换引擎的类别中,Docker 兼容性来自一个模仿 Docker 语法的命令行层;对于 Podman 而言,还有一个能够响应 Docker API 调用的 socket。在 macOS 和 Windows 上,这里的所有工具仍然在虚拟机中运行 Linux 容器。切换工具改变的是虚拟机的管理方式,而不是是否存在虚拟机。

为什么切换工具后 docker 会失效?

docker CLI 会连接到 DOCKER_HOST 变量或当前激活的 Docker context 所指向的 socket。如果在安装替代工具后命令执行失败,通常是因为 CLI 指向了一个背后没有引擎的 socket。我们的“Docker daemon not running”错误排查指南详细讲解了相关错误信息。

docker context ls          # the active endpoint is marked with *
docker context use colima  # point the CLI at another engine

你无需卸载 Docker Desktop 即可测试替代工具。切换 context 试用新工具,之后再切换回来即可。

用于测试各工具的 Compose 文件

使用同一个最小化文件来检验每款工具。请先用 YAML 校验工具检查一遍,确保任何失败都源于工具本身,而不是拼写错误。

# compose.yaml
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
    ports:
      - "5432:5432"

Docker 替代方案对比

工具操作系统费用引擎docker CLICompose
Podman + Podman DesktopmacOS、Windows、Linux免费、开源Podman通过别名或 API socketpodman compose + provider
OrbStackmacOS个人免费,商业付费Docker Engine支持支持,已内置
ColimamacOS、Linux免费、开源Docker(默认)支持,需单独安装需单独安装 Compose
Rancher DesktopmacOS、Windows、Linux免费containerd 或 mobymoby 模式下支持nerdctl compose 或 docker compose
Lima + nerdctlmacOS、Linux免费、开源containerd不支持(使用 nerdctl)nerdctl compose

Podman 搭配 Podman Desktop

Podman 替换了 Docker 的引擎,并且没有守护进程。Podman Desktop 免费开源,支持 macOS、Windows 和 Linux。在 Mac 和 Windows 上,你可以获得原生的 podman 命令,容器则运行在 Podman 称之为 Podman machine 的 Linux 虚拟机中。

  • docker CLI: Podman 的命令采用 Docker 的语法,因此 alias docker=podman 足以覆盖大部分日常使用场景。在 Mac 和 Windows 上,Podman 还能接受 Docker API 客户端的请求,因此你也可以将真正的 docker CLI 和基于 Docker 的工具指向它的 socket。
  • Compose: podman compose 是内置命令,但它只是一个轻量封装,会把工作交给 docker-compose 或 podman-compose 处理。请先安装其中之一。
  • 适用人群: 需要在 macOS、Windows 和 Linux 上统一使用一款免费工具的团队。
brew install podman
podman machine init
podman machine start
podman run --rm hello-world
podman compose up

Podman 安装文档建议在 macOS 上使用官方安装程序,而非 Homebrew。Podman Desktop 则有独立的安装程序。

OrbStack

OrbStack 是一款仅支持 macOS 的应用。它自带 Docker 引擎和 Compose 工具,力求在行为上与 Docker Desktop 保持一致,因此 docker CLI 和 Compose 无需任何改动即可使用。

  • 费用: 根据 OrbStack 的许可条款,个人使用免费。自由职业、企业和非营利组织使用则需要购买按用户计费的付费许可证。
  • Compose: 已内置。
  • 适用人群: 只使用 Mac、希望保留 Docker Desktop 工作流但换用不同虚拟机层的团队。用于本地开发的 Dev Containers 等按项目配置的方案也能照常使用。
brew install --cask orbstack
docker run --rm hello-world
docker compose up

Colima

Colima 是一款免费的命令行工具,支持 macOS(Intel 和 Apple Silicon)以及 Linux。在默认的 Docker 运行时下,Colima 会在虚拟机中运行 Docker 引擎。它还提供 containerd 和 Incus 运行时。

  • docker CLI: 需要单独安装。
  • Compose: 未内置。请安装 Homebrew 的 docker-compose formula,然后将其链接到 ~/.docker/cli-plugins,这样 docker compose 才能正常工作。
  • 适用人群: 习惯终端操作、不需要图形界面的开发者。
brew install colima docker docker-compose
mkdir -p ~/.docker/cli-plugins
ln -sfn "$(brew --prefix)/opt/docker-compose/bin/docker-compose" ~/.docker/cli-plugins/docker-compose
colima start
docker run --rm hello-world
docker compose up

如果你使用 containerd 运行时启动 Colima,则需要用 colima nerdctl 而非 docker 来运行容器。

Rancher Desktop

Rancher Desktop 支持 macOS(Intel 和 Apple Silicon)、Windows 和 Linux。Rancher Desktop 可以使用 containerd 或 dockerd(moby)作为引擎。选择 moby 会启用 Docker API,因此无需别名即可使用 docker CLI。

  • Compose: 容器使用教程介绍了如何通过 nerdctl compose 和 docker compose 使用 Compose。
  • 注意事项: 同一时间只能启用一种运行时。在一种运行时下拉取的镜像,切换到另一种运行时后将无法使用。内置的 Kubernetes 可以关闭。
  • 适用人群: 需要图形界面和 Docker API 的跨平台团队。
rdctl set --container-engine.name=moby
docker run --rm hello-world

你也可以在应用的 Preferences > Container Engine 中进行同样的设置,具体参见引擎偏好设置文档。

Lima 搭配 containerd 与 nerdctl

Lima 用于启动 Linux 虚拟机,并提供自动文件共享和端口转发功能。默认模板运行的是 containerd。Lima 也支持 Linux、NetBSD 等非 macOS 宿主机。

  • docker CLI: 不使用。nerdctl 模仿了 Docker 的命令,你可以通过 lima nerdctl 来调用它。
  • Compose: nerdctl compose 实现了 Compose 规范(Compose Specification)。部分字段尚未实现,例如 links,详见 nerdctl 的 Compose 说明。
  • 适用人群: 希望自行组合各个开源组件的开发者。如果你更想运行 Docker Engine,Lima 也提供了 docker 模板。
brew install lima
limactl start
lima nerdctl run --rm hello-world
lima nerdctl compose up

如何选择 Docker 替代方案?

在比较功能之前,你的操作系统就已经排除了好几款 Docker 替代方案。OrbStack 仅支持 macOS,Colima 没有 Windows 版本。如果需要一款能同时用于 macOS、Windows 和 Linux 的工具,那么只剩下 Podman Desktop 和 Rancher Desktop。如果你的 Compose 文件和脚本必须原封不动地运行,请选择运行 Docker Engine 的工具:OrbStack、Colima,或 moby 模式下的 Rancher Desktop。如果你想彻底摆脱 Docker 守护进程,请选择 Podman。

总结

真正关键的问题在于:一款工具是保留了 Docker Engine,还是替换了它。正是这一点决定了你的 docker 命令和 Compose 文件能否无缝迁移。请根据你的操作系统和许可证情况选择合适的工具,用上文的 compose.yaml 进行测试,并在卸载 Docker Desktop 之前检查一下 docker context ls。

常见问题

Docker Desktop 的许可证是否适用于 Linux 上的 Docker Engine?

不适用。Docker Engine 基于 Apache License 2.0 开源,商业使用不受员工人数或收入限制。250 名员工和 1000 万美元的门槛来自 Docker 订阅服务协议(Docker Subscription Service Agreement),该协议仅涵盖 Docker Desktop 及其内置的 Engine。在 Linux 工作站上直接安装 Docker Engine,既能规避 Desktop 许可证问题,又能省去额外的虚拟机层。

切换工具后,我在 Docker Desktop 中的镜像和卷能否迁移过去?

只有 OrbStack 会自动为你迁移。安装完成后,它会提示是否复制 Docker Desktop 中的容器、卷和镜像,该选项之后也可以在 File > Migrate Docker Data 中找到。迁移操作会生成一份副本,原始数据保持不变。对于 Colima、Podman 或 Rancher Desktop,请使用 docker save 导出镜像,再将其加载到新引擎中,并将命名卷备份为 tar 归档文件。

Testcontainers 能否使用 Podman 代替 Docker?

可以,通过 Podman 的 Docker 兼容 API socket 实现。将 DOCKER_HOST 设置为 Podman 的 socket。在 macOS 上,可以通过 podman machine inspect 获取路径,同时还需将 TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE 设置为 /var/run/docker.sock。在 Linux 上,socket 位于 XDG_RUNTIME_DIR 下的 podman/podman.sock。在 rootless 模式下,请设置 TESTCONTAINERS_RYUK_DISABLED=true 以关闭 Ryuk 清理容器。Testcontainers 团队并未主动测试其他替代运行时,因此部分功能可能无法正常工作。

VS Code Dev Containers 能否使用 Podman 代替 Docker?

可以。在 Linux、Windows 或 macOS 上,将 Dev Containers 的 Docker Path 设置(dev.containers.dockerPath)设为 podman 即可。该扩展通过执行容器 CLI 命令工作,从不直接与守护进程通信。VS Code 表示 Podman 5 及以上版本与 Docker CLI 基本兼容,但并不官方支持其他兼容 Docker 的 CLI。基于 Compose 的开发容器还需要配置 Compose provider。

DevTools for the frontend

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.