可以,Ubuntu 完全支持安装多个 Docker 实例或不同版本的 Docker。
但需要明确的是:你通常不是“安装多个独立的 Docker 软件包”,而是通过以下几种方式实现“多实例”或“多版本共存”的需求。以下是常见场景和解决方案:
✅ 场景一:运行多个独立的 Docker Daemon(Docker 守护进程)
这是最常见的“多个 Docker”需求,即同时运行两个或多个互不干扰的 Docker 环境。
方法:使用 dockerd 自定义配置启动多个实例
每个实例使用不同的:
- PID 文件(
--pidfile) - Socket 文件(
--host或--exec-root) - 数据目录(
--data-root或旧版--graph) - 端口(
--port)
示例步骤:
-
创建第二个 Docker 实例的配置目录:
sudo mkdir -p /etc/docker2 sudo mkdir -p /var/lib/docker2 sudo mkdir -p /run/docker2 -
编写配置文件
/etc/docker2/daemon.json(可选):{ "storage-driver": "overlay2", "log-driver": "json-file" } -
手动启动第二个 Docker daemon:
sudo dockerd --config-file=/etc/docker2/daemon.json --data-root=/var/lib/docker2 --exec-root=/run/docker2 --pidfile=/run/docker2/docker.pid --host=unix:///var/run/docker2.sock & -
使用新 socket 操作容器:
export DOCKER_HOST=unix:///var/run/docker2.sock docker ps
⚠️ 注意:你需要为每个实例单独管理镜像、容器、网络等。可使用别名简化命令:
alias docker2='docker --host unix:///var/run/docker2.sock'
✅ 场景二:安装多个不同版本的 Docker Engine
例如:同时保留 Docker CE 20.x 和 24.x 用于测试兼容性。
方法:使用 APT 指定版本安装
Ubuntu 的 Docker APT 仓库允许你安装特定版本:
# 列出可用版本
apt-cache policy docker-ce
# 安装特定版本
sudo apt install docker-ce=5:24.0.7-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.7-1~ubuntu.22.04~jammy containerd.io=1.7.11-1~ubuntu.22.04~jammy
你可以同时安装多个版本,但默认只有一个 Docker daemon 在运行。要切换版本,需停止当前服务并启动另一个:
sudo systemctl stop docker
sudo systemctl disable docker
# 手动启动特定版本
/usr/bin/dockerd
💡 更推荐的方式是使用 Docker Desktop for Linux 或 Podman 作为替代方案,它们天然支持多引擎隔离。
✅ 场景三:使用 Podman 替代 Docker(推荐用于多环境隔离)
Podman 是 Docker 的替代品,无守护进程、支持 rootless、可并行运行多个引擎实例。
sudo apt install podman
podman run hello-world
Podman 可与 Docker 共存,且无需修改系统服务。
✅ 场景四:使用容器嵌套(Docker in Docker, DinD)
在单个 Docker 容器中运行另一个 Docker 实例:
docker run --privileged -d --name dind docker:dind
适用于 CI/CD 流水线中需要隔离构建环境的情况。
📌 总结建议
| 需求 | 推荐方案 |
|---|---|
| 同时运行两个独立 Docker 环境 | 手动启动多个 dockerd 实例 + 不同 socket/data-dir |
| 测试不同 Docker 版本兼容性 | APT 安装多版本 + 手动切换 daemon |
| 安全隔离、无需 root | 使用 Podman |
| CI/CD 中嵌套 Docker | DinD(Docker-in-Docker) |
| 桌面用户多环境管理 | Docker Desktop for Linux |
⚠️ 注意事项
- 多个 Docker daemon 会占用更多内存和磁盘空间。
- 确保每个实例使用不同的
data-root,避免数据冲突。 - 防火墙和端口可能冲突,需仔细规划。
- 生产环境中不建议随意运行多个 daemon,除非有明确隔离需求。
如有具体使用场景,我可以提供更详细的配置示例。
CLOUD云