【问题标题】:Using Symfony in Docker Environment for Production在 Docker 环境中使用 Symfony 进行生产
【发布时间】:2017-08-13 05:31:07
【问题描述】:

我希望使用 Docker-Compose 在 Docker 上实现一个 symfony 应用程序。我至少会有以下容器:

  • Nginx
  • Rabbitmq 服务器
  • PHP-FPM
  • MySQL
  • 太阳能

目前我们也有使用上述设置的开发环境。

Symfony 应用程序存储在本地(主机),然后在 PHP-FPM 容器上使用一个卷,以便它可以读取应用程序 - 这很有效。我们bash进入php-fpm容器运行composer/app/console命令。

我们还手动运行消费者(Symfony 命令)来消费来自 rabbitmq 服务器的消息。

我在生产中有哪些选择?

1) 我可以创建一个运行应用程序的容器,然后允许其他容器使用它吗?我看到 php-fpm 容器需要访问应用程序代码 - 但我还想创建一个容器来运行消费者 - 将要运行的服务名称传递给容器 - 这意味着我可以拥有一个单一的图像可以灵活启动以处理来自任何队列的消息。此选项中的日志/缓存会发生什么情况?

2) 应用程序是否存储在每个需要它的图像中?这是我最不喜欢的选项,因为那时更新我需要构建每个图像的应用程序

3) 我还没有探索过的东西?

我想允许对应用程序进行轻松更新——也许是脚本化的东西,但我也想尽量减少停机时间——我可以使用 haproxy 或类似的东西来做到这一点——有其他人有运行多容器 symfony 应用程序的经验吗在生产中?

【问题讨论】:

  • 我们目前采用选项2
  • @Matteo 您如何对应用程序执行更新?某种脚本来重建所有图像?并重新启动容器?
  • 我们使用 docker-cloud 与 github hook 重建容器

标签: php symfony docker docker-compose


【解决方案1】:

我为每个服务运行一个容器。请记住,Docker 原则之一是“关注点分离”。

不过,您可能在同一个容器上安装了 Nginx + PHP-FPM。

要启动所有服务(在 dev 或 prod 环境中),您可以使用 docker-compose 和神奇的“SYMFONY_ENV=dev”环境变量来启动所有服务。 我建议在单独的容器中启动消费者,但可能使用不同的项目/日志/缓存路径。考虑到消费者在生产环境中使用共享 CPU/内存/磁盘运行时可能会影响在线性能。

我目前正在研究部署/后部署 webapp 的替代方案, 次优解决方案现在是一个简单的入口点 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 的原因是我必须复制/挂载我需要运行的 [program:] 部分,从而维护一个对 php-fpm 和 CLI/consumer 工作都有好处的单个 php 映像。我也可以在不杀死容器的情况下重新启动 php appserver。 此外,supervisord 在管理“守护进程”方面非常聪明。

更新

webapp挂载为一个volume,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"

【讨论】:

  • 应用程序存储在哪里?在图像中?还是克隆为入口点的一部分?
  • 我编辑了原始答案以将所有内容集中在一个地方,希望对您有所帮助
猜你喜欢
  • 2018-10-28
  • 2014-11-11
  • 2019-10-14
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多