nginx、php5-fpm、php5-mysqlの導入と準備
次にsusumutani3/iotkaji:v1イメージを基にして、nginxとPHP関連モジュールをインストールしたイメージを作成します。MySQLと違ってインストール中にパスワード設定することはないため、ここからはDockerfileを使用します。ホストOS上で適当なディレクトリを作成します。
$ mkdir ~/iotkaji_docker
作成したディレクトリに、次のDockerfileと起動用シェルと接続確認用テストファイルを置きます。
# Dockerfile for IoTかじってみよう nginx,php5-fpm,php-mysql
FROM susumutani3/iotkaji:v1
MAINTAINER Susumu Taniguchi
RUN apt-get -y -q update
RUN apt-get -y -q install nginx
RUN apt-get -y -q install php5-fpm
# /etc/nginx/sites-available/defaultの変更
# オリジナルのファイルを事前に退避します
RUN cp -p /etc/nginx/sites-available/default /etc/nginx/sites-available/default.org
# server{}内のindexの設定を追加します。
RUN sed -i -e "s/index index.html index.htm;/index index.html index.htm index.php;/g" /etc/nginx/sites-available/default
# location ~\.php${}のコメントアウトは後ほどコンテナ実行後に編集します。
RUN apt-get -y -q install php5-mysql
# /etc/php5/fpm/php.iniの変更
# オリジナルのファイルを事前に退避します
RUN cp -p /etc/php5/fpm/php.ini /etc/php5/fpm/php.ini.org
# 過去のphpとの互換性のためのパラメータcgi.fix_pathinfoについて、コメントアウトをはずして値を0にします。
RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" /etc/php5/fpm/php.ini
# MySQLサーバーへ接続するためのデフォルトソケットのパスを記入します。
RUN sed -i -e "s/pdo_mysql.default_socket=/pdo_mysql.default_socket=\/run\/mysqld\/mysqld.sock/g" /etc/php5/fpm/php.ini
# 接続確認用テストファイル
ADD test.php /usr/share/nginx/html/test.php
# 起動用シェル 設定ファイルを編集してから使うためCMDの引数にはまだしない
ADD init.sh /usr/local/bin/init.sh
RUN chmod 755 /usr/local/bin/init.sh
CMD ["/bin/bash"]
#!/bin/bash service nginx start service php5-fpm start /usr/bin/mysqld_safe & exec /bin/bash
<?php phpinfo(); ?>
作成したDockerfileを使用して、リポジトリ名とタグ名が susumutani3/iotkaji:v2というイメージを作成します。
$ sudo docker build -t susumutani3/iotkaji:v2 ~/iotkaji_docker
イメージが作成できていることを確認します。
$ sudo docker images
作成したイメージのコンテナを実行します。
$ sudo docker run --name settingup2 -it -p 80:80 susumutani3/iotkaji:v2
nginxの設定
nginxでPHPを利用できるようにするための設定変更を行います。
実行したコンテナ上で、/etc/nginx/sites-available/defaultのlocation ~\.php${}のコメントアウトをはずします。
Container> vi /etc/nginx/sites-available/default
変更箇所:54行目から64行目のlocation ~\.php${}のコメントアウトをはずします。
また、fastcgi_passの設定を行うのですが、php5-fpmを使用するため、php5-cgi用の設定はコメントアウトのままにしておきます。
54 #location ~ \.php$ {
55 # fastcgi_split_path_info ^(.+\.php)(/.+)$;
56 # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
57 #
58 # # With php5-cgi alone:
59 # fastcgi_pass 127.0.0.1:9000;
60 # # With php5-fpm:
61 # fastcgi_pass unix:/var/run/php5-fpm.sock;
62 # fastcgi_index index.php;
63 # include fastcgi_params;
64 #}
54 location ~ \.php$ {
55 fastcgi_split_path_info ^(.+\.php)(/.+)$;
56 # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
57
58 # With php5-cgi alone:
59 # fastcgi_pass 127.0.0.1:9000;
60 # With php5-fpm:
61 fastcgi_pass unix:/var/run/php5-fpm.sock;
62 fastcgi_index index.php;
63 include fastcgi_params;
64 }
このとき、24行目のrootのあとに書かれたディレクトリが、HTMLコンテンツを置くディレクトリになります。
24 root /usr/share/nginx/html;
保存します。
稼働確認
コンテナ上でMySQLとnginxとphpモジュールを起動します。
Container> /usr/local/bin/init.sh
次にホストOS上のブラウザでhttp://localhost/test.phpへアクセスします。図のような画面が表示されたら、nginxとPHPが有効になっています。
もしくはVirtualboxのような仮想環境のゲストOSとしてUbuntuの環境を構築している場合は、別のターミナルから次のコマンドを実行します。
$ sudo apt-get install w3m $ w3m http://(ゲストOSのIPアドレス)/test.php
うまくアクセスできなかったときは、次の場所にあるnginxのアクセスログを調べるとヒントが得られるでしょう。
/var/log/nginx/access.log /var/log/nginx/error.log
catコマンドによる出力例は次の通りです。
Container> cat /var/log/nginx/access.log 127.0.0.1 - - [11/Aug/2015:01:29:57 +0900] "GET /test.php HTTP/1.1" 200 22750 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0" 127.0.0.1 - - [11/Aug/2015:01:34:38 +0900] "GET /test.php HTTP/1.1" 200 22745 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0" Container> cat /var/log/nginx/error.log 2015/08/11 00:58:26 [error] 10163#0: *1 directory index of "/var/www/html/" is forbidden, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost" 2015/08/11 01:00:34 [error] 10268#0: *1 directory index of "/var/www/html/" is forbidden, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"
MySQLとnginxとPHP関連モジュールの導入と設定ができた状態になりました。
コンテナイメージを保存するために、MySQLとnginxとPHP関連モジュールを停止してから、Ctrl+p qでコンテナから抜けます。
Container> service nginx stop Container> service php5-fpm stop Container> mysqladmin shutdown --password=MySQL導入時に設定したrootのパスワード
コンテナを抜けてから、v1と同じようにホストOS上で次の一連のコマンドでイメージを保存します。
$ sudo docker stop settingup2 $ sudo docker commit settingup2 susumutani3/iotkaji:v3 $ sudo docker rm settingup2
