在 AWS ELB 上运行 Docker 容器,连接到主机节点应用程序
Posted
技术标签:
【中文标题】在 AWS ELB 上运行 Docker 容器,连接到主机节点应用程序【英文标题】:Running a Docker Container on AWS ELB, connected to the host Node app 【发布时间】:2018-03-04 09:36:32 【问题描述】:我要做的是双重的:第一,在我的 Elastic Beanstalk 环境中运行一个 Docker 容器(最好从 Dockerfile 创建,而不是从图像中提取),该环境已经在生产中运行了一个 Node 应用程序。然后,将两者连接在一起,以便可以通过主机上的 localhost 访问我的服务器(在 Docker 容器上运行)。这样做的最终目标是允许两者通过 TCP 进行通信,但我已经知道没有 Dockeriziation。
据我所知,AWS 有一个用于单容器 Docker 应用程序的选项;但是,我不清楚它是针对仅在 Docker 上运行的应用程序,还是像我这样的场景。根据我的阅读,我倾向于前者。
因此,我唯一的选择是在我的实例上手动安装 Docker 作为包,将其作为服务运行,然后以这种方式从 Dockerfile 构建和运行吗?这似乎相当迂回,我相信我之前尝试过,但成功有限 - 但如果这是最好的道路,那就是我会尝试的!
感谢你们能给我的任何帮助。将接受给出可行解决方案的第一个答案。
【问题讨论】:
为什么要通过 TCP 从宿主机连接到容器? 这取决于几件事。 Node 应用程序是否总是要在单个 EC2 实例上运行?会水平缩放应用程序吗?如果是,那么你为什么要使用 localhost 来访问这个 dockerized 服务,你在两者之间创建了一个不必要的联系。 答案很简单——我正在使用这个容器在 Python 中执行一项非常具体的任务,而这是我在 Node.js 中无法完成的任务。会有不止一个实例,但如果每个实例都有自己的容器来执行此功能,那就太好了。最终,我们计划转向完全多容器设置,这将允许我们以更传统的方式将主应用程序和此容器链接在一起。但在那之前,我们需要一种方法来将两者连接起来,以便它们可以通信,而 TCP 似乎是最简单的。 话虽如此,我并没有那么担心,我很确定只要暴露端口就可以解决通信方面的问题。也许不吧。但实际安装过程更让我烦恼。 【参考方案1】:在这种情况下,您需要将现有的 Node 应用程序打包到 Docker 容器中,然后使用 ELB Multi Container Docker environment 在容器中运行这两个应用程序。
您需要将这两个容器存储在私有或公共注册表中。要利用 AWS Registry 服务,请按照 this 文章中的说明进行操作。然后,您可以在 Dockerrun.aws.json 文件中为您的 EB 环境引用您的容器。
要允许容器相互通信,请在 Dockerrun.aws.json 文件中包含指向其他容器的“链接”:
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [
"name": "my-node-app",
"image": "registry:my-node-app",
"essential": true,
"name": "other-container",
"image": "registry:other-container",
"essential": true,
"portMappings": [
"hostPort": 80,
"containerPort": 80
],
"links": [
"my-node-app"
]
]
在这种情况下,Docker 通过主机名“my-node-app”将您的节点容器暴露给您的其他容器(这是一个缩写的 Dockerrun 文件,仅供参考)
【讨论】:
这是长期计划。但是今天要进行这种转换是不可行的。在此之前这是一个中间步骤。 那么您想在自动部署之外的 EB 主机上启动 Docker 容器吗?为此,您需要在 .ebextensions 文件中定义它。 docs.aws.amazon.com/elasticbeanstalk/latest/dg/…以上是关于在 AWS ELB 上运行 Docker 容器,连接到主机节点应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何将 AWS ELB 连接到运行 MS SQL 的 RDS?
Elastic Beanstalk / ELB 增加了超过 60 毫秒的延迟
如何集成 AWS + ELB + AutoScale + Docker + Spring Cloud
在单独的 docker 容器 (AWS ECS) 中连接到 MongoDB