Docker で Apache 2 + PHP 7.4 + PostgreSQL 12 環境を構築する方法
はじめに
今日は Docker で Apache 2 + PHP 7.4 + PostgreSQL 12 環境を構築する方法をご紹介します。
今回は Windows 10 Home 上で試していて、Docker toolbox on windows を使用しています。
- Docker
- 19.03.1
- Docker Compose
- 1.24.1
- Apache
- 2.4.38
- PHP
- 7.4.9
- PostgreSQL
- 12.4
1. 下準備
今回は下記ファイル構成にします。
/path/to/your-dir/
├ docker/
│ ├ initdb/
│ │ └ articles.sql
│ │
│ ├ myapp-php/
│ │ └ Dockerfile
│ │
│ └ docker-compose.yml
│
└ html/
└ index.php
docker/initdb/articles.sql は動作確認で使用する articles テーブル生成用のファイルです。PostgreSQL コンテナに自動インポートされます。今回は下記内容でつくりました。
CREATE TABLE articles (
id SERIAL NOT NULL,
body VARCHAR(255),
PRIMARY KEY (id)
);
INSERT INTO articles (id, body) VALUES
(1, 'テスト1'),
(2, 'テスト2');
html/index.php は動作確認用で PHP + Apache コンテナにマウントします。
<?php
// ユーザー名やパスワードなどは、
// 後ほど紹介する docker-compose.yml と併せて適宜変更してください
$dsn = 'pgsql:dbname=sampledb;host=myapp-db';
$db = new PDO($dsn, 'sample-user', 'hi2mi4i6');
$sql = 'SELECT * FROM articles';
echo '<pre>';
foreach ($db->query($sql) as $row) {
var_dump($row);
}
echo '</pre>';
2. Dockerfile 作成
PHP のコンテナに PDO PostgreSQL 拡張 をインストールするために、今回は Dockerfile を使います。
ベースは PHP の公式イメージで、Apache も含まれている php:7.4-apache にしています。
FROM php:7.4-apache
RUN apt-get update && \
# PDO PostgreSQL 拡張
apt-get install -y libpq-dev &&\
docker-php-ext-install pdo_pgsql
- php Tags - Docker Hub
- https://hub.docker.com/_/php?tab=tags&name=7.4-apache
上記 php Tags ページにある「7.4-apache-buster」の「buster」は、コンテナで使用されている Debian Linux のバージョン(コードネーム)です。
執筆時点では buster が最新版なので 7.4-apache も同じものになっています。
今回はコンテナのビルド時に、自動的に Dockerfile によるイメージのビルドも行われます。
事前に独自イメージとして作っておきたい場合は、過去の「Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法」の中でご紹介していますので、よろしければ参考にしてください。
3. docker-compose.yml 作成
今回の docker-compose.yml の内容は以下の通りです。
当ブログ過去記事でのサンプル作成などで既に myapp-php で Dockerfile をビルドしている場合は、そのイメージを削除してください。
Docker toolbox on windows を使用の場合は、volumes でマウントするために、VirtualBox の共有フォルダ設定で /path/to/your-dir/html を追加する必要があります。
設定方法は「docker toolbox windows volumes 共有」などで検索すると、みつかると思います。
version: "3"
services:
# PHP + Apache
myapp-web:
container_name: myapp-web
# ./myapp-web/Dockerfile でイメージをビルド
build:
context: ./myapp-web
dockerfile: Dockerfile
# ローカルの /path/to/your-dir/html フォルダを
# コンテナの /var/www/html にマウント
volumes:
- "../html:/var/www/html"
# 80 ポートをコンテナの 80 ポートに割り当て
ports:
- "80:80"
# PostgreSQL
myapp-db:
container_name: myapp-db
image: postgres:12
# 適宜変更してください
environment:
POSTGRES_DB: sampledb
POSTGRES_USER: sample-user
POSTGRES_PASSWORD: hi2mi4i6
volumes:
- "./initdb:/docker-entrypoint-initdb.d"
# Windows 用「A5M2」で接続したいため
# (ローカルから接続しない場合は不要です)
ports:
- "5432:5432"
- build (Compose file version 3 reference | Docker Documentation)
- https://docs.docker.com/compose/compose-file/#build
- volumes (Compose file version 3 reference | Docker Documentation)
- https://docs.docker.com/compose/compose-file/#volumes
- ports (Compose file version 3 reference | Docker Documentation)
- https://docs.docker.com/compose/compose-file/#ports
- postgres Tags - Docker Hub
- https://hub.docker.com/_/postgres?tab=tags&name=12
4. コンテナのビルドと動作確認
PS > cd \path\to\your-dir\docker
PS > docker-compose up -d
コンテナが起動したら、ブラウザで PHP + Apache のコンテナにアクセスします。
(URL は http://localhost/ や http://192.168.99.100/ など Docker の環境によります)
前述のサンプルをご使用の場合は下記のようなダンプ結果が出れば OK です。
起動直後にアクセスするとデータベースに接続できないエラーが発生するかもしれません。
その際は少し待ってから、ブラウザの再読み込みを試してください。
array(4) {
["id"]=>
string(1) "1"
[0]=>
string(1) "1"
["body"]=>
string(10) "テスト1"
[1]=>
string(10) "テスト1"
}
array(4) {
["id"]=>
string(1) "2"
[0]=>
string(1) "2"
["body"]=>
string(10) "テスト2"
[1]=>
string(10) "テスト2"
}
A5M2 では下記のように設定すれば接続できます。
(設定内容が「Windows の A5M2 で Docker コンテナのデータベースに接続する方法」で紹介したサンプルと同じなので、その画像を掲載しています)
「サーバー名」のアドレスは Docker の設定に合わせて変更してください
5. おわりに
普段 XAMPP 環境を使っているような場合でも、Docker を使えば独立した PostgreSQL 環境を簡単に構築することができますね。
ところで PostgreSQL 用の有名な管理ツールとしては phpPgAdmin がありますが、Docker 公式イメージは見当たりませんでした。
phpPgAdmin 本体の最新版は GitHub にあるみたいです。
phpPgAdmin と検索すると下記「phpPgAdmin - start」がヒットしますが、こちらは情報が古いようです。
- Releases · phppgadmin/phppgadmin · GitHub
- https://github.com/phppgadmin/phppgadmin/releases
- phpPgAdmin - start
- http://phppgadmin.sourceforge.net/doku.php
それ以外のツールとしては Adminer がいいのでしょうか。
こちらは Docker 公式イメージもあるようなので、今度試してみようと思っています。
- Adminer - Database management in a single PHP file
- https://www.adminer.org/
- adminer - Docker Hub
- https://hub.docker.com/_/adminer