異なるコンテナでnginxとphpをドッキングすることの利点は何ですか?


18

私はDockerとKubernetesで作業を始めたばかりで、多くのスタックを見てきました。一部の人々は単一のイメージでnginx + phpを構築し、一部はnginxで画像を構築し、別の画像はphpで構築します(同じパスをマウントしてKubernetesの同じ展開内の両方のコンテナ)。

両方のnginx + phpを同じものにインストールする代わりに、2つのdockerイメージを構築する利点は何でしょうか?

回答:


19

通常、nginxを使用したPHPは、別のプロセスであるphp-fpmを使用して実行されます。

コンテナーごとに1つのプロセスのdocker(この点に関する詳細は回答の終わりを参照)のコアアイデアを維持することは、nginxプロセスとphp-fpmプロセスを別々のコンテナーに入れることには意味があります。

nginxとphp-fpmの間の通信はfastcgiを介して行われるため、php-fpmコンテナーは別のホスト上に置くこともできます。これにより、nginxの背後でphp-fpmコンテナーのクラスターを使用できます。

ここでコメントの壁がもう少し背景になった後、Dockerのドキュメントには、コンテナには1つの懸念しか持たないという考えについての段落があります。

Linuxコンテナ(lxc)の主なアイデアは、CPUおよびメモリレベルで分離されたネームスペースでプロセスを実行することです。これに加えて、Dockerはファイルシステムレベルで分離を追加します。
利点は、この名前空間内のプロセスの妥協により、他のプロセスのメモリの読み取りが許可されないため、ホスト上の他の妥協が防止されることです。

nginxとphp-fpmについて話しているとき、それらはペアで機能しますが、それぞれに懸念があり、nginxはHTTP部分、ルーティング、ヘッダー検証などを行い、php-fpmはコード解釈を行い、html部分をnginxに返します。両方が一緒に必須ではない単一のアプリケーションにサービスを提供するのが通常です。

コンテキストによっては、アプリケーションのスタック全体を含むコンテナを、たとえば開発者向けのワークステーションに用意する方が簡単な場合があります。しかし、実稼働環境での使用に理想的なのは、コンテナー内でのやり取りをできるだけ少なくすることです。同じコンテナー内でプロセスを監視し、supervisordを使用すると、ゾンビプロセスとログ処理の点で問題が発生します(ここでは、説明のみを目的とした例です)。

最後に、ドッカーページを引用して強調します。

「コンテナごとに1つのプロセス」が大まかな目安となりますが、それは難しくて速いルールではありません。コンテナをできるだけ清潔でモジュール式に保つために、最善の判断をしてください

すべてに当てはまる「銀の弾丸ルール」はありません。それは常に、コンテナ内の複雑さと、コンテナ自体を調整する複雑さのバランスです。


3
核となる考え方は、実際には「各コンテナには1つの懸念のみが必要」であり、「コンテナごとにオペレーティングシステムプロセスが1つしかないことは必ずしも真実ではない」です。docs.docker.com/engine/userguide/eng-image/...
user2640621

私はnginxの単一のモノリシックプロセスではないものphp-FPMで、アイデアを打つための近道だ認めるが、私の答えに懸念してプロセスを置き換え、それはまだですOK nginxのルーティング、PHP-FPMは解釈をしない
Tensibai

3
答えは通常、実際には1つのプロセスではなく、コンテナごとに1つのポートで1つのサービスです。一方、コンテナに複数の実行中のプロセスがある場合は、initプロセス、サービス管理、再起動、独立したロギング、独立したパッケージの依存関係を考慮する必要があり、少し複雑になります。また、スケーリング時に1:1マッピングが1:nマッピングに変わることもあります。
ジリクルダ

@Jiriが悪魔の擁護者を演じているので、postgres DBを使用するRailsアプリの前のapacheは同じコンテナー内に配置する必要がありますか?結局のところ、これは外部の視点での1つのサービスにすぎません。
テンシバイ

1
@JiriKloudaの回答が修正されました。コメントで提起されたすべてのポイントを伝えるのに十分詳細であることを願っています。
テンシバイ

4

実際、ここで欠けている点の1つは、水平方向のスケーラビリティです。ずっと前にこれに対処したJamie Alquizaの記事があります。

http://archive.is/pDzz0

要するに、より高いパフォーマンスを実現するためにphp-fpmを水平にスケーリングします。Nginx + php-fpmを一緒にスケーリングしてもメリットはありません。記事に記載されている内容を確認するために、ストレステスト(ツング、ガトリングなど。非常に古いおもちゃであるApache abはしないでください)を自分で行うことをお勧めします。私は個人的に、この記事が一般的に真実であることを証明したいくつかの現実世界の経験を持っています。

ただし、ベアメタルマシン/ VMには2つの欠点があります(Kubernetesにはない場合があります)。

  1. Nginxを構成してphp-fpmコンテナの変更を動的に検出する方法は?これは簡単な部分です。
  2. スケーリング後に同じボリューム/ファイルシステムを共有するにはどうすればよいですか?Nginxおよびphp-fpmコンテナは、一貫性を保つためにまったく同じコンテンツを読み取る必要があります。これにより、最もパズルの部分(そして最も楽しい部分)で作業することができます。

編集済み:2019年のほぼ半分になりました。同じポッド内の古いモデルphp-fpm + nginxの使用方法は異なります。サービスメッシュに精通している場合、nginx(またはNginmeshと呼ばれるもの)は、東西行きのトラフィックを処理するサイドカーとして機能します。純粋なphp-fpmはそれを行うことができませんでしたが、東西行きのトラフィックは主にサービス間または他の派手な機能間の認証に使用されました。


3

2つのコンテナを管理することを上回る意味のある利点はありません。プロセス間に1対1の関係があり、それらが単一の目的を果たす限り、それらを同じコンテナに入れます。


同じコンテナ上の異なる画像を意味しますか?
カルロスAS

同じコンテナでnginxとphp-fpmをどのように起動しますか?例を追加してください。
030

1
@ 030 ここの例
CarlosAS

2
@carlos開発目的で非常に有効な例です。この種のものを本番用にブロックします(コンテナ内でスーパーバイザーを実行すると、フットガンで簡単に回転できます)
Tensibai

私はその答えに同意しません。この理由は、1つのアプリのみをホストしているpostgresqlサーバーと通信するtomcatとmodセキュリティを備えたApacheサーバーが単一のコンテナに収まる必要があるためです。
テンシバイ

-1

利点は次のとおりです。バックエンドで複数のphp-fpmコンテナーを実行でき、ポートの数を介してPHPクラスターと呼びます。ポート9000、9001、9002などの例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.