【Windows10】Dockerで PHP + Nginx + MySQL + phpMyAdminを構築する方法

Simiのアイコン画像Simi

ども、Web系エンジニアを目指しているSimiです。

PHPの勉強をしたいので、まずは環境を構築しなくてはいけません。

環境構築の方法を調べてみると以下の3つの手段があるらしい。

  1. Xampp
  2. Vagrant
  3. Docker

どうやら3つ目のDockerが流行っているということなのでDockerで環境を構築してみました。しかも今回はPHP + Nginx + MySQL + phpMyAdminぜんぶ入れます(笑)

初心者がやるには難易度が高めかもしれないですが、振り返ってみるとわりとシンプルでした。

参考にしたサイトや苦戦した点を交えながら環境構築の流れを記していきます。

大まかな流れは以下です。

  1. Docker Toolboxの導入
  2. ディレクトリを構成する
  3. コンテナを起動する

細かく見ていきましょう。

目次

Dockerの概要

Dockerとは

軽くDockerについて説明しておきます。まあ引用なんですが。

Dockerは、インフラ関係やDevOps界隈で注目されている技術の一つで、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

Docker入門(第一回)~Dockerとは何か、何が良いのか~

Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。

Docker入門(第一回)~Dockerとは何か、何が良いのか~

Dockerのメリット

Dockerを使うメリットは以下です。

  1. OS関係なく同じ環境を構築できる
  2. 作成した環境を配布しやすい
  3. 仮想マシンより軽量かつシンプル
  4. デプロイ(本番環境での実行)が簡単

実際に環境構築して思ったのは、小さなテキストファイルですんなりと環境を構築できたので物凄く楽でした。

今の職場ではVagrantでサーバー周りの環境を構築しているのですが、人によってビルドできる場合とできない場合があって、環境構築は泥沼化してる感があります。

その点、Dockerは救世主なのかも。なんで今の職場はDocker使ってないんだ・・・。

Docker PHP + Nginx + MySQL + phpMyAdminを構築してみる

今回はOSがWindows10 Home 64bitの人のやり方です。

Docker Toolboxの導入

Hyper-Vが動かないHomeでは、代わりにVirtual Box上でDocker Toolboxを使用します。

参考にしたサイト:windows 10 home で docker を導入するメモ

こちらのサイトにアクセスして下の方の「DockerToolbox-{最新バージョン}.exe」をクリックするとダウンロードが始まります。

ダウンロードが完了したらexeファイルをクリックしてインストールしましょう。オプションはデフォルトのままで、Nextを押しまくれば良いと思います。

インストールが完了するとデスクトップに3つのアイコンが作成されるます。

「Docker Quickstart Terminal」をダブルクリックで起動すると、初期設定が始まりDockerのクジラマークが表示されたら完了です。

以上で環境構築のベースは出来上がりました。

ディレクトリを構成する

続いて環境設定用のファイルを作成します。具体的にはDocker Composeを使って環境設定用ファイルのdocker-compose.ymlに記述された通りにサーバーやらデータベースやらを一気に環境構築します。

docker-compose.ymlを記述する上であらかじめディレクトリ構成を決めておく必要があります。

以下参考サイトはDockerの概念を分かりやすく書いているので基礎理解の助けになると思います。

参考サイト:DockerによるPHP開発環境構築(PHP + MySQL + Nginx)

今回はディレクトリ構成を以下のようにします。

work
├── docker-compose.yml
├── nginx
│   └── nginx.conf
├── php
│   ├── Dockerfile
│   └── php.ini
├── mysql
└── www
    └── html
        └── index.php

エクスプローラー上ではこんな感じ↓

ここで重要なのは、workディレクトリはuser配下に作るってこと。適当にディレクトリを作ると機能しない場合があるそうです。

例:C:\Users\あなたのPC名\work

参考サイト:【Windows10 Home】dockerで PHP + Apache + MySQL + phpMyAdmin + Laravel を構築し、GitHubに上げるまで

ここから上記で作成した設定用ファイルの中身を記述していきます。構成を変えていない限りはコピペで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

dbのところはimage: mysql:latestの方が良いと思います。古いバージョンだと僕の環境ではなぜか起動しませんでした。(後述)

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」と入力し、正常に環境構築できたか確認しましょう。

失敗例:MySQLが起動してない(対策は後述)

さらにちゃんとPHPが動作するか確認したいので、サーバーにアクセスしてみます。

「docker-machine ip」を入力してvirtual boxのローカルIPを確認しといてください。僕の場合は192.168.99.100でした。

じゃあブラウザで http://192.168.99.100:8080/にアクセスしてください。こんな感じ↓のphpのバージョン情報ページに飛べば正常です。

Simiのアイコン画像Simi

環境構築、お疲れ様です。

苦戦した点: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

参考にしたサイト:「docker-compose up」をしようとしたところ「OCI runtime create failed」

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の勉強をしていきます。

この記事を書いた人

SimiBlogの管理人です。大企業でエンジニアとして働きながら動画クリエイターとしても活動しています。

■プログラミング
組込み系/Web系の知識あります。
C/C++/Python/JavaScript/React/Ruby/PHP
■動画制作
PremirePro/AfterEffectsを使ってます。
ノウハウ系/日常系動画をYouTubeに投稿してます。
■趣味
旅行/カメラ/動画編集

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次
閉じる