このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Docker入門】PHP+Apache+MriaDBの開発環境コンテナ①

Docker Composeコマンドを使ったPHP+Apache+MriaDBの開発環境コンテナの構築例を紹介します。
「PHP+Apache+MriaDBの開発環境コンテナ」は次の2部に分けて解説していきます。
ここでは、コンテナの作成に必要な「Dockerfile」と「compose.yaml」ファイルを作成していきます。
使用するイメージには、PHPイメージとMariaDBイメージを使用します。
Apacheイメージは使わないの?
と、思われるかもしれません。
Apacheが組み込まれたPHPイメージがDocker Hub上にありますので、そちらの公式イメージを使用することにします。
PHP開発環境
PHP開発環境は、ウェブアプリケーションの開発に広く使用されるPHP言語と、その他の関連技術を含む環境です。PHPは、動的なウェブページやウェブアプリケーションを作成するためのスクリプト言語として非常に人気があります。
一般的なデータベースとしては、MariaDBやMySQLが頻繁に利用されます。これらのデータベースは、PHPアプリケーションでのデータの保存や取得に使用されます。PHP開発環境には、PHPランタイム、ウェブサーバー(一般的にはApacheやNginx)、データベースサーバー、開発ツール、そして必要に応じて追加のサービスやライブラリが含まれます。
PHP開発環境を構築することで、開発者はPHP言語を使用してウェブアプリケーションを作成し、データベースとの連携を容易に行うことができます。
PHPとは
まず、はじめに PHPについて簡単に解説します。

PHPは、広く使用されるスクリプト言語であり、主にウェブ開発において動的なウェブページやウェブアプリケーションを作成するために用いられます。
PHPは、HTMLに埋め込んで記述されることが一般的であり、ウェブサーバー上で実行されます。PHPは、他のプログラミング言語と比較して学習が容易であり、柔軟性に富んでいるため、初心者から上級者まで幅広いユーザーに利用されています。
PHPの特徴の一つは、データベースとの連携が容易であることです。多くのデータベースとの統合がサポートされており、特にMySQLやMariaDBとの組み合わせが一般的です。
PHPはオープンソースであり、大規模なコミュニティに支えられており、多くのフレームワークやライブラリが利用可能です。これらの特性から、PHPはウェブ開発の現場で幅広く利用され、多くの人々に愛されています。

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

1995年にリリースされ、オープンソースのプロジェクトとして開発されています。Apacheは、安定性、柔軟性、豊富な機能セットなどの特徴により、多くのウェブサイトやアプリケーションで使用されています。
MariaDBとは
MariaDBは、オープンソースのリレーショナルデータベース管理システムであり、MySQLのフォークから派生しています。

MySQLの元々の開発者がMySQLのオープンソースコミュニティとの不和から派生させたものです。MariaDBはMySQLと互換性があり、MySQLからの移行が比較的容易です。
「Apache+PHP」コンテナとMariaDBコンテナの構成
以下のように「Apache+PHP」コンテナとMariaDBコンテナを構成します。

MariaDBのデータは「db-data」という永続的なボリュームに保存し、「PHP+Apache」コンテナのデータはホストマシンの「./src」ディレクトリにバインドマウントさせます。
「PHP+Apache」コンテナとMariaDBコンテナの作成
「Dockerfile」と「compose.yaml」を作成して、「PHP+Apache」コンテナとMariaDBコンテナを作成します。
不要な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」ファイルを保存する「phpdev1」ディレクトリを作成して、作成したディレクトリに移動します。次のコマンドを実行します。
- 「mkdir phpdev1」コマンド
- 「cd phpdev1」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir phpdev1
Directory: C:\Users\joeac\Desktop\docker
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2024/04/24 23:47 phpdev1
PS C:\Users\joeac\Desktop\docker> cd phpdev1
PS C:\Users\joeac\Desktop\docker\phpdev1>
「Dockerfile」ファイルの作成
VSCodeで「Dockerfile」ファイルを作成します。
・「code Dockerfile」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\pydev1> code Dockerfile
VSCodeが起動します。

