在 Linux 系统中,一个主机上是可以部署并运行多个 Docker 实例(即两个独立的 Docker 系统) 的。这通常用于隔离不同环境、测试或开发与生产分离等场景。
下面是实现“在一个系统中部署两个 Docker 系统”的几种方法:
✅ 方法一:使用不同的 Docker 守护进程(推荐方式)
原理:
通过配置多个 docker 守护进程实例,分别监听不同的 socket 文件和端口,并使用不同的数据目录(如 /var/lib/docker1, /var/lib/docker2),从而实现两个完全隔离的 Docker 系统。
步骤如下:
1. 创建新的 Docker 配置文件
默认的 Docker 配置文件是 /etc/docker/daemon.json。我们可以为第二个实例创建一个新的配置文件,比如:
sudo mkdir -p /etc/docker2
然后创建 /etc/docker2/daemon.json 内容如下:
{
"hosts": ["unix:///run/docker2.sock", "tcp://0.0.0.0:2376"],
"data-root": "/var/lib/docker2",
"pidfile": "/run/docker2.pid"
}
hosts: 指定该实例使用的 socket 和 TCP 端口。data-root: 数据存储路径,不能与主 Docker 共用。pidfile: PID 文件路径。
2. 创建数据目录
sudo mkdir -p /var/lib/docker2
3. 创建 systemd 服务文件
复制原来的 docker.service 并重命名为 docker2.service:
sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker2.service
编辑这个新服务文件:
sudo nano /etc/systemd/system/docker2.service
修改以下部分:
Description=Docker Engine - Second Instance
ExecStart=/usr/bin/dockerd --config-file /etc/docker2/daemon.json
PIDFile=/run/docker2.pid
还要确保没有与其他服务冲突,比如:
After=docker2.socket network.target
如果存在 Conflicts=docker.service,可以添加:
Conflicts=docker.service
4. 启动并启用服务
sudo systemctl daemon-reload
sudo systemctl enable docker2 --now
sudo systemctl start docker2
5. 使用 DOCKER_HOST 切换客户端连接的目标
要使用不同的 Docker 实例,可以通过设置 DOCKER_HOST 环境变量来切换:
# 使用默认 Docker
export DOCKER_HOST=unix:///run/docker.sock
# 使用第二个 Docker 实例
export DOCKER_HOST=unix:///run/docker2.sock
你也可以通过 TCP 连接(例如用于远程管理):
export DOCKER_HOST=tcp://localhost:2376
⚠️ 注意:使用 TCP 时务必注意安全,建议配合 TLS 加密。
✅ 方法二:使用 LXC/LXD 或虚拟机嵌套运行 Docker
如果你希望两个 Docker 实例更加彻底地隔离(包括内核级隔离),你可以:
- 在宿主机安装 LXD,创建两个容器,在每个容器里安装 Docker;
- 或者使用 KVM/QEMU 虚拟机,每个虚拟机里运行一个完整的 Docker 系统。
这种方式更复杂但隔离性更强。
✅ 方法三:使用 rootless Docker(用户级 Docker)
Docker 支持以非 root 用户身份运行多个实例,这对于开发人员来说非常有用。
参考官方文档:
https://docs.docker.com/engine/security/rootless/
优点:
- 不需要 sudo 权限;
- 可以同时运行多个互不干扰的 Docker 实例;
- 更加安全。
缺点:
- 配置较复杂;
- 不支持某些功能(如绑定挂载到特权端口);
🧪 示例验证
# 查看第一个实例的容器
DOCKER_HOST=unix:///run/docker.sock docker ps
# 查看第二个实例的容器
DOCKER_HOST=unix:///run/docker2.sock docker ps
🔚 总结
| 方法 | 隔离程度 | 难度 | 推荐用途 |
|---|---|---|---|
| 多个 Docker 守护进程 | 中 | 中 | 开发、测试、隔离环境 |
| LXC/LXD 容器 | 高 | 较高 | 多用户隔离 |
| 虚拟机嵌套 Docker | 非常高 | 高 | 生产模拟、完全隔离 |
| Rootless Docker | 中 | 中 | 开发者本地多实例 |
如需我帮你生成完整的配置文件或脚本,请告诉我你的具体需求!
ECLOUD博客