我正在尝试为不同的基于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相同的操作?
答案 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并在容器中实时编辑您的文件。 在生产模式下,文件在构建时被复制到容器中。
更明确吗?