php – 在Docker环境中使用Symfony进行生产

我想使用Docker-Compose在Docker上实现一个symfony应用程序.我将至少拥有以下容器:

> Nginx
> Rabbitmq服务器
> PHP-FPM
> MySQL
> Solr

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

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

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

我的生产选择有哪些?

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

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

3)我尚未探索过的东西?

我想允许对应用程序进行简单的更新 – 也许是脚本化的,但我也希望最大限度地减少停机时间 – 我可以使用haproxy或类似的东西 – 有其他人有任何经验在生产中运行多容器symfony应用程序吗?

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

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

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

我目前正在研究部署/ postdeploy webapp的替代方案,
 次优解决方案现在是一个简单的入口点bash脚本(传递给“docker run -d myimage php_entrypoint.sh”:

>准备环境
>下载和更新供应商
>将资源同步到cdn,更新db模式等
>运行应用程序服务器(在这种情况下,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 /消费者工作都很好的单个php映像.我也可以在不杀死容器的情况下重启php appserver.
此外,supervisord在管理“守护程序”流程方面非常聪明.

更新

webapp作为卷安装,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"
点赞