在 Ubuntu 系统下,通常不建议也不支持同时运行多个 Docker 守护进程(daemon)实例,因为 Docker 默认使用系统级的资源(如 /var/run/docker.sock、网络命名空间、存储驱动等),多个 Docker 实例容易产生冲突。
但根据你的需求,有几种方式可以实现“多个 Docker”环境的效果:
✅ 方式一:使用 Docker in Docker (DinD)
适用于 CI/CD 或隔离构建环境。
- 启动一个容器,在其中运行另一个 Docker 守护进程。
- 示例:
docker run --privileged -d docker:dind --storage-driver=overlay2 - 注意:需要
--privileged权限,安全性较低,仅用于特定场景。
✅ 方式二:使用 Rootless Docker
在同一台机器上以不同用户身份运行多个独立的 Docker 实例。
- 普通用户也可以运行自己的 Docker 实例,不依赖系统全局的
dockerd。 - 多个用户可各自运行互不干扰的 Docker 环境。
- 安装方法(以非 root 用户):
# 安装 rootless Docker curl -fsSL https://get.docker.com/rootless | sh - 启动:
$HOME/bin/dockerd-rootless.sh - 特点:
- 更安全(无 root 权限)
- 可多用户共存,每个用户一个实例
- 适合开发测试或隔离环境
参考:https://docs.docker.com/engine/security/rootless/
✅ 方式三:修改配置运行多个 dockerd 实例(高级用法)
你可以手动启动多个 dockerd 进程,但必须确保它们使用不同的:
- 监听 socket 或端口(如
tcp://127.0.0.1:2376) - 数据目录(
--data-root /var/lib/docker2) - 配置文件和 cgroups/网络隔离
示例:
sudo dockerd
--data-root /var/lib/docker2
--host tcp://127.0.0.1:2376
--bip=172.26.0.1/16
--iptables=false
--containerd=/run/containerd/containerd.sock &
⚠️ 风险:
- 容易造成资源冲突(镜像、网络、存储)
- 管理复杂,一般只用于特殊测试场景
✅ 推荐替代方案:使用 Podman 或 LXC/LXD
如果你需要多个轻量级容器环境,可以考虑:
- Podman:无需守护进程,支持多用户,兼容 Docker 命令
- LXD:系统容器,可创建多个 Ubuntu 容器,每个里面运行独立 Docker
例如:
# 使用 LXD 创建两个 Ubuntu 容器
lxc launch ubuntu:22.04 docker-host1
lxc launch ubuntu:22.04 docker-host2
# 分别进入并安装 Docker
lxc exec docker-host1 -- bash
apt install docker.io
总结
| 方法 | 是否推荐 | 用途 |
|---|---|---|
| Docker in Docker (DinD) | ⚠️ 有条件 | CI/CD 构建 |
| Rootless Docker | ✅ 推荐 | 多用户隔离开发 |
| 多个 dockerd 实例 | ❌ 不推荐(除非特殊需求) | 测试实验 |
| LXD/Podman 替代 | ✅ 强烈推荐 | 多环境隔离 |
✅ 最佳实践建议:
如果你只是想隔离项目环境,使用 Docker Compose 就足够了。
如果需要完全隔离的 Docker 环境,推荐使用 Rootless Docker 或 LXD 容器。
如有具体使用场景(比如开发、测试、部署),欢迎补充,我可以给出更具体的配置方案。
轻量云Cloud