Mac版Dockerを使って開発環境の構築 #Nginx + php-fpm

2017年2月13日

Docker PHP サーバー テクノロジー

今まで、手持ちの開発マシンであるMacBookAirにVirtualboxを使ってローカル開発環境を構築してきていたんですが、VMイメージの容量が毎回大きくなりすぎて、開発環境を複数持つと、必ずPCのディスク容量がオーバーしていて困っていました。 もちろん、外部HDDでもつなげて作業するといいと思うんだが、持ち運びなどする事を考えると非常に不便な為、Dockerの環境はイメージがさほど大きくなりすぎず、エコシステムなわけです。 前回はMac版Dockerのインストールを行ったんですが、その後、LAMP環境を構築したいんですが、今回はNginx+PHPの環境を構築したいと思います。

イメージを検索

Dockerには、Docker.ioという共有サーバーが存在しており、ここからすでに構築されているイメージをダウンロードすることができます。 とりあえず、どのイメージをダウンロードするか検索してみましょう。 ※2017.2.7時点

ubuntuの検索

$ docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating s... 5485 [OK] ubuntu-upstart Upstart is an event-based replacement for ... 69 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 69 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC sessi... 40 [OK] ubuntu-debootstrap debootstrap --variant=minbase --components... 27 [OK] torusware/speedus-ubuntu Always updated official Ubuntu docker imag... 27 [OK] nickistre/ubuntu-lamp LAMP server on Ubuntu 14 [OK] nuagebec/ubuntu Simple always updated Ubuntu docker images... 13 [OK] nickistre/ubuntu-lamp-wordpress LAMP on Ubuntu with wp-cli installed 9 [OK] nimmis/ubuntu This is a docker images different LTS vers... 6 [OK] maxexcloo/ubuntu Base image built on Ubuntu with init, Supe... 2 [OK] darksheer/ubuntu Base Ubuntu Image -- Updated hourly 2 [OK] admiringworm/ubuntu Base ubuntu images based on the official u... 1 [OK] jordi/ubuntu Ubuntu Base Image 1 [OK] labengine/ubuntu Images base ubuntu 0 [OK] datenbetrieb/ubuntu custom flavor of the official ubuntu base ... 0 [OK] lynxtp/ubuntu https://github.com/lynxtp/docker-ubuntu 0 [OK] widerplan/ubuntu Our basic Ubuntu images. 0 [OK] esycat/ubuntu Ubuntu LTS 0 [OK] webhippie/ubuntu Docker images for ubuntu 0 [OK] teamrock/ubuntu TeamRock's Ubuntu image configured with AW... 0 [OK] vcatechnology/ubuntu A Ubuntu image that is updated daily 0 [OK] konstruktoid/ubuntu Ubuntu base image 0 [OK] uvatbc/ubuntu Ubuntu images with unprivileged user 0 [OK] dorapro/ubuntu ubuntu image 0 [OK]

nginxの検索

$ docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 5238 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 936 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 340 [OK] million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 75 [OK] webdevops/php-nginx Nginx with PHP-FPM 69 [OK] maxexcloo/nginx-php Framework container with nginx and PHP-FPM... 58 [OK] bitnami/nginx Bitnami nginx Docker Image 22 [OK] evild/alpine-nginx Minimalistic Docker image with Nginx 11 [OK] gists/nginx Nginx on Alpine 8 [OK] million12/nginx Nginx: extensible, nicely tuned for better... 8 [OK] webdevops/nginx Nginx container 7 [OK] maxexcloo/nginx Framework container with nginx installed. 7 [OK] blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 4 [OK] 1science/nginx Nginx Docker images that include Consul Te... 4 [OK] ixbox/nginx Nginx on Alpine Linux. 3 [OK] drupaldocker/nginx NGINX for Drupal 2 [OK] dock0/nginx Arch container running nginx 2 [OK] xataz/nginx Light nginx image 2 [OK] servivum/nginx Nginx Docker Image with Useful Tools 2 [OK] frekele/nginx docker run --rm --name nginx -p 80:80 -p 4... 2 [OK] tozd/nginx Dockerized nginx. 1 [OK] watsco/nginx nginx:1.11-alpine 0 [OK] unblibraries/nginx Baseline non-PHP nginx container 0 [OK] c4tech/nginx Several nginx images for web applications. 0 [OK] funkygibbon/nginx nginx + openssl automated build, customisa... 0 [OK]

