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

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

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

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

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

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

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

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

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

PHP開発環境

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

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コマースプラットフォームなど、さまざまな用途で広く利用されており、その柔軟性と信頼性から、多くの開発者や組織に信頼されています。

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

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

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

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

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

不要な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 phpdev2」コマンド
  • 「cd phpdev2」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir phpdev2

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

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/25     2:29                phpdev2

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

「Dockerfile」ファイルの作成

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

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

PS C:\Users\joeac\Desktop\docker\phpdev2> 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

volumes:
  db-data:

定義内容の解説

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

サービス意味
dbデータベースサービス。
phpPHPとApacheを含むウェブサービス。
volumesデータ永続化のためのボリューム。
サービス

dbサービス

項目意味
image使用するDockerイメージを指定します。ここではMySQL 8.0の公式イメージ(mysql:8.0)を使用しています。
container_nameコンテナの名前を指定します。ここではmysql_containerという名前が指定されています。
environmentコンテナ内で使用する環境変数を設定します。MySQLのルートパスワード、データベース名、ユーザー名、およびパスワードが設定されています。
volumesボリュームのマウントを行います。ここでは、db-dataという名前のボリュームを/var/lib/mysqlにマウントして、MySQLのデータが永続化されるようにしています。
dbサービス

phpサービス

項目意味
buildカレントディレクトリ(.)のDockerfileからこのサービスのイメージをビルドします。
container_nameコンテナの名前は「php-apache_container」です。
depends_onこのサービスが依存するサービスが「db」であることを示します。
portsホストのポート80をコンテナのポート80にマッピングし、ウェブサイトを公開します。
volumesホストの「./src」ディレクトリをコンテナの「/var/www/html」にマウントし、ウェブサイトのソースコードを提供します。
phpサービス

volumes

項目意味
db-dataデータベースの永続化のためのボリューム。
volumes

コンテナの作成と実行

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

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

PS C:\Users\joeac\Desktop\docker\phpdev2> docker compose up -d
[+] Running 12/12
 ✔ db Pulled                                                                                                      11.9s
   ✔ bd37f6d99203 Pull complete                                                                                    1.8s
   ✔ d2433cba0951 Pull complete                                                                                    0.7s
   ✔ 13702d9fe3c3 Pull complete                                                                                    0.8s
   ✔ 83bcc87284a1 Pull complete                                                                                    1.8s
   ✔ c38d8660e1fa Pull complete                                                                                    1.5s
   ✔ 7e1bc321f421 Pull complete                                                                                    2.1s
   ✔ bddd54b9c549 Pull complete                                                                                    4.0s
   ✔ 4eaae1e844ac Pull complete                                                                                    2.5s
   ✔ 5196e1e87d8f Pull complete                                                                                    4.7s
   ✔ 6586d096303c Pull complete                                                                                    3.2s
   ✔ cf55ff1c80af Pull complete                                                                                    4.0s
