このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Docker入門】PHP+Apache+MySQL+phpMyAdminの開発環境コンテナ①

 Docker Composeコマンドを使ったPHP+Apache+MySQLの開発環境コンテナの構築例を紹介します。

「PHP+Apache+MySQL+phpMyAdminの開発環境コンテナ」は次の2部に分けて解説していきます。

  • PHP+Apache+MySQL+phpMyAdminの開発環境コンテナ①
  • PHP+Apache+MySQL+phpMyAdminの開発環境コンテナ②

 ここでは、コンテナの作成に必要な「Dockerfile」と「compose.yaml」ファイルを作成していきます。

使用するイメージには、PHPイメージ、MySQLイメージ、phpMyAdminイメージを使用します。

Apacheイメージは使わないの?

と、思われるかもしれません。

 Apacheが組み込まれたPHPイメージがDocker Hub上にありますので、そちらの公式イメージを使用することにします。

PHP開発環境

 PHP開発環境は、ウェブアプリケーションの開発に広く使用されるPHP言語と、その他の関連技術を含む環境です。PHPは、動的なウェブページやウェブアプリケーションを作成するためのスクリプト言語として非常に人気があります。データベースには、MySQLを使用して、phpMyAdminを使用することでGUIでデータベースにアクセスできるようにします。

PHPとは

まず、はじめに PHPについて簡単に解説します。

 PHPは、広く使用されるスクリプト言語であり、主にウェブ開発において動的なウェブページやウェブアプリケーションを作成するために用いられます。

 PHPは、HTMLに埋め込んで記述されることが一般的であり、ウェブサーバー上で実行されます。PHPは、他のプログラミング言語と比較して学習が容易であり、柔軟性に富んでいるため、初心者から上級者まで幅広いユーザーに利用されています。

 PHPの特徴の一つは、データベースとの連携が容易であることです。多くのデータベースとの統合がサポートされており、特にMySQLやMariaDBとの組み合わせが一般的です。

URL:https://www.php.net/

Apacheとは

Apacheは、世界で最も広く使われているウェブサーバーソフトウェアの1つです。

 1995年にリリースされ、オープンソースのプロジェクトとして開発されています。Apacheは、安定性、柔軟性、豊富な機能セットなどの特徴により、多くのウェブサイトやアプリケーションで使用されています。

MySQLとは

 MySQLは、オープンソースのリレーショナルデータベース管理システム(RDBMS)であり、世界中の多くのウェブサイトやアプリケーションで使用されています。1995年にMichael WideniusとDavid Axmarkによって開発され、その後MySQL AB(現在はOracle Corporationが所有)によってサポートされています。

 MySQLは、汎用性、信頼性、パフォーマンス、および拡張性に優れており、特にウェブ開発やアプリケーション開発に適しています。MySQLは、クライアント/サーバーモデルに基づいており、クライアントがデータベースサーバーに接続してデータの操作を行います。

 MySQLは、Webアプリケーション、CMS(コンテンツ管理システム)、eコマースプラットフォームなど、さまざまな用途で広く利用されており、その柔軟性と信頼性から、多くの開発者や組織に信頼されています。

phpMyAdminとは

 phpMyAdminは、ウェブベースのMySQLデータベース管理ツールであり、PHPで書かれています。phpMyAdminを使用すると、ウェブブラウザを介してGUI(グラフィカルユーザーインターフェース)を通じてデータベースを操作ができます。

 これにより、ユーザーは直感的なインターフェースを通じてデータベースの操作を行うことができます。テーブルの作成、データの表示、クエリの実行、ユーザーアカウントの管理などの機能が、マウスクリックやドラッグ&ドロップなどの操作で容易に行えます。

「Apache+PHP」+MySQL+phpMyAdminコンテナの構成

以下のように「Apache+PHP」コンテナ、MySQLコンテナとphpMyAdminコンテナを構成します。

 MySQLのデータは「db-data」という永続的なボリュームに保存し、「PHP+Apache」コンテナのデータはホストマシンの「./src」ディレクトリにバインドマウントさせます。

「PHP+Apache」コンテナとMySQLコンテナとphpMyAdminコンテナの作成

 「Dockerfile」と「compose.yaml」を作成して、「PHP+Apache」コンテナ、MySQLコンテナとphpMyAdminコンテナを作成します。

不要なDockerオブジェクトの削除

まず、不要なDockerオブジェクトをすべて削除しておきます。

以下のコマンドを実行します。

・「docker system prune -a」コマンドを実行します。

Are you sure you want to continue? [y/N] の質問には「y」と入力します。

PS C:\Users\joeac> docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
(略)

