2016-11-02 7 views
0

Dockerの新製品の種類私は設計に関する質問があります。 メインアプリケーションディレクトリ内の他のコンテナで使用されているデータや情報をビルドで更新する必要があるPHPアプリケーションをDockerで展開する最良の方法は何ですか?Dockerデプロイメントアップデート共有ボリューム

例(アプリのsymfonyの種類を簡素化):

- application 
    - app 
    - src 
    - vendor 
    - conf 
    - conf/vhost.conf 
    - web/assets/* 

する最初の試みは、2枚の画像

  • を構築することでした/のは、唯一の2サービス

    - php-fpm 
    - nginx 
    

    1を簡素化しましょうphp-fpm:with

ADD。/var/www/htmlと設定/プロジェクト/

VOLUME/var/www/htmlと設定/プロジェクト/

ベンダー(作曲)Dockerfile

に私が到達することができた、そのようにインストールの/ var/WWW/HTML /プロジェクト/ nginxの上

volumes_fromのPHP-FPM

=> [構成および資産など

しかし、もし私が間違っていないのであれば、それは次のビルドでは私のイメージがVOLUME/var/www/html/project /を更新しないためですボリューム) =>私のコードは決して更新されません。

2 /それから私はそれをやってしまった:nginxの上のPHP-FPM:

- providing the last code base in the image: COPY . /data/image/app 
- creating a named volume: docroot 
- mount docroot on php-fpm 
- adding a rsync on the entrypoint to sync /data/image/app to docroot:/var/www/html/project (with the good excludes that I needed) 
- doing the vendors(composer) install in the entrypoint 

=>は、まだvolumes_fromを使用。

私はしたいので重要です:いくつかの構成ファイルおよび/またはリソースを使用します、私はSolrのを追加する必要があり

- the conf/vhost.conf 
- the assets 
- maybe other stuff 

など

3 /私は別のアプローチがあるとし具体的には、私は各画像に必要なものを追加することになります。

ビルドプロセスの複雑さが増えると思いますが、それは意味があります。

だから、私は何かを逃したと思いますか?アプローチ2/3/4、

ありがとうございました!

答えて

1

あなたの質問は、静的ファイル資産に関するものです。いくつかのフレームワークとプロジェクトでは、これらを独自のコンポーネントと非常によく似ています。 phpの世界では、php-fpmアプリケーションサーバは通常静的ファイルを処理しません。それは、nginxのようなWebサーバーのコンポーネントに任せます。これは、単独では問題ではありません。実際、それは良い習慣です。

唯一の理由は、php-fpmとnginxの間に分離レイヤーを導入していることです。

php-fpmとnginxの間に隔離が導入されている別の非ドッキング状態を考えると、同じ問題が発生します。この例では、自分のnginxサーバーをデータセンターのDMZで実行させ、php-fpmはデータセンター内のファイアウォールの背後にあるアプリケーションサーバーとして機能します。そのnginxは、どのようにPHPプロジェクトの静的ファイルを提供しますか?

私は、静的資産はであり、ほとんどと考えることができると述べました。この2ノードの例では、デプロイメント中の別のステップを使用して、DMZ内のnginxサーバー上の静的ファイルを生成することができます。これは、rsyncを実行してphp-fpmとnginxの両方のコンテナにアクセスできるボリュームにデータを入力するソリューション#2とは異なります。

さらに別の解決策は、これらの静的資産を処理するphp-fpmハンドルを作成することです。これはもちろん、php-fpmは静的ファイルを提供するために構築されていないため、ベストプラクティスとはみなされません。それはできますが、最適化が不十分です。このパフォーマンス・ヒットは、nginxファイル・キャッシングを使用することで軽減できます。

あなたの3番の解決策もかなり実行可能です。また、あなたのプロジェクトに2つの画像をの代わりにビルドさせることもできます。最初の1つは、すべてのPHPコードADDedを持つ通常のPHP画像です。 2番目はnginxベースイメージに基づいており、プロジェクトに必要な静的ファイルのみを追加します。

ベストプラクティスとはみなされませんが、いくつかのプロジェクトでは、同じコンテナ内でnginxとphp-fpmの両方を実行することが適切な場合があります。あなたのnginxの設定が文字通り静的ファイルを提供していて、php-fpmにリバースプロキシをしている場合、そのプロセスの対を一つの論理サービスとして扱うことができます。 supervisord、runitなどのプロセスマネージャを実行する必要があります。

+0

Thx!あなたのDMZとのアナロジーは面白いです。仰るとおりです。 #3は2枚の画像で計画されました。私はphp-fpmを拡張でき、nginxは拡張できないようにしたい。 私は決定を下すためにまだ完全にはっきりしていない2つの事柄を見ています。 - rsyncの方法(複数のコンテナ、同時に起動、またはグローバルボリューム(Swarm)など)を使用して明白な落とし穴がありますか? - 静的なファイル以上はどうですか?私は複数のサービスを持っています #3は最もクリーンなパスだと思いますが、#2はDockerの世界で有効な実用的なアプローチですか? – Plopix

+0

rsyncの複数のコピーを実行する限り、私はそうではありません。 rsyncの複数のコピーを実行することを心配している場合は、ここで説明するように単純なロックファイルロジックを実装できます:http://stackoverflow.com/questions/9390134/rsync-cronjob-that-will-only -run-if-rsync-isnt-alreadynt-running swarmを使用しているときにグローバルボリュームの概念はありませんが、ボリュームを何らかの方法でバックアップすることはできますネットワークファイルシステムのrt。 – programmerq

+0

あなたのコードはもはやあなたのDockerイメージの一部ではないので、私は#2のアプローチがまったく嫌いです。 画像は自己完結型である必要があります。これは、プロジェクトのビルド成果物でなければなりません。画像からコードを取り除くと、もはや独自の画像を配布することはできません。 – programmerq

関連する問題