为啥 Docker 不支持多租户?

Posted

技术标签:

【中文标题】为啥 Docker 不支持多租户?【英文标题】:Why doesn't Docker support multi-tenancy?为什么 Docker 不支持多租户? 【发布时间】:2017-06-16 08:50:07 【问题描述】:

我看了this YouTube video on Docker,在 22:00 演讲者(一位 Docker 产品经理)说:

"你可能在想'Docker 不支持多租户'...你是对的!"

但从来没有任何解释实际给出的原因。所以我想知道:他的意思是什么? 为什么 Docker 不支持多租户?!如果您在 Google 上搜索“Docker 多租户”,您会惊讶地一无所获!

【问题讨论】:

【参考方案1】:

多租户工具的一个关键特性是每个租户之间的隔离。他们应该无法查看或管理彼此的容器和/或数据。

docker-ce 引擎是开箱即用的系统管理员级别工具。任何可以使用任意选项启动容器的人都可以在主机上拥有 root 访问权限。有 3rd 方工具,如 twistlock 与 authz 插件接口连接,但它们只提供粗略的访问控制,每个人都可以被允许或禁止整个活动类别,如启动容器或查看日志。让用户访问 TLS 端口或 docker 套接字会导致用户被归为一个类别,对于连接到 docker 引擎的用户没有组或命名空间的概念。

对于多租户,docker 需要添加一种方法来定义用户,并将它们放置在仅允许对特定容器和卷起作用的命名空间中,并限制允许脱离容器的选项,例如更改功能或从主机挂载任意文件系统。 Docker 的企业产品 UCP 确实开始通过在对象上使用标签来添加这些功能,但我还没有时间评估这是否会提供完整的多租户解决方案。

【讨论】:

@MeysamJavadi 具有足够的配置,您可以使用 UCP 设置多租户环境。我现在也知道更多的 authz 插件,包括 Open Policy Agent 和 Harbormaster。【参考方案2】:

其他人可能比我更懂得如何回答的棘手问题。但它就在这里。

让我们来定义多租户 (source):

多租户是一种架构,其中软件应用程序的单个实例服务于多个客户。

很难将 Docker 放在这个定义中。可以说它既是实例又是应用程序。这就是混乱的来源。

让我们将 Docker 分成三个不同的部分:守护进程容器应用程序

daemon 安装在主机上并运行 Docker containers。守护进程确实支持多租户,因为它可以在同一系统上使用我的许多用户,每个用户在~/.docker 中都有自己的配置。

Docker containers 运行单个进程,我们将其称为应用程序

应用程序可以是任何东西。对于这个例子,我们假设 Docker container 运行一个 Web 应用程序,比如论坛之类的。该论坛允许用户以他们的名义登录和发帖。它是一个单个实例,服务于多个客户。因此它支持多租户。

我们跳过的是 容器 以及它是否支持多租户的问题。这就是我认为您的问题的答案所在。

请务必记住,Docker 容器不是虚拟机使用docker run [IMAGE] 时,您正在创建一个新的容器实例。这些实例是短暂且不可变的。它们运行单个进程,并在进程存在时立即退出。但它们并非旨在让多个用户连接到它们并同时运行命令。这就是多租户的情况。相反,Docker 容器只是进程的隔离执行环境。

从概念上讲,echo Hellodocker run echo Hello 在此示例中是相同的。它们都在新的执行环境(进程与容器)中执行命令,都不支持多租户。

我希望这个答案是可读的并回答你的问题。让我知道是否有任何需要澄清的部分。

【讨论】:

在这个例子中,如果我的容器运行 ubuntu bash shell 并允许 shell 进入进程/容器......它是否可以支持多个人作为具有自己根目录的不同 unix 用户执行此操作。 .

以上是关于为啥 Docker 不支持多租户?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 3 CMS 支持多租户?

使用 Apache Kudu 实现多租户

(译)Istio 的软性多租户支持

java最流行的paas平台是啥?

为啥 JavaScript 不支持多线程?

mybatis-plus多租户的使用