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

时间:2018-04-04 21:48:20

标签: php amazon-web-services docker elastic-beanstalk amazon-ecs

我正在尝试为不同的基于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 个答案:

答案 0 :(得分:0)

您可以通过多种方式进行构建。

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

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

编辑:

您的DockerFile for php应该是这样的:

...

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

...

对于dev模式你的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并在容器中实时编辑您的文件。 在生产模式下,文件在构建时被复制到容器中。

更明确吗?