在Docker环境下将Symfony用于生产环境

6
我想在Docker上使用Docker-Compose实现Symfony应用程序的部署。我至少需要以下容器:
- Nginx - Rabbitmq服务 - PHP-FPM - MySQL - Solr 我们目前正在使用以上设置进行开发环境。
Symfony应用程序存储在本地主机上,然后在PHP-FPM容器上使用卷来读取应用程序 - 这很有效。我们使用bash进入php-fpm容器来运行composer / app / console命令。
我们还手动运行从rabbitmq服务器中消费消息的消费者(Symfony命令)。
我的生产环境有哪些选择?
1)我可以创建一个单独的容器来运行应用程序,然后允许其他容器使用它吗?我看到php-fpm容器需要访问应用程序代码 - 但我也想创建一个容器来运行消费者 - 将要运行的服务名称传递给容器 - 意味着我可以拥有一个单一的映像,可以灵活地启动以处理来自任何队列的消息。这种选择中日志/缓存会怎样?
2)将应用程序存储在每个需要它的镜像中?这是我最不喜欢的选项,因为那么,要更新应用程序,我需要构建每个镜像。
3)还有一些我尚未探索的东西?
我想允许轻松更新应用程序 - 可能是通过脚本实现,但我也想将停机时间最小化 - 我可以使用haproxy或类似的工具来做到这一点 - 其他人是否有在生产环境中运行多个容器的Symfony应用程序的经验?

我们目前采用选项2。 - Matteo
@Matteo,你是如何更新应用程序的?需要使用某种脚本来重建所有图像并重新启动容器吗? - Manse
我们使用Docker Cloud,结合GitHub钩子重新构建容器。 - Matteo
1个回答

2
我为每个服务运行一个容器。请记住,Docker 的原则之一是“关注点分离”。
虽然您可以在同一个容器上运行 Nginx + PHP-FPM。
要启动所有服务(在开发或生产环境中),您可以使用 docker-compose 和神奇的“SYMFONY_ENV=dev”环境变量来启动所有东西。 我建议将消费者启动在单独的容器中,但具有不同的项目/日志/缓存路径。请注意,如果消费者与共享 CPU/内存/磁盘运行,则可能会影响在线性能。
我目前正在调查部署/发布 Web 应用程序的替代方案, 目前的次优解决方案是一个简单的入口点 bash 脚本(通过“docker run -d myimage php_entrypoint.sh”传递),其中包括以下步骤:
1.准备环境 2.下载和更新供应商 3.同步资源到 CDN,更新数据库架构等 4.运行应用程序服务器(在这种情况下为 php-fpm,我使用 supervisord 完成任务)
结果如下:
#$OPTIMIZE is an ENV-propagated or a calulated variable

su -c "php composer.phar install $OPTIMIZE" webmgr

cp -f web/HTACCESS_${SYMFONY_ENV} web/.htaccess

/usr/bin/supervisord -c /etc/supervisord/supervisord.conf

我使用supervisord的原因是需要复制/挂载需要运行的[程序:]部分,从而维护一个适用于php-fpm、CLI/consumer工作的单个php image。我还可以在不关闭容器的情况下重新启动php appserver。 此外,supervisord非常擅长管理“守护进程”。
更新: Web应用程序被挂载为卷,并且docker-compose.yml位于项目根目录中,其中包含docker映像配置和Symfony项目。 以下是docker-compose.yml的摘录。
webapp_fpm:
  image: ...  
  volumes:
    - ./symfony:/var/www/html
    - ./docker-conf/supervisord:/etc/supervisord
    - /var/log/appname/symfony:/var/log/symfony
  entrypoint: "/bin/bash php_entrypoint.sh"

应用程序存储在哪里?是在镜像中还是作为入口点的一部分克隆? - Manse
我编辑了原始答案,把所有内容都放在了一个地方,希望能有所帮助。 - cernio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接