2024/04/25 23:01:16 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 15.5s (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-apache                                              2.6s
 => [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:c87b4c94d53b35520467b6d026f38656ab9a6d446fa3a0fbba1bc6  6.1s
 => => resolve docker.io/library/php:8.0-apache@sha256:c87b4c94d53b35520467b6d026f38656ab9a6d446fa3a0fbba1bc63312  0.0s
 => => sha256:71e5060f3937930b5fa3d39f56adf3c2acfea72741014d1969f3f437e5835631 91.64MB / 91.64MB                   3.3s
 => => sha256:862325aee87fc1d9b818bfc96a4412b9cd008a951101913077421d3d86c4cc9d 3.04kB / 3.04kB                     0.0s
 => => sha256:0754b57b9b7d3a089ca18ba98121861a56ce2624c2875a8e7bf8b21a7957eec8 225B / 225B                         0.5s
 => => sha256:3357132d6ece3a509ce6f8abf6e7cf9886b343c504cb58428a7302cbe7abe446 12.84kB / 12.84kB                   0.0s
 => => sha256:b7f91549542cca4b35a34cdee5364339f17468971ea730bb072864d3e78c8b94 31.42MB / 31.42MB                   1.2s
 => => sha256:c87b4c94d53b35520467b6d026f38656ab9a6d446fa3a0fbba1bc633125f9ad2 1.86kB / 1.86kB                     0.0s
 => => sha256:f25a6e74b7f558f50a59c2efa94a62c44a6323861b0c76e6d2144078ab6c5ed4 271B / 271B                         0.9s
 => => sha256:c5d33b602102b183f8435dd317aff8889153fbf7eb46df307891feaa427a627c 19.26MB / 19.26MB                   2.6s
 => => extracting sha256:b7f91549542cca4b35a34cdee5364339f17468971ea730bb072864d3e78c8b94                          1.1s
 => => sha256:866c9e44fbd45ff348f92197e8339f30a9888e80f74473a4354e370b3039760f 473B / 473B                         1.5s
 => => sha256:dd2572036f7c292392aafb9fb89d2ce0215b5dcb6c8046f4e3eba4933e1f16d0 512B / 512B                         1.8s
 => => sha256:23211a2fa48d3f0ba43c2124eb3f88fd0ee85fbd1c60e5c0c2ce7feeb9cd7258 11.16MB / 11.16MB                   2.5s
 => => extracting sha256:0754b57b9b7d3a089ca18ba98121861a56ce2624c2875a8e7bf8b21a7957eec8                          0.0s
 => => sha256:7477e087c645035156569857f92b7a4cb763de7856d9742c00b8ef5a4a088462 493B / 493B                         2.8s
 => => sha256:8d8d3d5c12ce803cdaf4abcfba7285f96b834b680ae0643ea7eb375cf591c7cb 10.78MB / 10.78MB                   3.2s
 => => sha256:e2fa9cf394d513be8d00c29ba363f4e17ad120634bee066d4b659d9f102f9313 2.46kB / 2.46kB                     3.0s
 => => sha256:64ffebf1272af88c371f9a231cb81456dbd574cf8cf01f4f61da84c56c2db35c 245B / 245B                         3.3s
 => => sha256:0f5602f40cda209163b96b947cf66d43d4a6934d40f59301a57eddb5f52eb5a2 892B / 892B                         3.5s
 => => extracting sha256:71e5060f3937930b5fa3d39f56adf3c2acfea72741014d1969f3f437e5835631                          1.8s
 => => extracting sha256:f25a6e74b7f558f50a59c2efa94a62c44a6323861b0c76e6d2144078ab6c5ed4                          0.0s
 => => extracting sha256:c5d33b602102b183f8435dd317aff8889153fbf7eb46df307891feaa427a627c                          0.3s
 => => extracting sha256:866c9e44fbd45ff348f92197e8339f30a9888e80f74473a4354e370b3039760f                          0.0s
 => => extracting sha256:dd2572036f7c292392aafb9fb89d2ce0215b5dcb6c8046f4e3eba4933e1f16d0                          0.0s
 => => extracting sha256:23211a2fa48d3f0ba43c2124eb3f88fd0ee85fbd1c60e5c0c2ce7feeb9cd7258                          0.0s
 => => extracting sha256:7477e087c645035156569857f92b7a4cb763de7856d9742c00b8ef5a4a088462                          0.0s
 => => extracting sha256:8d8d3d5c12ce803cdaf4abcfba7285f96b834b680ae0643ea7eb375cf591c7cb                          0.3s
 => => extracting sha256:e2fa9cf394d513be8d00c29ba363f4e17ad120634bee066d4b659d9f102f9313                          0.0s
 => => extracting sha256:64ffebf1272af88c371f9a231cb81456dbd574cf8cf01f4f61da84c56c2db35c                          0.0s
 => => extracting sha256:0f5602f40cda209163b96b947cf66d43d4a6934d40f59301a57eddb5f52eb5a2                          0.0s
 => [php 2/3] RUN apt-get update &&     apt-get install -y libonig-dev &&     apt-get install -y default-libmysql  6.5s
 => [php 3/3] RUN {     echo '[mysqld]';     echo 'default_authentication_plugin=mysql_native_password';     } >   0.2s
 => [php] exporting to image                                                                                       0.1s
 => => exporting layers                                                                                            0.1s
 => => writing image sha256:95463f6ac80c95ab21ced31662d64c1a4b6810cfdbfda925b0e06bf0a17e26ca                       0.0s
 => => naming to docker.io/library/phpdev2-php                                                                     0.0s
[+] Running 4/4
 ✔ Network phpdev2_default         Created                                                                         0.2s
 ✔ Volume "phpdev2_db-data"        Created                                                                         0.0s
 ✔ Container mysql_container       Started                                                                         0.0s
 ✔ Container php-apache_container  Started                                                                         0.0s

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

テナと「PHP+Apache」が起動します。


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

関連コンテンツ