Dockerを使用してApacheとMySQLを統合した環境を構築することで、開発やテスト環境のセットアップが劇的に簡略化されます。従来、LAMP環境(Linux, Apache, MySQL, PHP)を構築するには個別にソフトウェアをインストールし、設定を行う必要がありました。しかし、Dockerを活用すれば、これらの環境をコンテナ化し、一元管理することが可能です。
本記事では、DockerとDocker Composeを使ってApacheとMySQLが連携した環境を構築する手順を、初心者でもわかりやすいように段階的に解説します。Dockerのインストール方法から、ApacheやMySQLのコンテナ設定、さらに両者の連携やネットワーク設定までを網羅しています。
最終的には、Docker環境で動作するLAMPスタックが完成し、簡単なPHPアプリケーションの実行やデータベースへの接続が行えるようになります。Dockerでの環境構築がもたらす柔軟性と効率性を理解し、開発プロセスを一段階引き上げるための第一歩を踏み出しましょう。
Dockerの基本概要とインストール方法
Dockerは、アプリケーションをコンテナ化することで、どの環境でも一貫した動作を実現するプラットフォームです。コンテナは、アプリケーションとその依存関係をパッケージ化した軽量な仮想環境のようなもので、従来の仮想マシンと比べて高速でリソース消費が少ないという特徴があります。
Dockerの導入により、開発環境の統一が容易になり、環境差異による「動かない問題」を解消できます。また、本番環境と同様の環境をローカルで構築できるため、テストやデバッグの効率が向上します。
Dockerのインストール手順
Dockerを利用するには、Docker EngineとDocker Composeをインストールする必要があります。以下に、主要なOSごとのインストール方法を説明します。
Windowsの場合
- Docker公式サイトからDocker Desktopをダウンロードします。
- インストーラーを実行し、指示に従ってインストールを進めます。
- インストール完了後、Docker Desktopを起動して「Containers are running」と表示されればインストール完了です。
Macの場合
- Docker公式サイトからDocker Desktop for Macをダウンロードします。
- ダウンロードした.dmgファイルを開き、DockerアプリケーションをApplicationsフォルダにドラッグします。
- Dockerを起動して、動作確認を行います。
Linuxの場合
- ターミナルを開き、以下のコマンドを実行してDockerをインストールします。
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
- インストール後、Dockerが正常にインストールされたかを確認します。
docker --version
Docker Composeのインストール
Docker Composeは、複数のコンテナを管理するためのツールです。以下のコマンドでインストールします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
インストール後、バージョン確認を行います。
docker-compose --version
これで、DockerとDocker Composeのインストールが完了し、次のステップでLAMP環境構築に進む準備が整いました。
LAMP環境とは何か
LAMP環境は、Linux、Apache、MySQL、PHPの頭文字を取ったもので、Webアプリケーションを動作させるための基本的なサーバー環境の一つです。オープンソース技術を活用し、柔軟性や拡張性が高いため、多くのWebサービスの基盤として利用されています。
Dockerを使用することで、従来は手動で行っていたLAMP環境の構築が簡略化され、必要なコンポーネントをコンテナ化して一括管理できます。これにより、環境ごとの違いを吸収し、本番環境と同一の開発環境を簡単に再現可能です。
LAMP構成の役割
Linux
サーバーのOSとして動作します。DockerではベースイメージとしてLinuxが含まれるため、Linuxベースの環境が自動的に構築されます。
Apache
Webサーバーとして動作し、クライアントからのリクエストを処理します。HTTPリクエストを受け取り、静的なHTMLや動的なPHPファイルを提供します。
MySQL
データベース管理システムで、Webアプリケーションが使用するデータを格納・管理します。ユーザー情報や投稿内容など、アプリケーションの重要なデータを処理します。
PHP
サーバーサイドのスクリプト言語で、動的なWebページを生成します。Apacheと連携してリクエストを処理し、MySQLデータベースと接続して必要なデータを取得・表示します。
LAMP環境のメリット
- オープンソースでコストがかからない:LAMP環境はすべてのコンポーネントがオープンソースで提供されており、無料で利用できます。
- 高い柔軟性と拡張性:各コンポーネントが独立しているため、必要に応じてアップデートやカスタマイズが可能です。
- 広く普及している:豊富なドキュメントやチュートリアルが存在し、問題が発生しても迅速に解決できる環境が整っています。
Dockerを利用することで、LAMP環境をコンテナで構築し、複数のプロジェクトを並行して動作させることが可能になります。次のセクションでは、Docker Composeを使用して複数のコンテナを一元管理する方法について解説します。
Docker Composeを使用するメリット
Docker Composeは、複数のDockerコンテナを簡単に管理・構築するためのツールです。LAMP環境のように、Apache、MySQL、PHPなど複数のサービスが連携するシステムでは、それぞれのコンポーネントを別々のコンテナとして管理するのが一般的です。Docker Composeを使用することで、これらの複数のコンテナを一括して起動・停止・設定できます。
Docker Composeの特徴と利点
1. 簡潔な構成管理
Docker Composeは、YAMLファイルを使ってコンテナの構成を定義します。コードを記述するだけで環境構築が自動化されるため、シンプルでわかりやすく、構築ミスを防ぎます。
2. 再利用可能な環境設定
YAMLファイルはバージョン管理が可能で、他の開発者と共有することで同一の環境をすぐに再現できます。これにより、開発環境と本番環境の差異をなくし、デプロイが容易になります。
3. マルチコンテナの管理が容易
LAMP環境では、ApacheとMySQLが異なるコンテナで動作します。Docker Composeを使えば、コマンド一つで全てのサービスを起動・停止できるため、運用管理が大幅に楽になります。
docker-compose up -d
docker-compose down
4. ポータビリティが高い
Docker Composeを利用すれば、同じYAMLファイルを使ってどのOSでも同一環境を構築できます。開発者間の環境差異がなくなり、チームでの作業がスムーズになります。
具体的なシナリオ
例えば、Apache、MySQL、PHPを個別にインストールする場合、それぞれのインストールや設定に時間がかかります。しかし、Docker Composeでは以下のようにYAMLファイルを作成するだけで、簡単にLAMP環境が構築できます。
version: '3'
services:
web:
image: httpd:latest
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
このYAMLファイルを使えば、すぐにApacheとMySQLが連携する環境が立ち上がります。
まとめ
Docker Composeは、複数のDockerコンテナを統合し、環境構築の手間を大幅に削減する強力なツールです。次のセクションでは、具体的にLAMP環境を構築するためのDocker Composeファイルの作成方法を詳しく解説します。
Docker Composeファイルの作成方法
Docker Composeを使ってApacheとMySQLを統合するLAMP環境を構築するためには、docker-compose.yml
ファイルを作成します。このファイルには、必要なサービス(ApacheやMySQLなど)と、それらの設定を記述します。
ディレクトリ構成
まず、作業ディレクトリを作成し、必要なファイルを配置します。以下のような構成になります。
/lamp-docker
│
├── docker-compose.yml
└── html
└── index.php
html
ディレクトリには、PHPファイルなどのWebコンテンツを配置します。docker-compose.yml
はDocker Composeが読み込む設定ファイルです。
docker-compose.ymlの作成
以下は、Apache(httpd)とMySQLを統合するdocker-compose.yml
の基本的な記述例です。
version: '3.8'
services:
web:
image: httpd:latest
container_name: apache_server
ports:
- "8080:80"
volumes:
- ./html:/usr/local/apache2/htdocs
networks:
- lamp_network
db:
image: mysql:5.7
container_name: mysql_server
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: sampledb
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
networks:
- lamp_network
volumes:
db_data:
networks:
lamp_network:
設定項目の解説
1. servicesセクション
web
とdb
の2つのサービスが定義されています。それぞれApacheとMySQLのコンテナを起動します。
2. image
Docker Hubからhttpd:latest
(Apache)とmysql:5.7
の公式イメージを使用します。
3. ports
8080:80
は、ホストマシンの8080番ポートをコンテナの80番ポートにマッピングします。ブラウザからhttp://localhost:8080
でアクセスできます。
3306:3306
は、MySQLのデフォルトポートをホストとコンテナ間で同じにしています。
4. volumes
./html:/usr/local/apache2/htdocs
で、ホストのhtmlディレクトリがApacheのドキュメントルートにマウントされます。PHPファイルをここに配置するだけで反映されます。db_data:/var/lib/mysql
は、MySQLのデータをホスト側に保存し、データの永続化を行います。
5. networks
lamp_network
は、ApacheとMySQLコンテナが同じネットワーク内で通信できるようにします。
index.phpの作成
html
ディレクトリに以下のindex.php
を作成します。
<?php
phpinfo();
?>
これで、ブラウザからhttp://localhost:8080
にアクセスするとPHPの情報が表示され、LAMP環境が正しく動作しているか確認できます。
次は、Apacheコンテナの起動方法と設定について詳しく説明します。
Apacheコンテナの設定と起動
Docker Composeファイルを作成した後は、Apacheコンテナを起動し、設定を調整してWebサーバーを動作させます。Apacheは、PHPファイルの実行や静的ファイルの配信を担当するLAMP環境の要です。
Apacheコンテナの起動
作成したdocker-compose.yml
があるディレクトリで、以下のコマンドを実行してApacheコンテナを起動します。
docker-compose up -d
-d
オプションは、コンテナをバックグラウンドで実行するためのものです。コンテナが起動したら、http://localhost:8080
にアクセスして、Apacheが正しく動作しているか確認します。
Apacheの設定変更
Apacheの設定ファイル(httpd.conf
)を変更することで、細かいカスタマイズが可能です。以下の手順でカスタム設定を適用します。
1. Apache設定ファイルの作成
lamp-docker
ディレクトリにconf
ディレクトリを作成し、その中にhttpd.conf
を配置します。
mkdir conf
conf/httpd.conf
の例:
ServerName localhost
<Directory "/usr/local/apache2/htdocs">
AllowOverride All
Require all granted
</Directory>
ErrorLog /usr/local/apache2/logs/error.log
CustomLog /usr/local/apache2/logs/access.log combined
2. docker-compose.ymlに設定を追加
Apacheの設定ファイルをボリュームとしてコンテナにマウントします。
web:
image: httpd:latest
container_name: apache_server
ports:
- "8080:80"
volumes:
- ./html:/usr/local/apache2/htdocs
- ./conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
networks:
- lamp_network
この設定により、ホスト側のconf/httpd.conf
がコンテナ内の/usr/local/apache2/conf/httpd.conf
に反映されます。
Apacheコンテナの再起動
設定ファイルを変更した後は、Apacheコンテナを再起動して設定を適用します。
docker-compose down
docker-compose up -d
動作確認
ブラウザでhttp://localhost:8080
にアクセスし、設定が正しく反映されているか確認します。また、エラーログやアクセスログは以下のコマンドで確認可能です。
docker logs apache_server
ApacheのPHPサポート
httpd:latest
のイメージにはデフォルトでPHPが含まれていません。PHPを動作させるには、以下のようにカスタムDockerfileを作成してPHPが動作する環境を構築します。
FROM php:7.4-apache
COPY ./html/ /var/www/html/
このDockerfileを使ってイメージをビルドし、ApacheとPHPが連携するLAMP環境を構築します。
次は、MySQLコンテナの設定と初期データベースの作成について解説します。
MySQLコンテナの設定と初期データベース作成
LAMP環境のデータベース部分を担うMySQLコンテナを設定し、必要に応じて初期データベースやユーザーを作成します。これにより、Webアプリケーションがデータベースと連携できる状態になります。
MySQLコンテナの基本設定
docker-compose.yml
でMySQLコンテナの設定を行います。以下の設定は、MySQL 5.7の公式イメージを使用し、環境変数で初期設定を行う例です。
db:
image: mysql:5.7
container_name: mysql_server
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: sampledb
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
- ./db/init:/docker-entrypoint-initdb.d
networks:
- lamp_network
環境変数の説明
- MYSQL_ROOT_PASSWORD:MySQLのルートユーザーのパスワードを設定します。
- MYSQL_DATABASE:初回起動時に自動で作成されるデータベース名を指定します。
- MYSQL_USER:アプリケーションが接続するためのユーザー名を指定します。
- MYSQL_PASSWORD:アプリケーションユーザーのパスワードを設定します。
初期データベースの作成
初期データやテーブル構造を自動的にセットアップするには、MySQLコンテナの起動時にSQLファイルを実行させます。docker-entrypoint-initdb.d
に配置したSQLファイルは、MySQLの初回起動時に自動的に実行されます。
1. 初期SQLスクリプトの作成
lamp-docker/db/init
ディレクトリを作成し、その中にinit.sql
を配置します。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (username, email) VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com');
2. `docker-compose.yml`への反映
以下の行で、初期化用のSQLファイルをコンテナ内の/docker-entrypoint-initdb.d
にマウントします。
volumes:
- ./db/init:/docker-entrypoint-initdb.d
MySQLコンテナの起動
以下のコマンドでコンテナを起動し、初期データベースのセットアップを確認します。
docker-compose up -d
MySQLへの接続確認
コンテナが正常に起動したら、以下のコマンドでMySQLコンテナに接続し、データベースやテーブルの状態を確認します。
docker exec -it mysql_server mysql -u root -p
接続後、データベースの一覧を確認します。
SHOW DATABASES;
USE sampledb;
SHOW TABLES;
SELECT * FROM users;
まとめ
これでMySQLコンテナの基本設定が完了し、データベースの初期構築が自動的に行われる環境が整いました。次は、ApacheとMySQLコンテナ間の接続とネットワーク設定について解説します。
コンテナの接続とネットワーク設定
ApacheとMySQLがそれぞれ独立したコンテナで動作するLAMP環境では、これらのコンテナ同士が通信できるようにネットワーク設定を行う必要があります。Docker Composeを使用することで、複数のコンテナを同じネットワークに接続し、サービス間の連携を容易に実現できます。
Dockerネットワークの基本
Docker Composeでは、networks
セクションを使用してカスタムネットワークを作成できます。コンテナが同じネットワークに接続されている場合、コンテナ名(サービス名)で相互にアクセスできます。これにより、ApacheがMySQLのホスト名としてdb
を使用して接続可能になります。
ネットワークの定義
docker-compose.yml
に以下のようにネットワークを定義します。
networks:
lamp_network:
driver: bridge
すでにweb
とdb
の各サービスはこのネットワークに接続されています。
services:
web:
image: httpd:latest
container_name: apache_server
ports:
- "8080:80"
volumes:
- ./html:/usr/local/apache2/htdocs
networks:
- lamp_network
db:
image: mysql:5.7
container_name: mysql_server
environment:
MYSQL_ROOT_PASSWORD: rootpassword
ports:
- "3306:3306"
networks:
- lamp_network
これにより、Apacheコンテナ内からMySQLコンテナにdb
という名前でアクセスできます。
PHPからMySQLへの接続
PHPアプリケーションがMySQLに接続できることを確認するために、html
ディレクトリ内にPHPスクリプトを作成します。
1. `db_test.php`の作成
lamp-docker/html
ディレクトリにdb_test.php
を配置します。
<?php
$servername = "db";
$username = "user";
$password = "password";
$dbname = "sampledb";
// MySQLデータベースへの接続
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続確認
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
// データの取得
$sql = "SELECT * FROM users";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<p>" . $row["username"] . ": " . $row["email"] . "</p>";
}
} else {
echo "No results";
}
$conn->close();
?>
2. 動作確認
Apacheコンテナが起動している状態で、ブラウザからhttp://localhost:8080/db_test.php
にアクセスします。データベースとの接続が成功し、ユーザー一覧が表示されれば、ネットワーク設定は正しく機能しています。
ネットワーク確認コマンド
Dockerネットワークの状態を確認するには以下のコマンドを使用します。
docker network ls
docker network inspect lamp-docker_lamp_network
これにより、ネットワークに接続されているコンテナや設定を確認できます。
トラブルシューティング
- 接続できない場合
- MySQLのログを確認します。
bash docker logs mysql_server
- PHPスクリプトのホスト名が
db
になっているか確認します。 - ネットワークが正しく作成されているか確認します。
bash docker network inspect lamp-docker_lamp_network
これで、ApacheとMySQLのコンテナがネットワークで接続され、LAMP環境のセットアップが完了しました。次は、動作確認とトラブルシューティングについて詳しく解説します。
動作確認とトラブルシューティング
LAMP環境の構築が完了したら、ApacheとMySQLが正しく連携して動作するか確認します。ここでは、動作確認の方法と、よくあるトラブルの解決方法について解説します。
動作確認
まずは、ApacheがPHPファイルを正しく処理し、MySQLデータベースと接続できるかを確認します。
1. Apacheの動作確認
ブラウザで以下のURLにアクセスします。
http://localhost:8080
html
フォルダに配置したindex.php
が表示されれば、Apacheが正しく動作しています。
2. MySQLとの接続確認
以下のURLにアクセスして、データベース接続を確認します。
http://localhost:8080/db_test.php
正常に接続できれば、「Connected successfully」とユーザー一覧が表示されます。
よくあるトラブルと解決方法
1. 「Connected successfully」が表示されない場合
- エラーメッセージ例:
Connection failed: Connection refused
- 原因:
- MySQLコンテナが起動していない。
- PHPスクリプトの接続先ホスト名が間違っている。
- 解決策:
docker-compose ps
MySQLコンテナ(mysql_server
)がUp
になっているか確認します。起動していなければ以下のコマンドで再起動します。
docker-compose up -d
また、PHPスクリプトの接続ホストがdb
になっているか確認します。
2. 「No results」と表示される場合
- 原因:
データベースにデータが存在しない。 - 解決策:
初期データを投入するSQLファイル(init.sql
)が正しく配置されているか確認します。
docker exec -it mysql_server mysql -u root -p
データベースに接続し、データが存在するか確認します。
USE sampledb;
SELECT * FROM users;
3. Apacheが404エラーを返す場合
- 原因:
PHPファイルやindex.php
が正しいディレクトリに配置されていない。 - 解決策:
docker-compose.yml
のvolumes
セクションが正しく設定されているか確認します。
volumes:
- ./html:/usr/local/apache2/htdocs
ファイルがhtml
フォルダ内に存在するかをチェックします。
4. MySQLのポートが使用中で起動できない場合
- エラーメッセージ例:
Bind for 0.0.0.0:3306 failed: port is already allocated
- 解決策:
ホスト側でMySQLがすでに動作している場合、コンテナのポートを変更します。
ports:
- "3307:3306"
このようにホスト側のポートを3307などに変更し、コンテナを再起動します。
docker-compose down
docker-compose up -d
ログの確認
問題が発生した場合は、ログを確認して原因を特定します。
docker logs apache_server
docker logs mysql_server
ApacheとMySQLのログからエラーメッセージを確認し、必要に応じて設定を修正します。
動作確認のポイント
- ブラウザから
phpinfo()
が表示されるか確認する。 db_test.php
でMySQLのデータを取得できるか検証する。- エラーログを常にチェックし、問題を早期に解決する。
次のセクションでは、LAMP環境のまとめと今後の拡張について解説します。
まとめ
本記事では、Dockerを使用してApacheとMySQLを統合したLAMP環境を構築する方法を解説しました。Docker Composeを活用することで、複数のコンテナを簡単に管理し、開発環境の再現性を高めることができました。
主要なポイントは以下の通りです。
- DockerとDocker Composeをインストールし、基本的な環境を整えました。
- ApacheとMySQLのコンテナを
docker-compose.yml
で設定し、LAMPスタックを構築しました。 - コンテナ間のネットワークを設定し、ApacheからMySQLへの接続を確認しました。
- 動作確認とトラブルシューティングを通じて、エラー解決の方法も学びました。
Dockerを活用することで、従来の手動によるLAMP環境構築に比べて、より迅速かつ柔軟に環境をセットアップできます。今後はPHPや追加モジュールを導入し、さらに高度なWebアプリケーションの構築を進めていくことが可能です。
Docker環境を活かして、効率的な開発と運用を実現しましょう。
コメント