2017-03-21 80 views
4

我正在尋找使用Docker-Compose在Docker上實現symfony應用程序。我將至少有以下容器:在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生產中的應用?

+0

我們目前採取的選項號,2 – Matteo

+0

@Matteo你如何執行更新的應用程序泊塢窗,compose.yml的摘錄?某種腳本來重建所有的圖像?並重新啓動容器? – ManseUK

+0

我們使用docker-cloud和github hook重建容器 – Matteo

回答

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,更新DB模式等
  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 /消費者工作都很好的單個php映像。我也可以在不殺死容器的情況下重新啓動php應用服務器。此外,supervisord在管理「守護進程」過程方面非常聰明。

修訂

該web應用程序被安裝爲一個卷,和搬運工-compose.yml是在項目的根目錄,其中包含搬運工圖像構造和symfony項目。 這是

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" 
+0

應用程序存儲在哪裏?在圖像中?或克隆爲入口點的一部分? – ManseUK

+0

我編輯了原始答案,將所有內容都放在一個地方,希望它有所幫助 – cernio