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

我正在使用Docker-Compose在Docker上实现一个symfony应用程序。 我将至less有以下容器:

  • Nginx的
  • Rabbitmq服务器
  • PHP-FPM
  • MySQL的
  • Solr的

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

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

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

我在生产中有什么select?

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

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

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

我想允许对应用程序进行简单的更新 – 也许是脚本化的,但是我也想最大限度地减less停机时间 – 我可以使用haproxy或类似的东西来做到这一点 – 有没有人有生产中运行多容器symfony应用程序的任何经验?

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

不过,你可能在同一个容器上有Nginx + PHP-FPM。

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

我目前正在调查部署/ postdeploy的webapp的替代scheme,次优解决scheme现在是一个简单的入口点bash脚本(这是传递给“docker运行-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应用程序服务器而不杀死容器。 而且,supervisord在pipe理“守护进程”过程方面非常聪明。

更新

webapp以卷的forms挂载,docker-compose.yml位于项目根目录下,其中包含docker镜像configuration和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"