PHPモジュールのロードURLリライトの有効化と.htaccessファイルDocumentRootをWordpressのソースに向ける配置してシステムを動かすまでに、次のような問題や困難にぶつかるはずです。このサーバにすでに違うサイトをホストしていて、そのサイトがnginxで動いている場合、WordpressはApacheで動くので、困ったことになります。両方とも80ポートをリッスンしようとします。両方を同じサーバで動かすことは不可能ではありませんが、構成をひねらなければなりません(リッスンするポートを変更する)。ライブラリでも同じような衝突が発生するでしょう。動作しているアプリケーションがPHP4に依存していたら、厄介です。WordpressはPHP4をサポートしていないのです。PHP4とPHP5を同時に動かすのはとても難しいです。同じサーバで動いているアプリケーションは互いに分離(この場合はファイルシステムやネットワークのレベルで)されていませんので、衝突が起きてしまうのです。私たちがインストールしているのはWordpressです。最強のセキュリティレベルを誇るソフトウエアではありません。Wordpressをサンドボックス化して、ハッキングされてもほかのアプリケーションが影響を受けないようにできたら素晴らしいです。アプリケーションのアップグレードは既存ファイルの上書きを伴います。アップグレードの最中に何が起きるでしょうか。対象のシステムは停止するのでしょうか。アップグレードが失敗したらどうなるでしょう。失敗していたことがわかったらどうでしょうか。以前のバージョンにロールバックできるのでしょうか。一度すべてをセットアップしたら、システムの"スナップショット"が取れると便利です。スナップショットはバックアップできますし、ほかのサーバに移して、実行できます。可用性を確保するため複製して複数のサーバに配置するのもいいでしょう。配置を自動化して運用環境で動作させる前にテスト用のインフラで新しいバージョンのシステムをテストするのは素晴らしいやり方です。このようなやり方は通常Chef、Puppetというようなツールを使い、パッケージを自動的にサーバにインストールして、問題なく動作すれば、運用環境で全く同じ配置スクリプトを実行することで実現します。このやり方は99%うまくいきます。残りの1%の場合、すなわち、テスト環境への配置と運用環境への配置の間にリポジトリのパッケージが更新されると互換性のパッケージになってしまう可能性があります。その結果、運用環境のセットアップはテスト環境と異なってしまい、問題が発生する可能性が生まれます。配置のほんの小さな側面もコントロールしなければ(例えば、独自のAPTやYUMリポジトリをホストしなければ)、同じシステムを複数の環境に再現するのは難しいです。WordpressのCPU使用がおかしくなって、CPUサイクルをすべて使い尽くしてしまい、ほかのアプリケーションの実行をブロックしてしまったらどうなるでしょう。メモリを使い尽くしてしまったらどうでしょうか。ログの生成が暴走してデスクを使い尽くしてしまったらどうでしょう。考えるとアプリケーションが利用できるリソースに制限をかけられると便利そうです。DebianやCentOSのパッケージ、あるいはChefのレシピでWordpressの複雑なインストールステップを自動で実行してくれるかもしれません。これらの仕組みは安定的に動かすには複雑すぎます。いうのは、これらの仕組みは対象となるシステムのあり得る構成を考慮しなければならないからです。多くの場合、このような仕組みはクリーンな環境でのみ正常に動作します。ソフトウエアは簡単にきれいに除去できる必要があります。アプリケーションの配置は通常、既存の構成ファイルに変更を加え、状態(MySQLのデータやログ)を左右します。したがって、アプリケーションを完全に除去するのは難しいです。このような問題をどのように解決すればいいでしょうか。仮想マシン!個別のアプリケーションを分離された仮想マシンで動作させるとき、例えばAmazonのEC2を使うとき、ほとんどの問題は解決します。ひとつの仮想マシンにひとつのアプリケーションをインストールすることで完全な分離を実現できます。システムを好きなように準備して、AMIを作成すれば、このAMIを使って好きなだけインスタンスを作成できます。完全に再現性があります。完全に分離されているので、Wordpressのサーバがハッキングされても、ほかのインフラは影響を受けません。SSHのキーを散らかしたり、パスワードを再利用していれば別ですが。そんなことしていないですよね。仮想マシンは一定のCPUサイクル、メモリ、デスクスペースを確保します。この確保したリソース量を超えることはありません。アプリケーションの増加はEC2アプライアンスとして利用でき、AWSマーケットプレイスでワンクリックでインスタンス化できます。数分の再起動を必要としますが、それだけです。アプリケーションが必要なくなったら、仮想マシンを捨てればいいだけです。Netflixが行っていることは新しい仮想マシンを配置するだけです。ロードバランサの向き先を古い仮想マシンから新しい仮想マシンへ向けます。維持しなければならない状態をローカルに保存している場合はこの方法はうまくいきません。EBSのディスクはボタンのクリックでスナップショットが取れます。スナップショットはS3へバックアップされます。新しい問題があります。これは高価なやり方です。必要なアプリケーション分だけEC2のインスタンスを立ち上げるほどの金銭的な余裕はありますか。必要なインスタンスサイズを予測できますか。あとで追加のリソースが必要になったら、アップグレードするために仮想マシンを止めなければなりません。必要以上にリソースを確保してしまったら、お金を払いすぎてしまうことになります(SolarisのZonesはJoyentと同様動的にリソースをリサイズします)。仮想マシンに関連するオペレーションは遅いです。起動には数分かかりますし、スナップショットを取るのにも時間がかかります。イメージの作成にも時間がかかります。このような無駄な時間はありません。良い方法はないでしょうか。Dockerを使ってみましょう。DockerはプラットフォームプロバイダのdotCloudの人々が始めたオープンソースプロジェクトで今年のはじめに始まりました。技術的観点ではDockerは(Goで書かれている)ふたつの既存技術を使いやすくします。Containers。各プロセスを通常のUnixプロセスよりも高いレベルで分離して実行します。この仕組みにはコンテナ化という言葉が使われます。プロセスはコンテナの内部で実行される、と言います。コンテナは次の水準での分離をサポートします。コンテナのファイルシステムに特別にマウントしなければ、コンテナはサンドボックス化されたファイルシステムにのみアクセスできます(chrootに似ています)。コンテナは独自のデータベースを持ちます(例えば、コンテナのルートはホストのルートアカウントとは別になります)。当該コンテナ内のプロセスだけが見えます。コンテナは仮想ネットワークデバイスを持ち、仮想IPを持ちます。コピーオンライトなファイルシステムを実現する。DockerはAUFSをサポートしているカーネルが3.8以上のLinuxにインストールできます。概念的にはDockerはこれらの技術には依存していません。将来的には類似の技術で動作するようになるかもしれません。jails、ZFSといった技術です。現時点では前述の条件のLinuxにのみインストールできます。Dockerは興味深い技術なのでしょうか。Dockerはとても軽量です。仮想マシンを立ち上げるにはリソースがたくさん必要です。Dockerコンテナを起動するのに必要なCPUとメモリのオーバヘッドは小さく、とても素早く起動できます。通常のプロセスの起動と比べられるくらいです。コンテナの実行も高速で、イメージの作成やファイルシステムのスナップショット取得も同様に高速です。Dockerはすでに仮想化された環境でも動作します。VirtualBoxの中で動かすこともできるのです。実際、MacやWindowsでDockerを使うにはVagrantを使うのが有効です。DockerコンテナはポータブルでDockerが動くOSになら、どこにでも移動できます。UbuntuであれCentOSであれ、Dockerが動作するなら、コンテナを走らせることができます。前述した配置と運用に関わる問題のリストを振り返って、Dockerがどの程度役に立つかを見てみましょう。Dockerはアプリケーションをファイルシステムやネットワークのレベルで分離します。"本当"の仮想マシンで動作させているようです。好きなようにシステムを準備して(ログインしてapt-getですべてのソフトウエアをそろえる、またはDockerfileを使う)、イメージの変更をコミットします。すれば好きなだけ、イメージをインスタンス化し、ほかのマシンで全く同じ環境をセットアップできます。Dockerのコンテナは通常のプロセス分離よりも安全です。Dockerチームはいくつかのセキュリティ問題を発見して対処しています。DockerはCPUの利用を一定のCPUサイクルで制限できます。ディスクスペースの制限はまだ直接的にはサポートされていません。Indexがあります。これは単一のコマンドでインスタンスかできるDockerイメージのリポジトリです。zefhemel/clojure-replというコマンドを実行すれば、後は自動的にリポジトリからイメージを取り出して、インスタンス化してくれます。アプリケーションが必要なくなったらコンテナを破棄すればいいだけです。EC2の仮想マシンと同じです。新しいバージョンのアプリが乗っているインスタンスを起動し、ロードバランサを古い仮想マシンから新しい仮想マシンに向ければいいのです。Dockerはイメージのコミットとタグ付けをサポートします。EC2のスナップショットとは違い、一瞬で終わります。どのように使うかDockerをインストールしたとしましょう。Ubuntuコンテナ内でbashを実行するには次のようにします。/bin/bash"ubuntu"イメージが既にダウンロードされているか否かによって、DockerはUbuntuのイメージをダウンロードするか、既にローカルにあるイメージをコピーするかします。それから、Ubuntuコンテナ内で/bin/bashを実行します。コンテナ内では、普通のUbuntuのように作業をすることができます。新しいパッケージをインストールすることもできます。"hello"をインストールしてみましょう。world!いったん、終了してからもう一度Dockerコマンドを実行してみましょう。found何が起きたのでしょうか。helloコマンドはどこへいってしまったのでしょうか。上記のコマンドでは単純に真新しいUbuntuのイメージから新しいコンテナを起動しただけなのです。以前のコンテナで引き続き作業を続けるには、そのコンテナをリポジトリにコミットしなければなりません。新しく立ち上げたコンテナを終了し、立ち上げたコンテナのidを見てみましょう。psコマンドを実行すると、現在実行中のコンテナの一覧が見れます。-aはすでに終了しているコンテナの一覧が見れます。コンテナはそれぞれユニークなIDを持ちます。一覧にはコンテナが使ったイメージも表示されます。いつ作成されたか、現在の状態、公開しているポートとホストとのポートのマッピングをも表示します。最初に表示されたのが、"hello"がなかった、後に立ち上げたコンテナで、次が再利用したいと思っているコンテナです。このコンテナをコミットして、このコンテナから新しいコンテナを作成しましょう。world!ここではコンテナをリポジトリにコミットして(IDを使って)います。リポジトリはgitのリポジトリに似ています。タグの名前を付けなかったら(私のように)、"latest"という名前がつきます。imagesを実行します。Dockerには2、3のイメージ(例えば、ubuntuやcentos)しかありません。自分自身でイメージを作成することができます。ユーザのリポジトリはGithubライクな命名モデルに従います。Dockerのユーザ名はスラッシュとリポジトリ名で構成されます。上述したのはDockerイメージを作成するひとつの方法です。明確な方法もあります。Dockerfileを使う方法です。Dockerfileでイメージを作るDockerfileはベースのイメージからどのようにイメージを作成するかを記した単純なテキストファイルです。Githubにいくつかあげてあります。次に示す例では、イメージを実行し、SSHサーバをインストールしています。22見ての通り、本当に明白なやり方です。FROMコマンドはベースとなるイメージを指定します。上記の例では公式のイメージを指定していますが、先ほど作成したzefhemel/ubuntuを指定することもできます。RUNコマンドはイメージを構成するためのコマンドです。上記の例では、APTパッケージリポジトリをアップデートし、OpenSSHのサーバをインストールして、ディレクトリを作成し、rootアカウントにパスワードを設定しています。EXPOSEコマンドは22ポート(SSHのポート)を外部に公開します。このDockerfileをどのようにビルドしてインスタンス化するのか、見てみましょう。イメージをビルドします。Dockerfileのあるディレクトリで次を実行します。.これによって新しいSSHのイメージとともにzefhemel/sshリポジトリが作成されます。ビルドが成功すれば、次のコマンドでイメージをインスタンス化できます。-Dこれは前のコマンドとは違います。-dによってコンテナがバックグラウンドで動作します。bashを動かす代わりに、sshdデーモンを動かしています(フォアグラウンドで動かすには-D)。実行中のコンテナを確認してみましょう。49154->22コンテナが起動していることがわかります。PORTSに着目してください。ポート22を公開したのですが、ホストシステムのポート(49154)にマップされています。動作を確認してみましょう。root@23ee5acf5c91:~#成功しました。SSHサーバが実行されており、ログインできることがわかりました。SSHから抜けて、コンテナを停止してみましょう。23ee5acf5c91上述の通り、ポート22はホストの49154にマップされました。このマップはランダムです。特定のポートにマップするには、次のように-pをつけて実行します。-Dこうすることで2222にマップされます。イメージをユーザフレンドリにするにはDockerfileの最終業に次の1行を加えるといいでしょう。-DCMDはコマンドをビルドしたときでなく、インスタンス化したときに実行するようにします。次を実行すればいいだけになります。zefhemel/sshこれは前述のコマンドと一緒です。pushを実行します。runコマンドを使えば誰でも利用できます。Wordpressの例に戻りましょう。Dockerを使ってどのようにWordpressをコンテナ内で動かせばいいでしょうか。WordpressのイメージをビルドするにはDockerfileを作成する必要があります。(例えば、supervisordを使う)幸運なことに多くの人がすでに上記を実施しています。Fink氏のgithubのリポジトリにはWordpressのイメージをビルドするのに必要な情報がすべて含まれています。複雑なアプリケーションを簡単にかつ信頼でき、再現性があるかたちで配置する以外に、Dockerにはほかの使い方もあります。Dockerコンテナの内部でソフトウエアをビルドすることで、ビルドを明確に分離できます。ビルドされたソフトウエアのイメージは自動的にリポジトリに登録され、テスト環境や運用環境に配置されます。シンプルなPlatform-as-a-Serviceでたった100行未満のBashで書かれている。FlynnとDeisはオープンソースのPlatform-as-a-ServiceプロジェクトでDockerを使っている。ディスクトップ環境をDockerで実行する。論理的帰結としてDockerを採用したプロジェクトがCoreOSです。CoreOSは軽量なLinuxディストリビューションで、Dockerを使ってすべてのアプリケーションをインストールし実行します。systemdで管理されます。DockerはなんではないかDockerは信頼性のある配置作業を実現しますが、必要な機能をすべて備えた配置システムではありません。Dockerもコンテナ内のアプリケーションが動作するのとレベルで動作します。どのコンテナをどのサーバにインストールし、どのように実行するのかはDockerのスコープの範囲外です。同様に、複数のコンテナや物理サーバ、仮想マシンをまたいで動作するアプリケーションを制御するのもスコープ外です。コンテナに通信させるにはほかのアプリケーションがどのポートやIPで動作しているのかを判別する仕組みが必要です。etcdのようなツールやその他のサービス検出の仕組みが使えるでしょう。結論この記事で説明したことは生のままLXC、cgroups、AUFSを使っても実現できることです。簡単でもシンプルでもありません。Dockerは複雑なアプリケーションをコンテナにパッケージングして、簡単にバージョニングして配布できるようにします。その結果、現在広く普及している"本当"の仮想マシンと同等の柔軟さとパワーを軽量なLinuxコンテナで実現できるのです。物理サーバでも動作しますし、その逆も可能です。Dockerはウェブサイトから無償で入手できます。利用を始めるにはインタラクティブなスタートガイドを使うといいでしょう。プロジェクトのロードマップによれば、運用環境で使える初めてのバージョンは0.8で2013年10月にリリースされる予定。運用環境でも使われています。HemelはLogicBloxのエバンジェリストであり、プロダクトマネジメントチームの一員。LogicBloxは論理プログラミング、特にDatalogをベースにしたアプリケーションサーバやデータベースを開発している。IDEのVPをつとめていた。90年代からウェブアプリケーションの開発をしており、宣言的プログラミングを強く支持している。毎週火曜日に前週のまとめコンテンツがお送りいたします。25万人ものシニアデベロッパーのコミュニティーにぜひご参加ください。サンプルを見るあなたのメールアドレスはこちら国を選んでください。プライバシーポリシーに従って私の個人情報を扱うことに同意します。登録するとさまざまなことができます。アカウント登録をしてInfoQをお楽しみください。あなたの意見をお聞かせください。毎週火曜日に前週のまとめコンテンツがお送りいたします。25万人ものシニアデベロッパーのコミュニティーにぜひご参加ください。サンプルを見る様々なイノベーターとアーリーアダプターがお送りするテクノロジーの概要を見る。自分がまだ知らないことに気づいていないと知るあなたが興味のあるトピックスをいつでも最新な情報に。あなたのメールアドレスはこちら国を選んでください。プライバシーポリシーに従って私の個人情報を扱うことに同意します。よい世界へ私たちが暮らす世界を大切に思い、よりよいものにしたいと考えています。人のためのソフトウェア開発を加速し私たちのミッションを実現することで、この思いを成し遂げようとしています。私たちは利益の1%をさまざまな慈善団体に寄付しています。会社として、また従業員として、そうしたことの価値を強く信じているからです。with.プライバシーBTあなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。アドレス*Eメールを変更すると確認のメールが配信されます。会社名:現在の会社名をご入力ください。Other組織規模:現在の組織規模をご入力ください。2,501+国:現在の国を設定してください。Zimbabwe都道府県:現在の都道府県に設定してください。次の都道府県にアップデートする:ニュースレターを購読しますか?インダストリーメールを購読しますか?本Eメールに登録すると、以前より関心のあったトピックの関連情報をお送りする場合がございます。詳細はこちらのプライバシーポリシーをご覧ください。newsletter?新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。