PHPの勉強をしたいので、まずは環境を構築しなくてはいけません。
環境構築の方法を調べてみると以下の3つの手段があるらしい。
- Xampp
- Vagrant
- Docker
どうやら3つ目のDockerが流行っているということなのでDockerで環境を構築してみました。しかも今回はPHP + Nginx + MySQL + phpMyAdminぜんぶ入れます(笑)
初心者がやるには難易度が高めかもしれないですが、振り返ってみるとわりとシンプルでした。
参考にしたサイトや苦戦した点を交えながら環境構築の流れを記していきます。
大まかな流れは以下です。
- Docker Toolboxの導入
- ディレクトリを構成する
- コンテナを起動する
細かく見ていきましょう。
Dockerの概要
Dockerとは
軽くDockerについて説明しておきます。まあ引用なんですが。
Dockerは、インフラ関係やDevOps界隈で注目されている技術の一つで、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
Docker入門(第一回)~Dockerとは何か、何が良いのか~
Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。
Docker入門(第一回)~Dockerとは何か、何が良いのか~
Dockerのメリット
Dockerを使うメリットは以下です。
- OS関係なく同じ環境を構築できる
- 作成した環境を配布しやすい
- 仮想マシンより軽量かつシンプル
- デプロイ(本番環境での実行)が簡単
実際に環境構築して思ったのは、小さなテキストファイルですんなりと環境を構築できたので物凄く楽でした。
今の職場ではVagrantでサーバー周りの環境を構築しているのですが、人によってビルドできる場合とできない場合があって、環境構築は泥沼化してる感があります。
その点、Dockerは救世主なのかも。なんで今の職場はDocker使ってないんだ・・・。
Docker PHP + Nginx + MySQL + phpMyAdminを構築してみる
今回はOSがWindows10 Home 64bitの人のやり方です。
Docker Toolboxの導入
Hyper-Vが動かないHomeでは、代わりにVirtual Box上でDocker Toolboxを使用します。
こちらのサイトにアクセスして下の方の「DockerToolbox-{最新バージョン}.exe」をクリックするとダウンロードが始まります。
ダウンロードが完了したらexeファイルをクリックしてインストールしましょう。オプションはデフォルトのままで、Nextを押しまくれば良いと思います。
インストールが完了するとデスクトップに3つのアイコンが作成されるます。
「Docker Quickstart Terminal」をダブルクリックで起動すると、初期設定が始まりDockerのクジラマークが表示されたら完了です。
以上で環境構築のベースは出来上がりました。
ディレクトリを構成する
続いて環境設定用のファイルを作成します。具体的にはDocker Composeを使って環境設定用ファイルのdocker-compose.ymlに記述された通りにサーバーやらデータベースやらを一気に環境構築します。
docker-compose.ymlを記述する上であらかじめディレクトリ構成を決めておく必要があります。
以下参考サイトはDockerの概念を分かりやすく書いているので基礎理解の助けになると思います。
今回はディレクトリ構成を以下のようにします。
work ├── docker-compose.yml ├── nginx │ └── nginx.conf ├── php │ ├── Dockerfile │ └── php.ini ├── mysql └── www └── html └── index.php
エクスプローラー上ではこんな感じ↓
ここで重要なのは、workディレクトリはuser配下に作るってこと。適当にディレクトリを作ると機能しない場合があるそうです。
ここから上記で作成した設定用ファイルの中身を記述していきます。構成を変えていない限りはコピペでOKです。
docker-compose.yml
version: '3' services: nginx: image: nginx:latest ports: - 8080:80 volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf - ./www/html:/var/www/html depends_on: - php php: build: ./php volumes: - ./www/html:/var/www/html depends_on: - db db: image: mysql:5.7 ports: - 13306:3306 volumes: - ./mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - 8888:80 depends_on: - db
nginx/nginx.conf
server { listen 80; server_name _; root /var/www/html; index index.php index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
php/Dockerfile
FROM php:7.2-fpm COPY php.ini /usr/local/etc/php/
php.ini
date.timezone = "Asia/Tokyo"
www/html/index.php
<?php phpinfo();
コンテナを起動する
全てのファイルが用意できたら、「Docker Quickstart Terminal」上でcdコマンドで作業ディレクトリworkに移動します。
次に「docker-compose up -d」と入力するとPHP、MySQL、Nginxがインストールされます。
「docker ps」と入力し、正常に環境構築できたか確認しましょう。
さらにちゃんとPHPが動作するか確認したいので、サーバーにアクセスしてみます。
「docker-machine ip」を入力してvirtual boxのローカルIPを確認しといてください。僕の場合は192.168.99.100でした。
じゃあブラウザで http://192.168.99.100:8080/にアクセスしてください。こんな感じ↓のphpのバージョン情報ページに飛べば正常です。
環境構築、お疲れ様です。
苦戦した点:MySQL周り
docker-compose up -dでエラー
ディレクトリの構成が済んで、「docker-compose up -d」を入力したときに謎のエラーが。
Creating work_db_1 … error
ERROR: for work_db_1 Cannot start service db: OCI runtime create failed: container_linux.go:346: starting container process caused “process_linux.go:449: container init caused \”rootfs_linux.go:58:
・
・
・
ERROR: for db Cannot start service db: OCI runtime create failed: container_linux.go:346: starting container process caused “process_linux.go:449: container init caused \”rootfs_linux.go:58:
・
・
・
初心者の僕が分かるはずもなく、結構調べました。
どうやらdocker-compose.ymlのデータベースの設定がおかしかったようです。上記で記載したディレクトリ構成や docker-compose.yml には僕が消したので無いのですが、以下のdbのmysqlの部分がmysql/data:/var/lib/mysqlとなっていてdataが悪さをしているようでした。
db: image: mysql:5.7 ports: - 13306:3306 volumes: - ./mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret
MySQLが起動しない
多分上のエラーのせいかと思うのですが、MySQLが起動していませんでした(笑)
「docker ps」で起動中のコンテナを確認しますと、ほら、無いですね。
MySQLを起動しようとしたら勝手に最新版のimageをダウンロードしてくれました。コマンドは「docker run –name コンテナ名 -e MYSQL_ROOT_PASSWORD=secret -d mysql」です。コンテナ名はよく分からなかったので「mysql」にしました。
「docker ps」で起動中のコンテナを確認すると、MySQLが起動してました!
おまけ
どうやら「Docker Quickstart Terminal」を閉じただけでは、コンテナも仮想マシンも動き続けるようです。そこでコンテナを止める方法と仮想マシンを止める方法を紹介しておきます。コンテナ停止→仮想マシン停止が安全なのかな?
コンテナを止める方法
「docker ps」で動いているコンテナを確認できます。
「docker stop コンテナID」で止められます。
Docker-composeで全コンテナを終了する方法
「docker-compose down」で全コンテナを終了できます。
仮想マシンを止める方法
「docker-machine.exe stop」で仮想マシンを終了できます。
まとめ
Windows10 Home環境でDockerを使って PHP + Nginx + MySQL + phpMyAdminを構築してみました。
PHPは簡単だと聞いていたのですが、環境構築が複雑でかなり萎えました(笑)
まずDockerってなに?ってとこから始まり、知らない用語を調べながらなんとか環境構築できました。Qitaも情報が分散していて、分かりにくかったです。Macだともっと楽にできるんですかね?
さて、僕はPHPの勉強をしていきます。
コメント