linux系统如何在一个系统部署2个DOCKER系统?

在 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博客 » linux系统如何在一个系统部署2个DOCKER系统?