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. 下準備
  2. Dockerfile 作成
  3. docker-compose.yml 作成
  4. コンテナのビルドと動作確認
  5. おわりに

1. 下準備

今回は下記ファイル構成にします。

/path/to/your-dir/
  ├ docker/
  │  ├ initdb/
  │  │  └ articles.sql
  │  │
  │  ├ myapp-php/
  │  │  └ Dockerfile
  │  │
  │  └ docker-compose.yml
  │
  └ html/
      └ index.php

docker/initdb/articles.sql は動作確認で使用する articles テーブル生成用のファイルです。PostgreSQL コンテナに自動インポートされます。今回は下記内容でつくりました。

/docker/initdb/articles.sql
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 コンテナにマウントします。

/html/index.php
<?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 にしています。

/docker/myapp-web/Dockerfile
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 ページにある「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 共有」などで検索すると、みつかると思います。

/docker/docker-compose.yml
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"

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」がヒットしますが、こちらは情報が古いようです。

それ以外のツールとしては Adminer がいいのでしょうか。
こちらは Docker 公式イメージもあるようなので、今度試してみようと思っています。