Dockerとコンテナの基本を理解しよう
更新日:2026-08-02
前の記事までに、WSL上でプロジェクトを編集し、Gitで変更履歴を記録できるようになりました。ここからは、PHP、Apache、MySQLをDockerコンテナで動かします。
この記事ではまだComposeファイルを作りません。次の記事の設定を読めるように、Dockerで使う言葉と役割を先に整理します。
Dockerを使う理由
PHPを動かすだけなら、UbuntuへPHPを直接インストールすることもできます。しかし、複数のプロジェクトで異なるPHPやMySQLのバージョンが必要になると、管理が複雑になります。
Dockerでは、プロジェクトに必要な環境をコンテナへ分けます。
WSL上のプロジェクト
├── ソースコード
├── Dockerの設定ファイル
└── コンテナ
├── php:ApacheとPHP
├── db:MySQL
└── phpmyadmin:MySQL管理画面
設定をファイルとして共有できるため、同じDocker環境を別の端末でも作りやすくなります。
イメージとコンテナを理解する
イメージは実行環境のひな型
Dockerイメージには、OSの基本ファイル、PHPなどのソフトウェア、初期設定がまとめられています。
たとえばphp:8.3-apacheは、PHP 8.3とApacheを含む公式イメージです。
イメージは読み取り専用のひな型として扱われ、同じイメージから複数のコンテナを作れます。
コンテナはイメージから作る実行単位
コンテナは、イメージをもとに起動した実行環境です。
php:8.3-apacheイメージを指定する- イメージから
phpコンテナを起動する - コンテナ内でApacheとPHPが動く
- ブラウザからApacheへアクセスする
コンテナを削除しても、ソースコードやデータを適切にボリュームへ保存していれば、再作成できます。
Dockerfileを理解する
既存のイメージへパッケージや設定を追加し、独自イメージを作る手順を記述するファイルがDockerfileです。
FROM php:8.3-apache
RUN docker-php-ext-install pdo_mysql
WORKDIR /var/www/html
FROM:土台にするイメージRUN:イメージ作成中に実行するコマンドWORKDIR:コンテナ内の作業ディレクトリ
Dockerfileを変更した場合は、イメージを再ビルドします。
docker compose build php
Docker Composeを理解する
Docker Composeは、複数コンテナの構成を一つのYAMLファイルへ定義し、まとめて操作する仕組みです。
services:
php:
image: php:8.3-apache
db:
image: mysql:8.0
servicesの直下にあるphpとdbがサービス名です。この教材では、WebサーバーとPHPを含むサービス名を、本プロジェクトに合わせてphpとします。
主な操作は次のとおりです。
docker compose up -d
docker compose ps
docker compose logs php
docker compose exec php php -v
docker compose down
ポートを理解する
コンテナ内のApacheは80番ポートで待ち受けます。Windowsのブラウザからアクセスするには、ホスト側のポートと接続します。
ports:
- "8000:80"
左側がホスト側、右側がコンテナ側です。
- ブラウザで
localhost:8000を開く - ホスト側の8000番ポートで受け取る
phpコンテナの80番ポートへ転送する- Apacheがレスポンスを返す
phpMyAdminはホスト側の8080番を使用します。
ports:
- "8080:80"
ボリュームを理解する
ボリュームは、ホストとコンテナのファイルを共有したり、コンテナを作り直してもデータを残したりする仕組みです。
バインドマウント
volumes:
- ./src:/var/www/html
WSL上のsrcをコンテナの/var/www/htmlへ接続します。VS Codeで変更したPHPファイルが、コンテナからすぐに見えます。
名前付きボリューム
volumes:
- db_data:/var/lib/mysql
MySQLのデータをDocker管理の領域へ保存します。コンテナを再作成しても、db_dataを削除しなければデータを残せます。
docker compose down -vは名前付きボリュームも削除します。データが不要だと確認できる場合以外は、安易に-vを付けないでください。
コンテナ間の通信を理解する
同じCompose内のサービスは、サービス名をホスト名として通信できます。
phpコンテナでは接続先をDB_HOST=dbとし、dbコンテナのMySQLへ接続します。
コンテナ内からMySQLへ接続するとき、localhostはPHPコンテナ自身を指します。MySQLサービス名のdbを指定します。
Docker DesktopとWSLの役割
WindowsではDocker Desktopを利用し、WSL 2バックエンドとUbuntuの連携を有効にする構成が一般的です。
Docker Desktopを起動した状態で、Ubuntuから確認します。
docker --version
docker compose version
両方のバージョンが表示されれば、WSLのターミナルからDockerを操作できます。
まとめ
- イメージは実行環境のひな型、コンテナは起動した実行単位
- Dockerfileは独自イメージの作成手順を記述する
- Docker Composeは複数サービスを一つの構成として管理する
- ポートはホスト側とコンテナ側を接続する
- ソースコードはバインドマウント、DBデータは名前付きボリュームで保持できる
- コンテナ同士はComposeのサービス名で通信できる
次の記事では、Dockerfileを使わない構成と、Dockerfileからビルドする構成の二通りでComposeファイルを作ります。