xampp と同様のLAMP環境を Docker で構築する

GitHubにアップしてある Docker-LAMP をローカルにダウンロードして docker-compose コマンドを実行すると xampp 同様の環境を構築することができます。具体的にはwebサーバー(nginx)とphpMySQLphpMyAdmin が使えるようになります。

Docker は xampp と比べると初期の準備にも多少時間かかるしコマンド打つしで若干めんどくさい感じはあるけど、最近のモダンで多種多様な環境構築もできるし Qiita 等の記事も多い。Mac - Windows間や複数者間でも気軽に同環境を構築可能などメリットも多いので、脱xamppを検討している人や Docker を触ったことが無い人で興味がある人なんかはこれを機に Docker に触れてみることをおすすめします。

はじめに

事前準備として、環境を構築したいPCに Dockerdocker-compose がインストールされている必要がある。
コマンドプロンプト(win)/ ターミナル(mac)を起動し、docker -vdocker-compose -v でそれぞれバージョンの確認が出来る状態であればok。

動作確認済みのPC環境

  • macOS Mojave (バージョン 10.14.4)、メモリ: 8GB、Docker: v18.09.2、docker-compose: v1.23.2
  • Windows 10 Pro 64bit、メモリ: 32GB、Docker: v18.06.1-ce、docker-compose: v1.23.2

Docker インストール参考記事

GitHubへのリンク、ダウンロード方法

GitHubプロジェクトからの環境構築方法一覧

  1. GitHubページの Clone or download ボタンよりリポジトリのクローンもしくはZIPダウンロード
  2. ZIPダウンロードの場合は解凍
  3. 解凍して出来たフォルダをDockerコマンドが有効な場所に置く
  4. コマンドプロンプト(win)/ ターミナル(mac)を起動し、「03」のフォルダ内へ移動
  5. docker-compose up -d コマンドを実行(しばらくインストールが走る)
  6. ブラウザからwebサーバーアクセスを確認 → http://localhost/
  7. ブラウザからwebサーバーアクセス&php実行を確認 → http://localhost/index.php
  8. ブラウザからphpMyadminとサンプルDBテーブルを確認 → http://localhost:8080/

環境構築中の画面一覧 (Windowsの例)


Windows でも Mac でも、インストール済みの Docker を起動しておく


GitHubプロジェクトのフォルダ展開図


コマンドプロンプトでプロジェクトのフォルダへ移動しつつ各コマンドを実行。ps・images はコンテナ等が起動する前後の比較のために実行。docker-compose up -d コマンド実行時、Docker が起動してないとERRORになる。


mysql・php・phpmyadmin・nginx が起動完了 (1回目の起動はimageのインストールがされるので時間がかかる。2回目以降の起動は早い。)


ps・images で各起動状況を確認


docker-compose up -d 完了後のフォルダ展開図。data フォルダ内に色々入ったのが確認できる。


http://localhost/ にアクセスして nginx(webサーバー)の確認


http://localhost/index.php にアクセスして php の確認


http://localhost:8080/ にアクセスして phpMyAdmin とDBテーブルを確認

Docker / docker-compose コマンドリスト

docker version / docker -vDocker のバージョン確認
docker-compose version / docker-compose -vdocker-compose のバージョン確認
docker-compose up -dコンテナの作成と開始
docker-compose psコンテナ一覧 (docker-compose)
docker psコンテナ一覧 (Docker)
docker imagesイメージ一覧 (Docker)
docker rmi xxxxxイメージの削除 (Docker)
docker stopサービスの停止
docker downコンテナの停止

ファイル毎のソースコード

ファイル・フォルダ構成

Docker-LAMP
├ docker-compose.yml
├ docker
│  ├ db
│  │  └ sql
│  │    └ create-sample-table.sql
│  ├ nginx
│  │  └ default.conf
│  └ php
│     ├ php.ini
│     └ Dockerfile
└ server
  ├ index.html
  └ index.php

/docker-compose.yml

docker-compose コマンドでインストールされるコンテナ情報がまとまっている


version: '3'

services:

  # PHP
  php:
    container_name: php
    build: ./docker/php
    volumes:
    - ./server:/var/www

  # nginx
  nginx:
    image: nginx
    container_name: nginx
    ports:
    - 80:80
    volumes:
    - ./server:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306

  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    - PMA_USER=root
    - PMA_PASSWORD=root
    ports:
    - 8080:80

/server/index.html

環境構築後、http://localhost/ にアクセスすると開かれるファイル


<html>
<head></head>
<body>
    <h1>docker compose!</h1>
</body>
</html>

/server/index.php

環境構築後、http://localhost/index.php にアクセスすると開かれるファイル


<html>
<head></head>
<body>
    <h1>docker compose!</h1>
</body>
</html>
<?php
echo('docker compose!');

/docker/php/Dockerfile

Dockerコンテナーの構成内容を記述するファイル


FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev mysql-client \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

/docker/php/php.ini

phpの設定ファイル


[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

/docker/nginx/default.conf

nginx(HTTPサーバー)の設定ファイル


server {
  listen 80;
    index index.php index.html;
    root /var/www;

  location / {
    root /var/www;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

/docker/db/sql/create-sample-table.sql

docker-compose コマンド時に実行されるsqlファイル。mysqlに test_table という名前のサンプル用のテーブルとデータを作成する。


-- create sample table
create table IF not exists `test_table`
(
 `id`               INT(20) AUTO_INCREMENT,
 `name`             VARCHAR(20) NOT NULL,
 `created_at`       Datetime DEFAULT NULL,
 `updated_at`       Datetime DEFAULT NULL,
    PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO test_table VALUES (1,'suzuki',null,null);
INSERT INTO test_table VALUES (2,'tanaka',null,null);
INSERT INTO test_table VALUES (3,'satou',null,null);

参考

Share