転載元: http://dockone.io/article/117
【編集者注】この記事の著者は Geoffrey で、DevOps と Docker が好きな PHP Web 開発者です。この記事では、Docker を使用して PHP 開発環境を構築する方法を主に紹介し、Docker ベースの開発環境を構築するために単一コンテナーを使用するか複数コンテナーを使用するか、およびそれぞれの長所と短所についても説明します。 PHP 開発者に読むことをお勧めします。
現在、多くの開発者が仮想マシン開発環境の管理に Vagrant を使用しています。Vagrant は非常に優れていますが、多くの欠点もあります (主な欠点は、リソースが多すぎることです)。コンテナー テクノロジー、Docker、および Docker に類似したテクノロジーの登場により、この問題の解決は簡単になりました。
免責事項
boot2docker の動作方法により、この記事で説明されている方法は、お使いの環境では正しく動作しない可能性があります。 Linux 以外の環境でフォルダーを Docker コンテナーと共有する必要がある場合は、さらに詳細な点に注意する必要があります。実際に発生した問題を紹介するために、特にフォローアップ記事を書きます。
良い開発環境とは何ですか?
まず、良い開発環境とは何かを知る必要があります。私にとって、良い開発環境とは次の特性を備えている必要があります:
自由に使用できる。自由に環境を削除したり、新しい環境を作成したりできなければなりません。
クイックスタート。使いたいときにすぐに使えます。
更新が簡単。私たちの業界では物事の移り変わりが非常に早く、開発環境を新しいソフトウェア バージョンに更新するのは簡単でなければなりません。
Docker は上記のすべての機能とそれ以上の機能をサポートしています。コンテナーの破棄と再構築はほぼ瞬時に行うことができ、環境を更新するには、現在使用しているイメージを再構築するだけで済みます。
PHP 開発環境とは何ですか?
現在、Web アプリケーションは複雑であり、環境のシンプルさを確保するために、さまざまな制限を設ける必要があります。
今回は、Nginx、PHP5-FPM、MySQL を使用して Synmfony プロジェクトを実行します。コンテナー内でコマンド ラインを実行するのはさらに複雑なので、この点については次のブログに譲ります。
ペットと牛
私たちが議論したいもう 1 つの重要なポイントは、開発環境を複数のコンテナーにデプロイするべきか、それとも単一のコンテナーにデプロイするべきかということです。 どちらの方法にも独自の利点があります:
単一のコンテナーは配布と保守が簡単です。これらは独立しているため、すべてが同じコンテナー内で実行され、仮想マシンのようなものになります。ただし、これは、コンテナ内の何か (PHP の新しいバージョンなど) をアップグレードする場合、コンテナ全体を再構築する必要があることも意味します。
複数のコンテナにより、コンポーネントを追加する際のモジュール性が向上します。各コンテナにはスタックの一部 (Web、PHP、MySQL など) が含まれているため、すべてを再構築することなく、各サービスを個別にスケールしたり追加したりできます。
私は怠け者でノートに何か他のものを載せる必要があるため、ここでは単一のコンテナの方法のみを紹介します。
プロジェクトを初期化する
最初に行うことは、新しい Symfony プロジェクトを初期化することです。推奨される方法は、composer の create-project コマンドを使用することです。 Composer をワークステーションにインストールすることもできましたが、それは単純すぎます。今回はDocker経由で利用します。
私は以前、Docker コマンドに関する記事「make docker コマンド」を投稿しました (嘘です。もともとこの記事に書いていましたが、その後、分けたほうがよいと考えました)。
とにかく、読んでください。次に、コンポーザー コマンドがまだない場合は、独自のコンポーザー エイリアスを作成できます。
$ alias combos="docker run -i -t -v $PWD:/srv ubermuda/composer"
これで、Symfony プロジェクトを初期化できます:
$ combos create-project symfony/framwork-standard-edition SomeProject
素晴らしい !ここからが本当の作業になります。 (ブロガーが面白がってくれたバラブラの束は省略します...原文: Awesome. ハイタッチをして、コーヒーや好きな液体の薬を一杯飲んで、本格的な仕事の準備をしましょう。 )
コンテナ
標準の Symfony プロジェクトを実行する自己完結型のコンテナを構築するのは非常に簡単です。一般的に使用される Nginx、PHP5-FPM、および MySQL-Server をインストールし、事前に準備された Nginx 仮想マシンを投入するだけです。ホスト構成ファイル 、いくつかの構成ファイルをコピーすれば完了です。
このコンテナのソース コードは、GitHub の ubermuda/docker-symfony リポジトリにあります。 Dockerfile は、Docker がイメージを構築するために使用する設定ファイルです。 見てみましょう:
FROM debian:wheezy
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -y
RUN apt-get install -y nginx php5-fpm php5-mysqlnd php5 -cli mysql-server スーパーバイザー
RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
RUN sed -e 's/;listen.owner /listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
RUN sed -e 's/;listen.group/listen.group/' -i /etc/php5/fpm/pool .d/www.conf
エコー "ndaemon off;" /etc/nginx/nginx.conf
vhost.conf を追加 /etc/nginx/sites-available/default
visor.conf を追加 /etc/supervisor /conf.d/supervisor.conf
ADD init.sh /init.sh
EXPOSE 80 3306
VOLUME ["/srv"]
WORKDIR /srv
CMD ["/usr/bin/supervisord"]
debian を拡張します。 wheezy はこの基本イメージから開始し、一連の sed コマンドを通じて Nginx と PHP5-FPM を構成します。
RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
RUN sed -e 's/;listen.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
RUN sed -e 's/;listen.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
echo "ndaemon off;" >> /etc/nginx/nginx.conf
ここで 2 つのことを行う必要があります。 まず、PHP5-FPM と Nginx をフォアグラウンドで実行するように設定し、supervisord がそれらを追跡できるようにします。
次に、Web サーバーを指定されたユーザーとして実行し、ファイルのアクセス許可を処理するように PHP5-FPM を設定します。
次に、一連の構成ファイルをインストールする必要があります。最初は、Nginx 仮想ホスト構成ファイルです。
error_log /var /log/nginx/error.log;
root /srv/web;
Index app_dev.php;
location / {
try_files $uri $uri/ /app_dev.php?$query_string;
}
location ~ [^/] ... $_placeholder 変数)、ドキュメント ルートを /svr/web に設定し、アプリケーションを /srv にデプロイします。残りは標準の Mginx + PHP5-FPM 構成です。
コンテナー一度に 1 つのプログラムだけを実行するには、supervisord (または他のプロセス マネージャーが必要ですが、私は supervisord の方が好きです) が必要です。幸いなことに、このプロセス マネージャーは必要なすべてのプロセスを生成します。以下は、supervisord 設定の短いセクションです:
[supervisord]
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx
[program:php5-fpm]
command=/usr/sbin/php5 -fpm
[プログラム:mysql]
command=/usr/bin/mysqld_safe
[program:init]
command=/init.sh
autorestart=false
redirect_stderr=true
redirect_stdout=/srv/app/logs/init。 log
ここで行う必要があるのは、すべてのサービスを定義し、特別なプログラムである init プロセスを追加することです。これは実際のサービスではなく、起動スクリプトを実行する独自の方法です。
この起動スクリプトの問題は、通常、最初にいくつかのサービスを起動する必要があることです。たとえば、最初に MySQL を実行する場合に限り、いくつかのデータベース テーブルを初期化したい場合があります。解決策としては、起動スクリプトで MySQL を起動してからテーブルを初期化し、supervisord のプロセス管理に影響を与えないようにします。 MySQL を停止して、最後に Supervisord を開始する必要があります。
そのようなスクリプトは次のようになります:
/etc/init.d/mysql start
app/console doctrine:schema:update --force
/etc/init.d/mysql stop
exec /usr/bin/supervisord
見た目が醜いので、別の方法を試して、スーパーバイザーに実行させ、決して再起動しないようにしましょう。
実際の init.sh スクリプトは次のとおりです:
#!/bin/bash
RET=1
while [[ RET -ne 0 ]];
mysql -e 'exit' /dev/ null 2>> ;&1; RET=$?
done
DB_NAME=${DB_NAME:-symfony}
mysqladmin -u root create $DB_NAME
if [ -n "$INIT" ] then
/srv/$INIT
fi
まずスクリプト MySQL が起動するのを待ち、次に環境変数 DB_NAME (デフォルトは symfony) に基づいて DB を作成し、次に INIT 環境変数で実行するスクリプトを探して実行を試みます。この記事の最後では、これらの環境変数の使用方法について説明します。
イメージを構築して実行します
準備はすべて完了しました。必要なのは東風だけです。また、docker build コマンドを使用して、Symfony Docker イメージをビルドする必要があります:
$ cd docker-symfony
$ docker build -t symfony 。
これで、それを使用して Symfony プロジェクトを実行できます:
$ cd SomeProject
$ docker run - i -t -P -v $PWD:/srv symfony
この一連のオプションが何をするのか見てみましょう:
-i は対話モードを開始します。つまり、STDIO (標準入出力) が接続されています。現在のターミナル。これは、ログを受信したり、プロセスにシグナルを送信したりする場合に便利です。
-t はコンテナーの仮想 TTY を作成します。これは -i の良い友達であり、通常は一緒に使用されます。
-P は、指定されたすべてのポート (この場合はポート 80) を公開するように Docker デーモンに指示します。
-v $PWD:/srv 現在のディレクトリをコンテナの /srv ディレクトリにマウントします。ディレクトリをマウントすると、ディレクトリの内容がターゲット マウント ポイントで利用できるようになります。
前に述べた DB_NAME および INIT 環境変数をまだ覚えていますが、それらが使用される理由は、環境をカスタマイズするためです。 基本的に、docker run の -e オプションを使用してコンテナーに環境変数を設定でき、起動スクリプトが環境変数を取得します。したがって、DB の名前が some_project_dev の場合は、次のようにコンテナーを実行できます。
$ docker run - i - t -P -v $PWD:/srv -e DB_NAME=some_project_dev symfony
INIT 環境変数はより強力で、起動時に指定されたスクリプトを実行できるようになります。たとえば、composer install コマンドを実行してデータベース スキーマを設定する bin/setup スクリプトがあるとします:
#!/bin/bash
composer install
app/console doctrine:schema:update --force
Use -e を使用して実行しますit:
$ docker run -i -t -P
-v $PWD:/srv
-e DB_NAME=some_project_dev
-e INIT=bin/setup
-e オプションは docer run で複数回使用できることに注意してください。とてもクールに見えます。さらに、起動スクリプトには実行権限 (chmod +x) が必要です。
ここで、curl 経由でコンテナにリクエストを送信し、すべてが期待どおりに動作しているかどうかを確認します。まず、Docker によってコンテナーのポート 80 にマッピングされたパブリック ポートを取得する必要があります。 docker port コマンドを使用します:
$ docker port $(docker ps -aql 1) 80
0.0.0.0:49153
docker ps -aql 1このコマンドは、最後のコンテナの ID を簡単に取得できます。この例では、Docker はコンテナのポート 80 をポート 49153 にマップします。カールさせて見てみましょう。
$curl http://localhost:49153
このファイルへのアクセスは許可されていません。詳細については、app_dev.php を確認してください。
ローカルホスト (翻訳者注: コンテナのローカルホスト) から開発コントローラーにアクセスしない場合、 Symfony のデフォルトのエラーメッセージ。これは完全に正常です。コンテナ内からカールリクエストを送信していないため、フロントコントローラーの web/app_dev.php からこれらの行を削除しても安全です。
// このチェックにより、運用サーバーに誤ってデプロイされたフロント コントローラーへのアクセスが防止されます。
// これを削除したり、拡張したり、より洗練されたものを作成したりしてください。
if (isset($_SERVER['HTTP_CLIENT_IP'] )
|| isset($_SERVER['HTTP_X_FORWARDED_FOR'])
|| !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1' )) || php_sapi_name() === 'cli-server')
) {
header('HTTP/1.0 403 Forbidden');
exit('このファイルへのアクセスは許可されていません。'.basename(__FILE__ を確認してください) ).' 詳細については、');
}
これらの行は、localhost の外部からの開発コントローラーへのアクセスを防ぎます。
これで、curl するか、ブラウザを使用して http://localhost:49153/:
result.png
にアクセスすると、正常に動作するようになります。簡単です! これで環境をすぐに起動して更新できるようになりましたが、まだ改善が必要な領域がたくさんあります。
元のリンク: Docker を使用した PHP 開発環境 (翻訳者: He Linchong 査読者: Guo Lei)
以上、Docker をベースにした PHP 開発環境をさまざまな側面を含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。