・「Dockerfile」ファイルを以下のように編集して保存します。
FROM php:8.0-apache
RUN apt-get update && \
apt-get install -y libonig-dev && \
docker-php-ext-install pdo_mysql
定義内容の解説
「Dockerfile」ファイルの定義を解説します。
コマンド | 意味 |
---|---|
FROM php:8.0-apache | php:8.0-apache をベースイメージとして使用する。 |
RUN apt-get update && \ | パッケージリストを更新する。 && \ は、前のコマンドが成功した場合にのみ次のコマンドを実行する。 |
apt-get install -y libonig-dev && \ | libonig-dev パッケージをインストールする。 -y オプションは、インストール中に確認プロンプトをスキップし、デフォルトで「はい」を選択する。libonig-dev はPHPで正規表現を扱うために必要なライブラリです。 |
docker-php-ext-install pdo_mysql | pdo_mysql 拡張モジュールをインストールする。 pdo_mysql は、PHPでMariaDBデータベースに接続するための拡張機能。 |
これらのコマンドを組み合わせることで、php:8.0-apache
をベースイメージとして使用し、libonig-dev
パッケージをインストールし、pdo_mysql
拡張モジュールをPHPにインストールします。
compose.yamlの作成
VSCodeで「compose.yaml」ファイルを作成します。
・「code compose.yaml」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\phpdev1> code compose.yaml
VSCodeが起動します。

