为啥 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 Hello
和 docker run echo Hello
在此示例中是相同的。它们都在新的执行环境(进程与容器)中执行命令,都不支持多租户。
我希望这个答案是可读的并回答你的问题。让我知道是否有任何需要澄清的部分。
【讨论】:
在这个例子中,如果我的容器运行 ubuntu bash shell 并允许 shell 进入进程/容器......它是否可以支持多个人作为具有自己根目录的不同 unix 用户执行此操作。 .以上是关于为啥 Docker 不支持多租户?的主要内容,如果未能解决你的问题,请参考以下文章