Docker で PHP 8.0 の LAMP 環境を公式イメージを使って構築

はじめに

先月 PHP 8.0.0 がリリースされました。公式サイトを見るとより便利になったように思えます。

さっそく使ってみようと思い Docker で LAMP 環境を用意しました。

今日は DockerPHP 8.0 の公式イメージを用いた LAMP 環境の構築方法をご紹介します。

データベースには MySQL 8.0 を使用していますが、
他バージョンや MariaDB への変更も簡単に行えます。
(変更方法は後ほどご紹介します)

Docker
19.03.1
PHP
8.0.0
MySQL
8.0.22
目次
  1. 下準備
  2. PHP 8.0 + Apache コンテナ用 Dockerfile
  3. Docker Compose ファイル作成
  4. コンテナ作成と動作確認
  5. おわりに

1. 下準備

今回のファイル構成は以下の通りです。

/path/to/my-project/
  ├ docker/
  │  ├ initdb/
  │  │  └ articles.sql
  │  │
  │  ├ myapp-web/
  │  │  └ Dockerfile
  │  │
  │  └ docker-compose.yml
  │
  └ html/

/docker/initdb/articles.sql は mysql コンテナ初回起動時に実行される SQL で、
動作確認用に articles テーブルを用意しました。
(テーブルの内容に意味はありません)

/docker/initdb/articles.sql
SET CHARACTER_SET_CLIENT = utf8mb4;
SET CHARACTER_SET_CONNECTION = utf8mb4;

CREATE TABLE articles (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  body text NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO articles (id, title, body)
VALUES (NULL, 'テスト1', 'テスト\r\nテスト\r\nテスト'); 

2. PHP 8.0 + Apache コンテナ用 Dockerfile

Dockerfile を使って、PHP 8.0 の公式イメージをベースに、必要なパッケージや拡張を自動で入れるようにします。

各種パッケージや拡張を着脱しやすいように記述しているので、コメントを参考に不要なものを外してお使いください。

/docker/myapp-web/Dockerfile
FROM php:8.0-apache

  # Node.js
  ARG node_ver=14.15.1
  ARG node_path=/usr/local/lib/nodejs
  ARG node_file_name=node-v${node_ver}-linux-x64
  ENV PATH ${node_path}/${node_file_name}/bin:$PATH
  RUN curl https://nodejs.org/dist/v${node_ver}/${node_file_name}.tar.xz > ${node_file_name}.tar.xz \
    && mkdir -p $node_path \
    && tar xJvf ${node_file_name}.tar.xz -C $node_path
  
  # Composer
  ARG composer_ver=2.0.8
  ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
  RUN chmod +x /usr/local/bin/install-php-extensions && sync \
    && install-php-extensions @composer-${composer_ver}
  
  # その他パッケージ、PHP拡張
  RUN apt-get update \
    # unzip (composer create-project で必要)
    && apt-get install -y unzip \
    # Vim 
    && apt-get install -y vim \
    # PHP BCMath
    && docker-php-ext-install bcmath \
    # PHP GD
    && apt-get install -y zlib1g-dev libpng-dev libjpeg62-turbo-dev \
    && docker-php-ext-configure gd --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd \
    # PHP intl
    && apt-get install -y libicu-dev \
    && docker-php-ext-install intl \
    # PHP PDO MySQL
    && docker-php-ext-install pdo_mysql \
    # mod_rewrite 有効化
    && a2enmod rewrite

ベースには Apache 込みの php:8.0-apache イメージを用いています。

Composer や Node.js 、GD 拡張のインストールは下記投稿などを参考にしてください。

3. Docker Compose ファイル作成

docker-compose.yml は下記のようにしています。

/docker/docker-compose.yml
version: "3"

services:
  myapp-web:
    container_name: myapp-web
    # ./myapp-web/Dockerfile でイメージをビルド
    build:
      context: ./myapp-web
      dockerfile: Dockerfile
    # myapp-db 起動後に myapp-web を起動
    depends_on:
      - myapp-db
    # 80 番ポートを割り当て
    ports:
      - "80:80"
    # ローカル の ./html フォルダを
    # コンテナの /var/www/html にマウント
    volumes:
      - "../html:/var/www/html"

  # MySQL
  myapp-db:
    container_name: myapp-db
    image: mysql:8.0
    volumes:
      - "./initdb:/docker-entrypoint-initdb.d"
    environment:
      MYSQL_DATABASE: sampledb
      MYSQL_USER: sample-user
      MYSQL_PASSWORD: hi2mi4i6
      MYSQL_ROOT_PASSWORD: mu7ya9to

  # phpMyAdmin
  myapp-pma:
    container_name: myapp-pma
    image: phpmyadmin/phpmyadmin:5.0
    depends_on:
      - myapp-db
    ports:
      - "8080:80"
    environment:
      PMA_HOST: myapp-db
      PMA_USER: root
      PMA_PASSWORD: mu7ya9to

myapp-web の build オプションで、コンテナビルド時に
myapp-web/Dockerfile でイメージを生成するようにしています。

イメージを事前に作っておく方法は下記投稿でご紹介しています。

データベースを他バージョンや MariaDB にしたい場合は、
myapp-db の image の箇所を mysql:5.7mariadb:10.5 などに変更してください。

image のタグは Docker Hub の下記ページで探すことができます。

4. コンテナ作成と動作確認

下記コマンドでコンテナ作成と起動を行います。

myapp_myapp-web:latest イメージが既にある場合は事前に削除してください。
(docker images コマンドなどで確認できます)

$ cd /path/to/my-project
$ docker-compose -p myapp-web up -d

あとは適宜動作確認をしてください。

ローカルの /path/to/my-project/html がコンテナの /var/www/html と同期しています。

phpMyAdmin は 8080 ポートでアクセス可能です。
( http://localhost:8080 や http://192.168.99.100:8080 など URL は環境により異なります)

PHP の拡張モジュールは docker exec でコンテナに入り、
php -m コマンドでも確認可能です。

$ docker exec -it myapp-web bash

root@123456789abc:/var/www/html# php -m 
[PHP Modules]
bcmath
...

5. おわりに

今回は PHP 8.0 の LAMP 環境として構築する方法をご紹介しましたが、
Docker ではデータベースを Postgres に変えたり、Web サーバを Nginx にするなどのカスタムが簡単に行えます。

このブログでも色々な環境の作り方をご紹介していますが、組み合わせ方が身につくと、短時間で環境が作れるようになります。

積極的に使うようにすると、必要になった時にサクッと導入できるようになりますので、色々と試していただければと思います。