Docker で PHP 8.0 の LAMP 環境を公式イメージを使って構築
はじめに
先月 PHP 8.0.0 がリリースされました。公式サイトを見るとより便利になったように思えます。
- PHP: PHP 8.0.0 Release Announcement
- https://www.php.net/releases/8.0/ja.php
さっそく使ってみようと思い Docker で LAMP 環境を用意しました。
今日は Docker で PHP 8.0 の公式イメージを用いた LAMP 環境の構築方法をご紹介します。
データベースには MySQL 8.0 を使用していますが、
他バージョンや MariaDB への変更も簡単に行えます。
(変更方法は後ほどご紹介します)
- Docker
- 19.03.1
- PHP
- 8.0.0
- MySQL
- 8.0.22
1. 下準備
今回のファイル構成は以下の通りです。
/path/to/my-project/
├ docker/
│ ├ initdb/
│ │ └ articles.sql
│ │
│ ├ myapp-web/
│ │ └ Dockerfile
│ │
│ └ docker-compose.yml
│
└ html/
/docker/initdb/articles.sql は mysql コンテナ初回起動時に実行される SQL で、
動作確認用に articles テーブルを用意しました。
(テーブルの内容に意味はありません)
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 の公式イメージをベースに、必要なパッケージや拡張を自動で入れるようにします。
各種パッケージや拡張を着脱しやすいように記述しているので、コメントを参考に不要なものを外してお使いください。
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 イメージを用いています。
- php Tags - Docker Hub
- https://hub.docker.com/_/php?tab=tags&page=1&ordering=last_updated&name=8.0-apache
Composer や Node.js 、GD 拡張のインストールは下記投稿などを参考にしてください。
- Dockerfile で 公式 PHP イメージに Composer を簡単にインストールする方法 / Twin Turbo Computing
- https://tt-computing.com/docker-inst-php-ext-composer
- Dockerfile で Node.js (npm) 導入済の nginx イメージを作る方法 / Twin Turbo Computing
- https://tt-computing.com/docker-node-npm
- Docker 公式 PHP 7.4 イメージで GD ライブラリをインストールする方法 / Twin Turbo Computing
- https://tt-computing.com/docker-php-gd
- Docker 公式 PHP 7.4 の GD インストールまとめ / Twin Turbo Computing
- https://tt-computing.com/docker-php-gd-summary
3. Docker Compose ファイル作成
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 でイメージを生成するようにしています。
イメージを事前に作っておく方法は下記投稿でご紹介しています。
- 3. Dockerfile で 拡張モジュール導入済のイメージを作成
(Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法 / Twin Turbo Computing) - https://tt-computing.com/docker-php74-mariadb10_5#make-dockerfile
データベースを他バージョンや MariaDB にしたい場合は、
myapp-db の image の箇所を mysql:5.7 や mariadb:10.5 などに変更してください。
image のタグは Docker Hub の下記ページで探すことができます。
- mysql Tags - Docker Hub
- https://hub.docker.com/_/mysql?tab=tags&page=1&ordering=last_updated
- mariadb Tags - Docker Hub
- https://hub.docker.com/_/mariadb?tab=tags&page=1&ordering=last_updated
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
...
- docker exec | Docker Documentation
- https://docs.docker.com/engine/reference/commandline/exec/
- PHP: オプション - Manual
- https://www.php.net/manual/ja/features.commandline.options.php
5. おわりに
今回は PHP 8.0 の LAMP 環境として構築する方法をご紹介しましたが、
Docker ではデータベースを Postgres に変えたり、Web サーバを Nginx にするなどのカスタムが簡単に行えます。
このブログでも色々な環境の作り方をご紹介していますが、組み合わせ方が身につくと、短時間で環境が作れるようになります。
積極的に使うようにすると、必要になった時にサクッと導入できるようになりますので、色々と試していただければと思います。
- Docker で Apache 2 + PHP 7.4 + PostgreSQL 12 環境を構築する方法 / Twin Turbo Computing
- https://tt-computing.com/docker-apache2-php74-pgsql12
- Docker で Nginx 1.19 + PHP 7.4 + MariaDB 10.5 環境を構築 / Twin Turbo Computing
- https://tt-computing.com/docker-nginx1_19-php7_4-mariadb10_5