[PHP]DockerでPHP, MySQL(MariaDB), nginxを使ったローカル開発環境を構築する

Pocket

Docker とは軽量な仮想化環境を構築するためのツールで、ウェブサーバーやデータベースなどの機能に関連するコンテナーを組み合わせればウェブサイト制作のためのローカル開発環境を簡単に構築することができます。

一般的にローカル開発環境を作る場合、使っているコンピュータ(ホストOS)に直接ウェブサーバーやデータベース機能をインストールするか、Vagrant + VirtualBox を使ってコンピューター上にもう1つの仮想の OS(ゲストOS)をまるごとインストールし、その中に環境を構築していました。

ホストOSに直接開発環境を揃える前者のやり方はマシンによって構築方法が異なったり、バージョンの切り替えが難しかったりするなど、開発チーム内で構築方法を揃えるのは困難でした。

ゲストOS上に Linux(Ubuntu や CentOS など)をインストールし、その中に環境を構築する後者の方法は本番環境とほぼ同じ状態を再現できるため人気がありますが、1台のコンピュータ上で2つの OS を稼働させるには高性能なコンピュータとリソースが必要となります。

Docker 自体は Linux 上で動作するプロセスの一つで、関連する機能やライブラリをまとめたコンテナーを Docker に追加・削除することで必要な機能のみ追加したり、使わなくなった機能をだけを削除したりすることができます。

Mac や Windows で動作させる場合は Linux ベースのゲスト OS の上で動作することになるのですが、必要最低限の機能のみで構成されているため起動が早く、消費リソースも少なく抑えられています。

Docker の入手

Docker 本体は Docker Store で入手することができます。無償の Community Edition(CE) と、サポートのついた Enterprise Edition(EE) がありますが、ここでは Community Edition を例にとって説明していくので、Docker CE のメニューからお使いの OS に合わせてファイルをダウンロードして下さい。安定版(Stable)と最新版(Edge)が用意されているのでひとまず Stable の方を使います。インストールの方法は OS によって異なるため公式ドキュメントを参考にして下さい。

(注意)記事を書いた時点のバージョン(Ver.18)では古い CPU を使う Mac に非対応であったり Windows の Home Edition や 32-bit 環境、Hyper-V を有効化できない機種にはインストールできない等動作環境はある程度限られています。

Docker Compose を使った複数コンテナの管理

本来であれば最初に pull や run コマンドを使ったコンテナーの追加と実行の仕方の基本を説明すべきですがそのような解説は少し調べればいくらでもでてくるのでここでは軽く触れる程度とします。

Docker で PHP の開発環境を構築する場合最低限必要となるのは Webサーバ、PHP、データベース の3つです。それぞれ公式のコンテナーが配布されているのでそちらを利用するのが簡単です。コンテナーは Docker Hub から探すことができます。基本的には公式のものか人気の高いもの(Starの多いもの)を選ぶのが無難です。

全体の流れとしては pull でそれぞれのコンテナーを取得し、run で実行するのですが、Webサーバーの起動、PHPの起動、データベースエンジンの起動を個別に行うのは不便なため、実際には Docker Compose で一括管理します。通常は Docker 本体のインストール時に一緒にインストールされているとおもいます。

Docker Compose は docker-compose.yml ファイルに書かれた内容に従ってコンテナーを管理しています。まずはフォルダを1つ用意し、次のようなファイル構造となるよう準備します。なお、この構造は一例であり、好きなように変更してしまって構いません。

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

docker-compose.yml

まずは土台となる 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/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    ports:
      - 8888:80
    depends_on:
      - db

書き方のバージョンがいくつかあり、今回は「3」としました。Webサーバーには nginx、PHP は 7.2、データベースは MySQL 5.7 という構成です。管理ツールとして phpmyadmin も加えてありますが必須ではありません。

image の箇所で前述の Docker Hub で調べたコンテナー名とバージョンを指定します。最新で良い場合は latest とします。ポートは 8080 番でアクセスし、80 番に転送するよう指定しました。つまり「http://localhost:8080」で nginx にアクセスできます。

volumes の箇所ではホストOS のファイルとDocker上のファイルを紐づけています。コロン(:)で区切った前半がホスト側で後半が Docker 側です。この指定によりこれから用意する nginx.conf ファイルに加えた変更が Docker 側の default.conf に反映されます。
「www/html」に関しても同様で、フォルダ www/html に追加したファイルがウェブページとして公開されます。

depends_on は依存関係を表します。指定されたサービスの起動より後に起動するよう順番が調整されます。

MySQL の箇所では環境変数として environment を指定しました。MYSQL_ROOT_PASSWORD で指定されたパスワードは MySQL の root ユーザーのパスワードとして設定されます。

MySQL の代わりに MariaDB を使う場合でも設定は殆ど変わりません。image の箇所を「mariadb:latest」等に変更するだけで、MYSQL_ROOT_PASSWORD 等の環境変数はそのままの名前で使うことができます。

データベースのテーブル等の内容を永続化する方法は今回のようにフォルダを指定して保存する方法と、ボリュームを作成してそちらを保存する方法があります。

services:
  db:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql
	(略)
volumes:
  db-data:

Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です