Docker初心者の私がDockerの理解を深めるために実施したことを、これから何回かに渡ってブログに残していきます。
今回は、Dockerfileなどを使わずに、nginx+phpfpm環境をDockerで作る手順です。
phpfpmがバンドルされているようなnginxのイメージもあると思いますが、今回は基本的な理解を深めるために、nginxとphpfpmを別のコンテナにして作成します。
環境
docker for mac 1.13
今回はdocekr for macを使っていますが、基本的なdocker runのコマンド等を使用しているため、他のバージョンやOSでも同じように実行できるかと思います。
imageのダウンロード
まず、nginxとphp-fpmのイメージをダウンロードします。
どういった名前のイメージがあるかは docker searchを使うと良さそうです。
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 5195 [OK]
OFFICIALが[OK]ですと公式イメージですので、最初は公式イメージを利用すると良さそうです。
イメージのダウンロードは docker pull を使用します。
$ docker pull nginx
$ docker pull php:5.6-fpm
イメージ名のみですと、そのイメージの最新版を取得します。
例えば、
$ docker pull php
ですと、PHP7を含んだイメージがダウンロードされます。
この場合、モジュール版でApacheだったりするので、上記のように自分の希望する環境のイメージをタグで指定すると良さそうです。
ファイルの作成(php)
nginxの設定ファイルとphpinfo用のファイルを置くディレクトリを作成します。
コンテナの中に置くこともできますが、変更が多いファイルはコンテナ外に置くのがDockerの理想とされています。
今回は、nginxの設定ファイルと、PHPファイルを外に置くようにします。
$ mkdir nginx
$ cd nginx
$ mkdir -p etc/nginx/conf.d/
$ mkdir -p var/www/html
$ echo "<?php phpinfo(); ?>" > var/www/html/index.php
ファイルの作成(nginx)
nginxでphp-fpmに接続する最低限の設定ファイルを作成します。
DocumentRootを指定、fastcgiとしてphpfpmの名前でtcp9000番ポートへ接続するように設定します。
server {
listen 80 default;
server_name _;
root /var/www/html;
index index.php index.html index.htm;
charset utf-8;
access_log off;
error_log off;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
コンテナの起動
まず、php-fpmを起動します。
ここでのポイントは、-vでphpファイルの場所を指定することです。
nginx側でDocumentRootをマウントしなくてOKです。
また、-dオプションでデタッチドモードになり、バックグラウンドで起動します。
※-dをつけないとフォアグラウンドで起動して、exitをするとプロセスが終了します。その場合、Ctrl+p,Ctrl+qとすると終了することなく抜けることができます。
$ docker run --name phpfpm-5.6 -v $(pwd)/var/www/html/:/var/www/html/ -dti php:5.6-fpm
次に、nginxを起動します。
起動時にphpfpmというserver.confに設定した名前でリンクするように指定します。
また、ここでのポイントとして、DocumentRootはnginx側で設定せず、設定ファイルのみを-vで指定します。
$ docker run --name nginx -v $(pwd)/etc/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 --link phpfpm-5.6:phpfpm -dti nginx
あとは、ブラウザで、http://localhost:8000 へ接続してphpinfoが表示されればOKです。
終了
下記コマンドで起動しているかどうかを確認できます。
$ docker ps
[/code]
下記で強制的に終了させることができますし、stopと指定することで停止することも可能です。
※docker run 時に --rmをつけると削除が自動的に行われます。
```sh
$ docekr rm -f nginx
不要になったイメージ(再利用しないもの)は、下記で削除できます。
$ docker rmi nginx
コンテナに入って調べたり、操作したりする
bashを起動して、中に入る場合です。
$ docker exec nginx bash
centosイメージを使ったコンテナで、シェルを起動せずに、パッケージをインストールしたい場合などは、execを使うことでインストールすることも可能です。
$ docker exec centos yum install nginx -y
おまけ
php-fpmにmysqliをインストールする手順です。
docker-php-ext-installで拡張モジュールがインストールできます。
今回は不要でしたが、mysqlへ接続する際にmysqliをインストールする場合は、下記のようにします。
$ docker exec -ti php-fpm-5.6 /usr/local/bin/docker-php-ext-install mysqli
まとめ
docker runは一時的に使用するためには大変便利です。
nginxを起動して、設定ファイルが問題無いか確認したり、mysqlをさっと起動してSQLを実行することもできます。
phpやRuby,Pythonなど複数の異なるバージョンのイメージを手軽に起動できるので、ほにゃららenvを使わなくても良かったりもします。
その反面、設定変更したりパッケージをインストールして使うには、そのままだとdocker execを使ったりbashをアタッチしたりしないといけません。
その場合はDockerfileを利用すると、手間を省略することができます。
Dockerfileについてはまた次回ブログに書いてみようと思います。
以上、Dockerでnginxとphp-fpmのコンテナを起動する手順でした。
今まさに読んでる本
コメントを投稿するにはログインしてください。