web-dev-qa-db-ja.com

Docker、Puppet、Vagrantを使用してLAMP Webアプリケーションを開発する方法

暗黒時代、LAMP Webアプリケーションの開発のための私の通常のセットアップは、マシンでローカルにテストすることでした。 PHP(私の場合)、データベースとWebサーバーはすべてネイティブにインストールされました。

サーバーはApacheとMySQLの標準インストールでセットアップされ、Webアプリのさまざまな部分に複数の仮想ホストがありました。ローカルマシンでの結果に満足したら、サーバーにログインしてgit pullステージング環境。私のマシンと同じようにサーバーでもすべてが機能していると仮定すると、実稼働環境でも同じことをします。

新しい始まり…

だから今、私は真新しいWebアプリケーションをゼロから始めています、そしてそれを「適切な方法」でやりたいです。 Docker、Vagrant、およびPuppet(およびChef。個人的にはChefの反復プロセスよりもPuppetの依存関係システムの方が好きですが)について説明しました。私が行ったすべての研究にもかかわらず、まだ答えを見つけることができないように見えるいくつかの質問があるようです:

Webサーバー(Apacheなど)、データベースサーバー(MySQLなど)、およびeachの各部分に個別のDockerコンテナーがある場合Webアプリケーション?

Webアプリケーションのpartsについて話すとき、mysite.comcontrolpanel.mysite.comなど。これらの「パーツ」は同じデータベースを共有します。

Dockerは、Webサーバーやデータベースサーバーなどの既成のコンテナーを提供しているように見えるため、少なくともこれらのコンテナーは別々のコンテナーに格納する必要があります。 Webアプリのさまざまな部分も別々のコンテナに入れる必要がありますか?

Dockerコンテナは、その中のソフトウェアを更新する必要がなく、交換可能に設計されているようです。私が失いたくない書き込みデータについてはどうですか?

データベースサーバーは、データベースのコンテンツに関連するファイル(バックアップしたいファイル)を管理します。 Webサーバーはログを作成し、Webアプリケーションはさまざまなファイルやキャッシュなどを管理します。これらのファイルはすべて、アプリケーションのコンテナーの外部に書き込む必要があります(更新時に置き換える可能性があるため)。 ?ホストマシンのファイルシステムに直接入りますか?または、別の「Dockerボリューム」に入れますか? Dockerボリュームに入る場合、データベース、Webサーバー、アプリケーションなどに別のボリュームを使用する必要がありますか?今のようにローカルマシンからSFTPを使用してコンテンツに簡単にアクセスできますか?ここでの利便性を失いたくありません!

開発サーバーと本番サーバーの両方で、Puppetを使用してDockerコンテナーを作成および管理することをお勧めしますか?

PuppetはDockerコンテナの直接管理をサポートしているようです。そのため、これはサーバーまたは本番環境(Vagrantを使用)をゼロから簡単にセットアップする合理的な方法のようです。

関連する質問をいくつかしたことを願っています。 LAMPのようなWebアプリの開発と生産のための適切な「ベストプラクティス」を取得することは素晴らしいことですが、私が見つけたものはあまりないようです。

69
Robert

Webサーバー(Apacheなど)、データベースサーバー(MySQLなど)、およびWebアプリケーションの各部分に個別のDockerコンテナーが必要ですか?

その質問に対する正しい答えはありません。本番環境でdockerを使用する場合は、本番環境で使用するように、開発環境でdockerコンテナーを実行してみてください。それ以外の場合は、Dockerコンテナを最も簡単な方法で使用します。

dockerハブ は、PHP、データベースなどのコンテナをすぐに使用できるようにするもので、簡単に使用できます。一方、それらを相互作用させるには、それらを一緒にlinkする必要があります。開発環境では、複数のコンテナを使用する場合は、 docker-compose を使用することをお勧めします。

もう1つの方法は、データベース、Webサーバー、およびphpを実行する運用マシン(マシンが1台しかない場合)に最も近いdockerイメージを構築することです。そのようなイメージのコンテナは、複数のプロセスを実行する必要があります。これはさまざまな方法で実現できます。 supervisor または phusion/baseimage をご覧ください。

Webアプリケーションの一部について話すときは、mysite.com、controlpanel.mysite.comなどのことを意味します。

それらを分離させることができます。これらのアプリがセッションを共有する必要がある場合は、セッションがすべてのユーザーがアクセス可能なデータベースまたはドッカーボリュームに保存されていることを確認してください。

Dockerコンテナーは、内部のソフトウェアを更新する必要がなく、交換可能に設計されているようです。私が失いたくない彼らが書くデータはどうですか?

Dockerにはボリュームと呼ばれるものがあり、コンテナー外のファイルシステムにデータを書き込むことができます。ボリュームを操作するにはさまざまな方法があります: ディレクトリをdockerホストからマウント コンテナーボリュームに、または データボリュームコンテナー 、または 名前付きボリューム

Dockerボリュームは重要な概念であり、時間をかけてそれらをマスターする価値があります。

