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

时间:2017-03-21 13:46:20

标签: php symfony docker docker-compose

我希望使用Docker-Compose在Docker上实现一个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应用程序的经验在生产?

1 个答案:

答案 0 :(得分:2)

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

但是,您可能在同一容器上安装了Nginx + PHP-FPM。

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

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

  1. 准备环境
  2. 下载和更新供应商
  3. 将资源同步到cdn,更新数据库架构等
  4. 运行应用程序服务器(在这种情况下是php-fpm,我使用supervisord来完成任务)
  5. 结果如下:

    #$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非常聪明地管理" daemonized"过程

    已更新

    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"