同一台机器上无法直接共存多个docker daemon主版本,必须通过隔离运行实现:dvm仅切换cli二进制;docker-in-docker容器封装独立daemon;虚拟机或rootless模式提供彻底隔离。

同一台机器上管理不同主版本的 Docker,关键不是“切换”,而是“隔离运行”——因为 Docker daemon 本身不支持多版本共存。直接安装多个 Docker CE/EE 会导致服务冲突、二进制覆盖和 daemon 启动失败(ERR01)。真正可行的方案是用容器化或版本管理工具实现逻辑隔离,而非系统级并存。
用 dvm(Docker Version Manager)按需切换
dvm 是专为 Docker 版本管理设计的轻量工具,类似 nvm 或 pyenv,它不安装多个 daemon,而是下载指定版本的 docker CLI 二进制,并通过符号链接切换当前 shell 的默认命令路径。
- 仅管理 CLI,不影响系统已有的 docker daemon;适合开发测试中验证不同 CLI 行为(如新 flag、API 兼容性)
- 安装后执行:
dvm install 24.0.7、dvm install 26.1.3,再用dvm use 24.0.7切换 - 每个版本 CLI 独立存放于
~/.dvm/versions/,互不干扰 - 注意:它调用的是本地运行的同一个 daemon(通常是最新版),所以无法测试 daemon 层差异(如 storage driver 变更)
用容器封装旧版 Docker daemon
若需真实运行不同主版本的 daemon(例如验证 20.10 的 buildkit 行为 vs 26.x 的新特性),可将旧版 Docker 打包为容器,在隔离命名空间中启动其 own daemon。
- 使用官方
docker:dind(Docker-in-Docker)镜像,指定 tag 如docker:20.10.24-dind - 启动时加
--privileged和挂载/var/run/docker.sock(仅用于嵌套调试,生产慎用) - 典型命令:
docker run --privileged -d -v /var/run/docker.sock:/var/run/docker.sock docker:20.10.24-dind - 该容器内运行的是完整独立的 Docker daemon,CLI 也绑定在其内部,与宿主机版本完全解耦
用虚拟机或 rootless 模式分隔主版本
当需要长期并行运行多个主版本 daemon(比如 CI 环境需同时支持 legacy 和 modern pipeline),推荐更彻底的隔离方式:
- 轻量虚拟机:用 Multipass 或 Lima 启动 Ubuntu VM,每台 VM 安装固定主版本(如 20.10、24.0、26.x),通过 SSH 或 socket 转发调用
- Rootless Docker:在用户空间启动无特权 daemon(从 Docker 20.10+ 支持),不同用户可各自安装不同主版本,彼此进程、socket、存储目录完全独立
- 例如:
curl -fsSL https://get.docker.com/rootless | sh,然后设置DOCKER_HOST=unix:///home/user/.docker/run/docker.sock
避免常见误区
不要尝试通过 apt/yum 多次安装不同 docker-ce 包——包管理器会强制覆盖,且 systemd service 名相同导致冲突。也不要修改 /etc/docker/daemon.json 试图“兼容多版本”,配置项本身随主版本演进,旧参数在新版中可能被移除或语义变更。
真正需要多主版本的场景,本质是环境隔离需求。选对隔离层级(CLI 工具层 / 容器进程层 / 用户空间层 / 虚拟机层),比强行共存更稳定、更易维护。











