数据在多容器 Dockerized 应用程序中的啥位置?

Posted

技术标签:

【中文标题】数据在多容器 Dockerized 应用程序中的啥位置?【英文标题】:Where does the data live in a Multi-Container Dockerized application?数据在多容器 Dockerized 应用程序中的什么位置? 【发布时间】:2018-09-14 14:29:05 【问题描述】:

我正在尝试为不同的基于 php 的 Web 应用程序构建几个 Docker 映像,现在我一直使用 AWS 提供的 Sample Application 作为模板将它们部署到 Elastic Beanstalk。此应用程序包含两个 Docker 容器定义:一个用于 PHP 本身,另一个用于 nginx(充当反向代理)。

但是,我的 PHP 应用程序的源代码有效地部署在 Docker 映像之外 对我来说似乎有点奇怪。从上面链接的 Github 示例项目中可以看到,有一个名为 php-app 的文件夹包含所有 PHP 源文件,但这些不是容器定义的一部分。这两个容器只是来自 Dockerhub 的库存图像。所以为了部署它,仅仅上传Dockerrun.aws.json文件是不够的;您需要将此文件与 PHP 源文件一起压缩才能运行。在我看来,它可以(大致)用这个可视化树来表示:

*
|
|\
|  - PHP Docker Container
|\
|  - Linked Nginx Container
 \
   - Volume that Beanstalk auto-magically creates alongside these containers

由于这里的模型涉及使用两个 Docker 映像,以及一个独立于这些 Docker 映像的卷/文件系统,我不确定它是如何工作的。在我的脑海中,我一直在想,将我的 PHP 源文件和 PHP 放到一个通用的 Docker 容器中会更好/更容易,而不是像 Beanstalk 那样做任何魔术来将所有东西联系在一起。

而且我知道 Elastic Beanstalk 在这种情况下实际上只是充当 ECS 的门面,其中正在创建任务定义等。我对 ECS 的了解非常有限,但我想保留我的选项,以防我想手动创建 ECS 任务(例如,使用 Fargate),而不是依靠 Beanstalk 为我做这件事。而且我担心 Beanstalk 正在用那个卷做一些神奇的事情,如果我想走这条路的话,这会使手动编写任务定义变得困难。

当反向代理(无论是 Nginx 还是 Apache 或其他)位于单独的容器中时,在 Docker 环境中打包 PHP 应用程序的最佳做法是什么?谁能提供更好的解释(或纠正任何误解)这是如何工作的?我将如何在 ECS 中为 PHP 应用程序做与 Beanstalk 相同的操作?

【问题讨论】:

【参考方案1】:

您有多种选择来构建它。

最简单的方法是让一个服务 ecs 和两个容器 foreach Web 应用程序(一个容器用于 php 应用程序,一个容器用于 nginx)。 每个服务中唯一暴露的端口是带有ecs dynamic port 的nginx 80 端口。 每个暴露的服务都应该有一个 alb 将流量重定向到 nginx 端口。

在这种情况下,nginx 不用作负载均衡器,仅用于前端 Web 服务器。

编辑:

您的 DockerFile for php 应用程序应该是这样的:

...

# Add Project files.
COPY . /home/usr/src

...

对于开发模式,您的 docker-compose:

version: '3.0'
services:
  php:
    build:.
    depends_on:
...
    environment:
...
    ports:
...
    tty: true
    working_dir: /home/usr/src

   volumes:
      - .:/home/usr/src

然后在本地使用 docker-compose 并实时编辑容器中的文件。 并且在生产模式下,文件在构建时被复制到容器中。

是不是更清楚了?

【讨论】:

嘿,谢谢 sGeek,我的问题更多是关于数据(即 PHP 文件)应该放在哪里。我是否将它们捆绑在具有 PHP 可执行文件的同一个容器中?还是我将它们放在第三个“数据容器”中?还是有其他方法可以做到这一点……例如,将它们作为卷安装在主机上? (我认为这就是 Elastic Beanstalk 正在做的事情) php 文件位于您的 php Web 应用程序容器中。在开发模式下,您共享文件所在的卷,在生产模式下,您的文件在构建映像时被复制。是否回答您的问题?

以上是关于数据在多容器 Dockerized 应用程序中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章

我如何用本地数据填充dockerized MongoDB?

dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序

核心文件存储在 lxc 容器中的啥位置?

vs中的啥跟eclipse中部署Tomcat相似

无法从 docker 容器连接到数据库 [重复]

Dockerized Spring Boot 应用程序连接到主 MySQL [重复]