Kubernetes:如何从 Docker 容器 A 在 Docker 容器 B 上运行 Bash 命令
Posted
技术标签:
【中文标题】Kubernetes:如何从 Docker 容器 A 在 Docker 容器 B 上运行 Bash 命令【英文标题】:Kubernetes: How to run a Bash command on Docker container B from Docker container A 【发布时间】:2016-11-26 22:58:41 【问题描述】:我已经基于Docker-Multinode 搭建了一个简单的 Kubernetes 测试环境。我还建立了一个非常大的基于 Ubuntu 的 Docker 映像,其中包含我的几个工具。它们中的大多数都是用 C++ 编写的,并且对系统上安装的库有很多依赖关系。
我的目标是在多个节点之间分配遗留批处理任务。我喜欢 Docker-Multinode 的简单设置,但现在我想知道这是否适合我 - 因为我在另一个 Docker 映像中有我的实际遗留应用程序。
如何从 Docker 容器 A(多节点工作 Docker 容器)在 Docker 容器 B(带有我的旧工具的 Ubuntu Docker 容器)上运行 Bash 命令?还是根本不建议这样做?
澄清一下,Docker 容器 A(工作者多节点工作者 Docker 容器)和 Docker 容器 B(遗留工具 Ubuntu Docker 容器)运行在同一主机上(每台机器都将拥有它们)。
【问题讨论】:
【参考方案1】:你的问题真的不清楚:
Kubernetes 运行 Docker 容器;任何 Docker 容器。
Kubernetes 本身在 Docker 中运行,而在“多节点”中,Kubernetes 所需的依赖项在 Docker 中运行,但在所谓的引导 Docker 中。
现在,您的问题不清楚 Docker A 与 Docker B 的运行位置。 此外,如果您想“分发”批处理作业,那么每个作业都应该是在其自己的容器中运行的独立作业,并且容器 A 不应依赖于容器 A。
如果您需要 Docker 容器 B 中的依赖项(库)来运行您的作业,那么您实际上只需要使用 Docker 容器 B 作为您的作业容器 A 的基础镜像。Docker 镜像是分层的,因此即使如果它很大,如果另一个容器将它用作基础镜像,则它整体只加载一次,因此以 B 作为基础镜像的类型为 A 的五个容器是没有问题的,因为基础镜像只加载一次。
如果你真的需要一个容器与另一个容器进行通信,那么你应该构建一个 API 来将命令从一个容器传递到另一个容器(某种 RESTful API,它可以通过 HTTP 调用进行通信以传递进程运行的请求在一个容器上并返回结果)。
【讨论】:
谢谢,我已经更新了我的问题,以澄清 docker A 和 B 在每台服务器上都运行。所以我正在考虑的一件事是使用 docker socket 让工人 docker 启动一个兄弟(不是子)docker B。但实际上我不知道 docker-multinode 使用哪个图像。而且很可能它也不是 Ubuntu 映像。哪个图像以及如何在 docker-multinode 示例中更改它? 我还是不明白你为什么要从另一个容器运行一个容器。目标是什么?在 Kubernetes 中,您运行 Pod(无论它们是由 Deployment、PetSet 还是 Jobs 控制的 Pod)。我不确定您的 Docker 容器 A 与这里有什么关系;它只是运行 Kubernetes 服务,然后只需使用 Kubernetes 命令行来运行您的 B 容器。 我的意思是我想使用容器 A 和其中的服务并将所有遗留的东西安装到其中。然后我不需要容器 B。但我不知道 A 有哪个图像,它被埋在 bash dcripts 中,似乎有几个不同。 您似乎错过了 Docker 的重点。 Docker 旨在将服务容器化,即 1 个功能 = 1 个容器。所以为你自己的服务构建镜像并运行它,不要试图把东西放在其他服务的容器中。 但是如何向 docker-multinode 示例添加服务?例如。我想从“docker B”的队列中消费一个任务?这一切都是由示例脚本设置和控制的,我看不到如何集成我自己的服务。我知道使用其他示例如何工作,但在 docker-multinode...以上是关于Kubernetes:如何从 Docker 容器 A 在 Docker 容器 B 上运行 Bash 命令的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jenkins 将 Docker 容器从 Amazon ECR 自动部署到 Kubernetes
如何通过 SSH 连接到 Kubernetes 集群中的 docker 容器? [关闭]