Dockerホストからコンテナが使用するデータに簡単にアクセスしたい場合は、Dockerホストにディレクトリをマウントする方法があります。ファイルの許可と所有権に関して注意が必要かもしれませんが

バックアップについては、 dockerユーザーガイド を参照してください。ボリュームに関して知っておく必要があるすべての詳細が記載されています。

Puppetを使用して、開発サーバーと本番サーバーの両方でDockerコンテナーを作成および管理することをお勧めしますか?

ベストプラクティスは、運用環境で操作するのと同じ方法で開発環境で操作することです。すべての作業が本番環境で使用されない場合、開発環境にパペットを正しく設定することは意味がありません。 VM dockerを使用してプロビジョニングするVagrantfile を使用するのは非常に簡単です シェルのプロビジョニング ; IMHO puppet/chef/...は過剰です。


あなたは正しい質問をしていますが、すべての状況に合う答えはありません。私の見解では、物事を行うには2つの方法があります:

  • 開発環境で運用環境を正確に複製する
  • 開発環境を本番環境とは異なるものにし、できるだけシンプルで単純な状態に保ち、開発者が新しいツールを使用して生じる摩擦を感じないようにします
46
Thomasleveil

@Thomasleveilの回答はすでに非常に優れており、すべての重要な部分をカバーしていますが、いくつか追加のポイントを追加したいと思います。

Vagrant、Puppet/Chef、およびdocker-compose

VagrantでVirtual Machineをプロビジョニングする場合、通常PuppetまたはChefを使用して、サーバーに必要なパッケージをインストールします...いくつかのシェルスクリプトとともに。 PuPHPet は、仮想マシンベースのLAMP Stackを構成し、PuppetとVagrantが少し複雑なセットアップでどのように連携するかを学習するための優れたソースです。別の方法は Protobox です。

VMと同じようにVagrantでDocker containerを使用している場合。次に、vagrant upを使用すると、Dockerproviderを使用して本質的にdockerコンテナを実行します。 VagrantはDockerfileからコンテナーを構築するか、docker-composefig)のような既存のイメージを使用して実行します。

Vagrantを使用すると、ホストシステムが何であれ、セットアップの一貫性を保つことができるため、DockerセットアップにVagrantを選択する主な理由は、ユーザーまたはチームが部分的にWindows環境で作業している場合です( Host VM )。

OS Xを使用している場合はVirtual Box VMでdocker-composeを使用でき、Linuxを使用している場合はDockerをネイティブで使用できます。また、WindowsまたはOS Xのどちらを使用していても、sshを介してboot2docker(または別のDockerホストVM)にログインすることは常に可能です。

注:コンテナーにSSHで接続するべきではありませんが、それは別のトピックです

2015年2月現在

docker-composeは、私にとって少しきびきびと感じ、また、コンテナの起動、停止、再構築をより効率的に処理します。

Vagrantには、異なるホストVMを指定する利点があります。このような設定を希望する場合は、プロジェクトごとに。

注:また、Puppetビルドプロセスにより関連するDockerプロビジョニングツールもあります。


Webサーバー(Apacheなど)、データベースサーバー(MySQLなど)、およびWebアプリケーションの各部分に個別のDockerコンテナーが必要ですか?

Dockerコンテナーを使用する場合、基本的に単一の分離プロセスを実行しています。監視者の使用 回避する必要があります また、LAMPスタックには必要ありません。

私の答えは間違いなく:はい、別々のコンテナがあるはずです!


Webアプリケーションの一部について話すときは、mysite.com、controlpanel.mysite.comなどのことを意味します。

これはあなたのニーズに依存します。 12factor application documentationを読むことをお勧めします。このドキュメントでは、重要なことを非常に詳細に説明しています。


Dockerコンテナーは、内部のソフトウェアを更新する必要がなく、交換可能に設計されているようです。私が失いたくない彼らが書くデータはどうですか?

@Thomasleveilの答えに加えて、Amazon S3、SFTP、WebDAVなどのユーザーアップロード用に別のストレージバックエンドもお勧めします。

私の意見では、Webアプリケーションコンテナは、データベースおよびストレージバックエンド(サービス)にアクセスするクライアントアプリケーションのように扱われるべきであり、運用環境で実行する場合、ボリュームのデータに依存しません。


Puppetを使用して、開発サーバーと本番サーバーの両方でDockerコンテナーを作成および管理することをお勧めしますか?

Puppetのオーケストレーション機能については知りませんが、コンテナを構築するために、Vagrantを使用している場合、VagrantのネイティブDockerプロビジョニング機能により、Puppetは必要ありません。


ボーナス

上記のすべてのものについては、私の 12factor PHPアプリケーションテンプレート に基づいてYii 2.0フレームワークをドッキングするLAMPスタックDockerを使用すると、リバースプロキシまたはSeleniumテストコンテナーをプロジェクトに簡単にプラグインできます。これらは、ビルド前のイメージとして存在し、数分でダウンロードして構成できるためです。数秒で開始しました。

13
schmunk