centosの検索

$ docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 3070 [OK] jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8... 57 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.8 x86_64 - Apache / PHP-FPM / P... 25 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 23 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 18 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] egyptianbman/docker-centos-nginx-php A simple and highly configurable docker co... 6 [OK] nathonfowlie/centos-jre Latest CentOS image with the JRE pre-insta... 5 [OK] centos/mariadb55-centos7 4 [OK] centos/tools Docker image that has systems administrati... 2 [OK] centos/redis Redis built for CentOS 2 [OK] harisekhon/centos-java Java on CentOS (OpenJDK, tags jre/jdk7-8) 2 [OK] freenas/centos Simple CentOS Linux interactive container 1 [OK] blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] harisekhon/centos-scala Scala + CentOS (OpenJDK tags 2.10-jre7 - 2... 1 [OK] darksheer/centos Base Centos Image -- Updated hourly 1 [OK] timhughes/centos Centos with systemd installed and running 1 [OK] repositoryjp/centos Docker Image for CentOS. 0 [OK] wenjianzhou/centos centos 0 [OK] vcatechnology/centos A CentOS Image which is updated daily 0 [OK] kz8s/centos Official CentOS plus epel-release 0 [OK] termbox/centos CentOS 0 [OK] grayzone/centos auto build for centos. 0 [OK] januswel/centos yum update-ed CentOS image 0 [OK]

イメージのダウンロード

とりあえず、今回は「ubuntu」をダウンロードしてそれにPHPをインストールすることにします。 ドンピシャのイメージが存在すればそれでいいんですが、恐らく何かしらのカスタマイズが必要になるので、ダウンロードだけで全て完了にならない事を覚悟しておきましょう。 でも、あまり恐れる必要はなく、ダウンロードしたあとは、普通にLinuxのセットアップをする感覚で大丈夫です。(少しコツがいりますが) $ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 5040bd298390: Downloading [====================================> ] 37.22 MB/51.36 MB 333547110842: Download complete 4df1e44d2a7a: Download complete ダウンロードの途中経過ですが、こんな表示がされます。 Digest: sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645 Status: Downloaded newer image for ubuntu:latest これでダウンロード完了です。簡単ですね。 そしてダウンロードされたか確認するのは、イメージ一覧を表示してみます。 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest cc1b61406712 13 days ago 182 MB ちゃんとリストに「ubuntu」が表示されていればOKでしょう。 表示されなければ、これまでの過程のどこかでERRORが表示されているはずなので、確認してみてください。

イメージの起動

今までイメージと言ってきたんですが、dockerでは、起動する単位をコンテナとして扱います。 イメージは、ダウンロードするコンテナをブロッキングしたものという印象でしょうか。 でも上記イメージリストを表示したリスト項目には「REPOSITORY」リポジトリーと表示されてますね・・・こりゃややこしや・・・ とりあえず、ubuntuの起動 $ docker run -i -t ubuntu /bin/bash root@f9b38154cea8:/# コンテナが起動したら、root権限でログインした状態になります。 とりあえず、起動は成功しているんですが、エラーが出て起動出来ない場合は、docker --helpを打ち込んで構文を確認してみてください。 ちなみに、起動コマンドの後ろについている/bin/bashは、起動した後、ログインしてターミナルを表示している状態にする命令です。 これをつけないと、コマンドを実行した直後は、画面に何も表示されない状態になり、少し焦ります。

操作あれこれ

Dockerはこれまでの仮想環境と比べて、操作が非常に特殊で考え方もなれないとトラブルになる可能性があるので、僕がよく使う操作方法を備忘録しておきます。

コンテナ内のターミナルから抜ける

root@f9b38154cea8:/# exit Dockerのややこしい仕様のひとつに、exitでターミナルを抜けると、Dockerコンテナは実行されている状態から停止状態になってしまいます。 もし本番環境でこれをやってしまうと、サービスが停止する事になるので、非常にこの点を理解しておかなければイケない重要ポイントなのです。

コンテナを終了せずにターミナルから抜けるには

control + p , control + q コマンドを打ち込むのではなく、ショートカットでCTLを押しながら、PとQを順番に叩く事で、コンテナから抜けられます。 これ知らないと絶対に事故りますね。

起動コンテナの確認

$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9b38154cea8 ubuntu "/bin/bash" 8 minutes ago Up 8 minutes 80/tcp, 443/tcp xenodochial_kirch 起動中のコンテナはSTATUSの箇所に「UP」と出ています。

再度コンテナに入る

$ docker attach xenodochial_kirch 「xenodochial_kirch」というのは、コンテナが起動した時に自動で付けられる名称で、毎回変わります。ハッシュ値ではなく、単語になっている事をみると、docker開発員の遊び心なのでしょう。 ちなみに、attachした直後は画面にカーソルが表示されなく、ハングったと勘違いしてしまいがちですが、enterを押すことでターミナルが現れます。

起動状態のコンテナを停止する

$ docker stop xenodochial_kirch

停止状態のコンテナを起動する

$ docker start xenodochial_kirch

コンテナを削除する

起動と停止は、あまり行う作業ではないんですが、次に行う、そもそもコンテナを削除する(イメージは消えません)方法は以下です。 $ docker rm xenodochial_kirch もしrmできない場合は、stopコマンドを実行してあげるといいでしょう。 ※psコマンドでstatusを確認するといいでしょう。 ちなみに、ダウンロードしたイメージを削除するには以下のコマンドです。 $ docker rmi ngubuntuinx rmiしたイメージは再復活できないので、カスタマイズした状態のものは、ちゃんと確認してからrmiしてくださいね。

コンテナのカスタマイズ

ダウンロードしたubuntuコンテナにはNGINXやPHPやSQLなどはインストールされていないので、手で入れてあげる必要があります。 やり方はそんなに難しくなく、起動してあるコンテナでモジュールのインストールしてあげるだけでいいです。 # ubuntuというname値で起動して、コマンドを楽にする $ docker run -i -t --name ubuntu ubuntu /bin/bash root@804b733da45e:/# apt-get update root@804b733da45e:/# apt-get install nginx root@804b733da45e:/# apt-get install php-fpm

nginxのconf設定

root@804b733da45e:/# vi /etc/nginx/site_enabled/default -- server { listen 80; server_name _; root /var/www/html; index index.php index.html; location / { #if (!-e $request_filename) { # rewrite ^/(.+)# /index.php?q=$1 last; # break; #} } location ~ \.php$ { root /var/www/html; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

起動時のモジュール起動バッチ

Dockerは、モジュールの自動起動ができません。 この点が非常に難点でもあるんですが、下記のようにバッチファイルを作って立ち上がり時に実行されるようにすることで、対応は可能です。 今回は「nginx」と「php-fpm」モジュールの起動だけを書いておきます。 #!/bin/bash /usr/sbin/service nginx start /usr/sbin/service php7.0-fpm start while true ; do /bin/bash done このファイルを起動時に実行する方法は、次の章の起動コマンドで行うので、起動コマンドが少し長くなりますが、必ず覚えておきましょう。

コンテナをイメージ保存

$ docker commit -m 'install : nginx , php7.0-fpm' ubuntu ubuntu/dev commitはgitの構文と同じなので、簡単に覚えられるでしょう。構文で後ろに続いているのは、現在起動されているコンテナ(stopされていても大丈夫)、最後のオプションは新しいリポジトリ名です。 そして、イメージ一覧で確認 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu/dev latest d7fe8975c26a 13 hours ago 293 MB ubuntu latest f49eec89601e 2 weeks ago 129 MB 上書きもできますが、バージョンを変えてコミットしていき、いらなくなったコンテナはrmiオプションで消していくと間違いないでしょう。

起動方法のオプションを習得しておこう

Dockerのコンテナ起動は、共通のimageを使って、起動する端末に合った起動コマンドを実行する必要があるので、オプションを覚えて、できるだけ自分の手でその場で叩けるようにしましょうね。 $ docker run -i -t ubuntu/dev /bin/bash $ docker run -i -t -p 80:80 -p 443:443 ubuntu/dev --name dev /bin/bash $ docker run -i -t -p 80:80 -p 443:443 ubuntu/dev --name dev /bin/sh /root/init.sh * Starting nginx nginx [ OK ] nginxの起動メッセージは出ましたが、php-fpmは表示されませんが、ちゃんと起動されています。 ブラウザで「http://localhost/」にアクセスしてnginxが起動している事を確認しましょう。 $ docker run -i -t -p 80:80 -p 443:443 ubuntu/dev --name dev -v ~/web:/var/www/html /bin/sh /root/init.sh ローカルフォルダは、web作業領域のトップ階層を指定して、nginxで指定した/var/www/html階層を-vオプションでリンクさせることができます。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。