「compose.yaml」ファイルの編集
・「compose.yaml」ファイルを以下のように編集して保存します。
services:
db:
image: mariadb:10.8
container_name: mariadb_container
environment:
MARIADB_ROOT_PASSWORD: root-pass
MARIADB_DATABASE: test-db
MARIADB_USER: test-user
MARIADB_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 | データベースサービス。 |
php | PHPとApacheを含むウェブサービス。 |
volumes | データ永続化のためのボリューム。 |
dbサービス
項目 | 意味 |
---|---|
image | 使用するDockerイメージは、MariaDB 10.8です。 |
container_name | コンテナの名前は「mariadb_container」です。 |
environment | コンテナ内での環境変数の設定。rootのパスワード、データベース名、ユーザー名、パスワードが設定されています。 |
volumes | ホストのディレクトリ「db-data」をコンテナ内の「/var/lib/mysql」にマウントし、データを永続化します。 |
phpサービス
項目 | 意味 |
---|---|
build | カレントディレクトリ(.)のDockerfileからこのサービスのイメージをビルドします。 |
container_name | コンテナの名前は「php-apache_container」です。 |
depends_on | このサービスが依存するサービスが「db」であることを示します。 |
ports | ホストのポート80をコンテナのポート80にマッピングし、ウェブサイトを公開します。 |
volumes | ホストの「./src」ディレクトリをコンテナの「/var/www/html」にマウントし、ウェブサイトのソースコードを提供します。 |
volumes
項目 | 意味 |
---|---|
db-data | データベースの永続化のためのボリューム。 |
コンテナの作成と実行
「docker compose up -d」コマンドを実行します。
このコマンドは、「compose.yaml」ファイルを配置した場所で実行する必要があります。
PS C:\Users\joeac\Desktop\docker\phpdev1> docker compose up -d
[+] Running 9/9
✔ db Pulled 8.4s
✔ d1669123f281 Pull complete 1.3s
✔ 7942299fe584 Pull complete 0.6s
✔ ca116927bbe1 Pull complete 0.9s
✔ 9c0f0b5293ed Pull complete 1.3s
✔ ee0988afd61a Pull complete 1.6s
✔ 82d81fccd49d Pull complete 3.4s
✔ 7e361405ea73 Pull complete 2.0s
✔ be365127aa3f Pull complete 2.3s
2024/04/25 00:45:23 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 13.6s (7/7) FINISHED docker:default
=> [php internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 161B 0.0s
=> [php internal] load metadata for docker.io/library/php:8.0-apache 2.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/2] FROM docker.io/library/php:8.0-apache@sha256:c87b4c94d53b35520467b6d026f38656ab9a6d446fa3a0fbba1bc6 5.9s
=> => resolve docker.io/library/php:8.0-apache@sha256:c87b4c94d53b35520467b6d026f38656ab9a6d446fa3a0fbba1bc63312 0.0s
=> => sha256:0754b57b9b7d3a089ca18ba98121861a56ce2624c2875a8e7bf8b21a7957eec8 225B / 225B 0.5s
=> => sha256:c87b4c94d53b35520467b6d026f38656ab9a6d446fa3a0fbba1bc633125f9ad2 1.86kB / 1.86kB 0.0s
=> => sha256:3357132d6ece3a509ce6f8abf6e7cf9886b343c504cb58428a7302cbe7abe446 12.84kB / 12.84kB 0.0s
=> => sha256:71e5060f3937930b5fa3d39f56adf3c2acfea72741014d1969f3f437e5835631 91.64MB / 91.64MB 3.1s
=> => sha256:862325aee87fc1d9b818bfc96a4412b9cd008a951101913077421d3d86c4cc9d 3.04kB / 3.04kB 0.0s
=> => sha256:b7f91549542cca4b35a34cdee5364339f17468971ea730bb072864d3e78c8b94 31.42MB / 31.42MB 0.9s
=> => sha256:f25a6e74b7f558f50a59c2efa94a62c44a6323861b0c76e6d2144078ab6c5ed4 271B / 271B 0.8s
=> => sha256:c5d33b602102b183f8435dd317aff8889153fbf7eb46df307891feaa427a627c 19.26MB / 19.26MB 1.6s
=> => extracting sha256:b7f91549542cca4b35a34cdee5364339f17468971ea730bb072864d3e78c8b94 1.1s
=> => sha256:866c9e44fbd45ff348f92197e8339f30a9888e80f74473a4354e370b3039760f 473B / 473B 1.2s
=> => sha256:dd2572036f7c292392aafb9fb89d2ce0215b5dcb6c8046f4e3eba4933e1f16d0 512B / 512B 1.4s
=> => sha256:23211a2fa48d3f0ba43c2124eb3f88fd0ee85fbd1c60e5c0c2ce7feeb9cd7258 11.16MB / 11.16MB 2.0s
=> => sha256:7477e087c645035156569857f92b7a4cb763de7856d9742c00b8ef5a4a088462 493B / 493B 1.8s
=> => sha256:8d8d3d5c12ce803cdaf4abcfba7285f96b834b680ae0643ea7eb375cf591c7cb 10.78MB / 10.78MB 2.4s
=> => sha256:e2fa9cf394d513be8d00c29ba363f4e17ad120634bee066d4b659d9f102f9313 2.46kB / 2.46kB 2.2s
=> => extracting sha256:0754b57b9b7d3a089ca18ba98121861a56ce2624c2875a8e7bf8b21a7957eec8 0.0s
=> => sha256:64ffebf1272af88c371f9a231cb81456dbd574cf8cf01f4f61da84c56c2db35c 245B / 245B 2.5s
=> => sha256:0f5602f40cda209163b96b947cf66d43d4a6934d40f59301a57eddb5f52eb5a2 892B / 892B 2.6s
=> => 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/2] RUN apt-get update && apt-get install -y libonig-dev && docker-php-ext-install pdo_mysql 5.4s
=> [php] exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:9ac9b1aea7f99a06e173e7cb603a8209cbfd5df91d2d781a7bf084224a420ca8 0.0s
=> => naming to docker.io/library/phpdev1-php 0.0s
[+] Running 4/4
✔ Network phpdev1_default Created 0.0s
✔ Volume "phpdev1_db-data" Created 0.0s
✔ Container mariadb_container Started 0.0s
✔ Container php-apache_container Started
「Container mariadb_container Started」、「Container php-apache_container Started」と表示され、MariaDBコンテナと「PHP+Apache」が起動します。
この続きは「PHP+Apache+MriaDBの開発環境コンテナ②」でPHPプログラムを作成して、MariaDBデータベースへ接続していきます。