・「docker system prune -a」コマンドで削除されなかったDockerオブジェクトは、個別に削除しておきます。

環境によって削除されずに残っているDockerオブジェクトは異なります。

Dockerfile の作成

ディレクトリの作成と移動

Docker Composeでコンテナを作成するには、「compose.yaml」ファイルが必要になります。

 デフォルトでは、カレントディレクトリにある「compose.yaml」ファイルが読み込まれるため、作業ディレクトリに移動しておきます。

・「cd desktop/docker」コマンドを実行します。

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>

 「compose.yaml」ファイルを保存する「phpdev2」ディレクトリを作成して、作成したディレクトリに移動します。次のコマンドを実行します。

  • 「mkdir phpdev3」コマンド
  • 「cd phpdev3」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir phpdev3

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/28    16:52                phpdev3

PS C:\Users\joeac\Desktop\docker> cd phpdev3
PS C:\Users\joeac\Desktop\docker\phpdev3>

「Dockerfile」ファイルの作成

VSCodeで「Dockerfile」ファイルを作成します。

・「code Dockerfile」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\phpdev3> code Dockerfile

VSCodeが起動します。

・「Dockerfile」ファイルを以下のように編集して保存します。

 MySQL 8.0への接続を可能にするためには、pdo_mysql拡張機能のみではなく、MySQLクライアントライブラリもインストールする必要があります。

 また、MySQL 8.0では認証方式が変更されているため、それに対応する必要があります。MySQL 8.0のデフォルト認証方式をmysql_native_passwordに設定するための設定ファイルも追加しています。

FROM php:8.0-apache 

# MySQLクライアントライブラリのインストール
RUN apt-get update && \
    apt-get install -y libonig-dev && \
    apt-get install -y default-libmysqlclient-dev && \
    docker-php-ext-install pdo_mysql

# MySQL 8.0のデフォルト認証方式を設定
RUN { \
    echo '[mysqld]'; \
    echo 'default_authentication_plugin=mysql_native_password'; \
    } > /etc/mysql/conf.d/mysql_default_auth.cnf

定義内容の解説

「Dockerfile」ファイルの定義を解説します。

コマンド解説
FROM php:8.0-apacheベースイメージとして、PHP 8.0とApacheが統合されたイメージを使用します。これにより、PHPとApacheが同じコンテナ内で実行されます。
RUN apt-get update && \パッケージマネージャのアップデートを行います。&& \は、複数のコマンドを一行にまとめるための行末のコンティニューションマークです。
apt-get install -y libonig-dev && \libonig-devパッケージをインストールします。libonig-devは、正規表現のライブラリです。-yオプションは、インストール中にプロンプトが表示されずにすべての質問に自動的に"はい"で答えることを示します。
apt-get install -y default-libmysqlclient-dev && \default-libmysqlclient-devパッケージをインストールします。これは、MySQLクライアントライブラリのデフォルトの開発用パッケージです。
docker-php-ext-install pdo_mysqlpdo_mysql拡張をインストールします。pdo_mysqlは、PHPからMySQLデータベースにアクセスするためのPDO拡張です。
RUN { \複数行のコマンドを一つのRUNステートメントで実行します。
echo '[mysqld]'; \/etc/mysql/conf.d/mysql_default_auth.cnfに設定ファイルを作成します。 [mysqld]はセクションの始まりを示し、次の行でMySQLサーバーの設定を行います。
echo 'default_authentication_plugin=mysql_native_password'; \default_authentication_pluginmysql_native_passwordに設定します。これは、MySQL 8.0のデフォルトの認証プラグインを明示的に設定しています。
} > /etc/mysql/conf.d/mysql_default_auth.cnf作成した設定を/etc/mysql/conf.d/mysql_default_auth.cnfに書き込みます。これにより、MySQL 8.0のコンテナが起動するときにこの設定が適用されます。
「Dockerfile」ファイルの定義

compose.yamlの作成

VSCodeで「compose.yaml」ファイルを作成します。

・「code compose.yaml」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\phpdev2> code compose.yaml

VSCodeが起動します。

「compose.yaml」ファイルの編集

・「compose.yaml」ファイルを以下のように編集して保存します。

services:
  db:
    image: mysql:8.0
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root-pass
      MYSQL_DATABASE: test-db
      MYSQL_USER: test-user
      MYSQL_PASSWORD: test-pass
    volumes:
      - db-data:/var/lib/mysql

  php:
    build: .
    container_name: php-apache_container
    depends_on:
      - db
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html
    links:
      - db:mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin_container
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: root-pass
    ports:
      - "8080:80"

volumes:
  db-data:

定義内容の解説

「compose.yaml」ファイルの定義を解説します。

サービス説明
dbMySQLデータベースサービス。MySQL 8.0の公式イメージを使用しています。
コンテナ名は「mysql_container」で、環境変数を使用してルートパスワード、データベース名、ユーザー名、パスワードを設定します。
ボリューム「db-data」を使用して、MySQLのデータをホストマシンに永続化します。
phpPHPとApacheを実行するウェブサーバーサービス。自身のDockerfileを使用してイメージをビルドします。
コンテナ名は「php-apache_container」で、MySQLサービスに依存します。
ホストのポート80をコンテナのポート80にマッピングし、./srcディレクトリをコンテナの/var/www/htmlにマウントします。
MySQLサービスへのリンクを提供します。
phpmyadminMySQLデータベースを管理するためのphpMyAdminサービス。phpMyAdminの公式イメージを使用します。
コンテナ名は「phpmyadmin_container」で、MySQLサービスにリンクされます。
環境変数を使用してMySQLホスト、ポート、ルートパスワードを設定し、ホストのポート8080をコンテナのポート80にマッピングします。
定義内容のまとめ

 このDocker Composeファイルは、MySQLサービスとPHP + Apacheサービス、そしてphpMyAdminサービスを定義しています。それぞれのサービスは、環境変数やポートマッピング、依存関係、そしてボリュームの設定を持っており、複数のコンテナが協調して動作します。

コンテナの作成と実行

・「docker compose up -d」コマンドを実行します。

このコマンドは、「compose.yaml」ファイルを配置した場所で実行する必要があります。

PS C:\Users\joeac\Desktop\docker\phpdev3> docker compose up -d
[+] Running 31/31
 ✔ phpmyadmin Pulled                                           10.1s
   ✔ faef57eae888 Pull complete                                 1.5s
   ✔ 989a1d6c052e Pull complete                                 0.7s
(省略)
   ✔ ef5fc9928b9f Pull complete                                 6.0s
   ✔ 163f3256e112 Pull complete                                 6.2s
 ✔ db Pulled                                                   44.7s
   ✔ bd37f6d99203 Pull complete                                 7.0s
   ✔ d2433cba0951 Pull complete                                 6.1s
(省略)
   ✔ 6586d096303c Pull complete                                 9.6s
   ✔ cf55ff1c80af Pull complete                                10.2s
2024/04/28 17:01:42 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 16.0s (8/8) FINISHED                     docker:default
 => [php internal] load build definition from Dockerfile        0.0s
 => => transferring dockerfile: 488B                            0.0s
 => [php internal] load metadata for docker.io/library/php:8.0  3.2s
 => [php auth] library/php:pull token for registry-1.docker.io  0.0s
 => [php internal] load .dockerignore                           0.0s
 => => transferring context: 2B                                 0.0s
 => [php 1/3] FROM docker.io/library/php:8.0-apache@sha256:c87  5.7s
 => => resolve docker.io/library/php:8.0-apache@sha256:c87b4c9  0.0s
 => => sha256:b7f91549542cca4b35a34cdee53643 31.42MB / 31.42MB  0.9s
(省略)
 => => extracting sha256:64ffebf1272af88c371f9a231cb81456dbd57  0.0s
 => => extracting sha256:0f5602f40cda209163b96b947cf66d43d4a69  0.0s
 => [php 2/3] RUN apt-get update &&     apt-get install -y lib  6.7s
 => [php 3/3] RUN {     echo '[mysqld]';     echo 'default_aut  0.2s
 => [php] exporting to image                                    0.1s
 => => exporting layers                                         0.1s
 => => writing image sha256:e55c4a2bc7146aafff7a71498dee9b1236  0.0s
 => => naming to docker.io/library/phpdev3-php                  0.0s
[+] Running 5/5
 ✔ Network phpdev3_default         Created                      0.2s
 ✔ Volume "phpdev3_db-data"        Created                      0.0s
 ✔ Container phpmyadmin_container  Started                      0.0s
 ✔ Container mysql_container       Started                      0.0s
 ✔ Container php-apache_container  Started                      0.0s
PS C:\Users\joeac\Desktop\docker\phpdev3>

 「Container phpmyadmin_container Started」、「Container mysql_container Started」、「Container php-apache_container Started」と表示され、phpMyAdminコンテナ、MySQLコンテナと「PHP+Apache」が起動します。

 この続きは「PHP+Apache+MySQL+phpMyAdminの開発環境コンテナ②」でPHPプログラムを作成して、phpMyAdminコンテナ経由でMySQLデータベースへ接続していきます。

関連コンテンツ