【保存版】Docker ComposeでPHPからMariaDBに接続する方法!詳細解説とサンプルコード付き
Docker Compose で PHP からローカル MariaDB に接続できない問題:詳細解説と解決策
このチュートリアルでは、Docker Compose で PHP から ローカル MariaDB に接続できない場合の一般的な問題と解決策を詳しく説明します。
問題の症状
この問題は、以下のいずれかの症状で現れます。
- PHP スクリプトがデータベースに接続できない
- "SQLSTATE[HY000] Access denied using password: yes" などのエラーメッセージが表示される
docker-compose ps
コマンドを実行しても MariaDB コンテナが起動していないように見える
問題の原因
- ネットワーク設定: PHP スクリプトと MariaDB コンテナ間で適切なネットワーク接続が確立されていない
- 認証情報: PHP スクリプトが間違ったデータベース接続情報を使用している
- MariaDB サービス: MariaDB コンテナが起動していない、または予期しない動作をしている
- PHP 環境: PHP 環境が PDO 拡張機能をロードしていない
解決策
以下の手順で問題を解決することができます。
ネットワーク設定を確認する
MariaDB コンテナが docker-compose.yml
ファイルで定義されているネットワークに接続していることを確認します。ネットワーク設定が正しい場合は、次のステップに進みます。
認証情報を確認する
PHP スクリプトが正しいデータベース接続情報を使用していることを確認します。接続情報は以下の通りであることを確認してください。
- ホスト名: MariaDB コンテナのホスト名。これは通常、
docker-compose.yml
ファイルで定義されているサービス名と同じです。 - データベース名: 使用するデータベースの名前
- ユーザー名: MariaDB にアクセスするために使用するユーザー名
- パスワード: ユーザー名に対応するパスワード
MariaDB サービスを確認する
docker-compose ps
コマンドを実行して、MariaDB コンテナが起動していることを確認します。コンテナが起動していない場合は、docker-compose up -d
コマンドを実行して起動します。
PHP 環境を確認する
PHP 環境が PDO 拡張機能をロードしていることを確認します。PDO 拡張機能がロードされていない場合は、PHP の設定ファイル (php.ini) で拡張機能をロードするように設定する必要があります。
追加のヒント
- PHP スクリプトから MariaDB に接続する際に問題が発生している場合は、
phpinfo()
関数を使用して PHP 環境に関する情報を表示できます。 - Docker コンテナ内のログを確認すると、問題の原因を特定するのに役立つ場合があります。
- MariaDB コンテナにシェルでアクセスして、データベースを手動で操作することもできます。
Docker Compose で PHP からローカル MariaDB に接続するサンプルコード
version: "3.8"
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
db:
image: mariadb:10.5
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydatabase
この docker-compose.yml
ファイルは、2 つのサービスを定義します。
web
サービス: PHP アプリケーションを実行するコンテナdb
サービス: MariaDB データベースを実行するコンテナ
PHP スクリプト
<?php
$dsn = 'mysql:dbname=mydatabase;host=db;port=3306';
$username = 'root';
$password = 'password';
try {
$dbh = new PDO($dsn, $username, $password);
echo "接続成功\n";
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage() . "\n";
}
$sql = 'SELECT * FROM users';
$sth = $dbh->prepare($sql);
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);
この PHP スクリプトは、以下の処理を実行します。
- MariaDB データベースへの接続を確立します。
users
テーブルからすべてのレコードを選択します。- 選択されたレコードをダンプします。
実行方法
以下のコマンドを実行して、コンテナを起動します。
docker-compose up -d
ブラウザで http://localhost
にアクセスすると、PHP スクリプトの出力が表示されます。
説明
$dsn
変数には、MariaDB データベースへの接続情報が格納されています。PDO::FETCH_ASSOC
定数は、結果セットを連想配列として返すように指示します。
このサンプルコードは、基本的なものです。実際のアプリケーションでは、エラー処理、接続プーリング、その他のベストプラクティスを実装する必要があります。
Docker Compose で PHP からローカル MariaDB に接続するその他の方法
環境変数を使用する
MariaDB コンテナの接続情報を環境変数に設定することで、PHP スクリプトから直接アクセスできるようにすることができます。
docker-compose.yml ファイル
version: "3.8"
services:
web:
build: .
ports:
- "80:80"
environment:
DB_HOST: db
DB_NAME: mydatabase
DB_USER: root
DB_PASSWORD: password
db:
image: mariadb:10.5
restart: always
<?php
$dsn = "mysql:dbname=" . getenv('DB_NAME') . ";host=" . getenv('DB_HOST') . ";port=3306";
$username = getenv('DB_USER');
$password = getenv('DB_PASSWORD');
// ... (接続とクエリの実行)
利点:
.env
ファイルに接続情報が格納されるため、コードをよりクリーンに保つことができます。- 複数の環境で異なる接続情報を使用する必要がある場合に便利です。
注意点:
- 環境変数は、コンテナ内でのみ使用できます。
- 環境変数の設定方法については、Docker Compose のドキュメントを参照してください。
サービスのネットワークをブリッジングする
docker-compose.yml
ファイルでサービスのネットワークをブリッジングすることで、PHP コンテナと MariaDB コンテナが直接通信できるようにすることができます。
version: "3.8"
services:
web:
build: .
networks:
- my-network
db:
image: mariadb:10.5
restart: always
networks:
- my-network
networks:
my-network:
<?php
$dsn = "mysql:dbname=mydatabase;host=db;port=3306";
$username = 'root';
$password = 'password';
// ... (接続とクエリの実行)
- 複雑なネットワーク構成を使用する必要がなく、設定が簡単です。
- サービスが互いに検出しやすくなります。
- ブリッジングされたネットワークは、ホストマシン上の他のコンテナからもアクセスできます。
- セキュリティを考慮する場合は、適切なファイアウォールルールを設定する必要があります。
Laravel Sail は、Laravel アプリケーションをローカルで開発するためのシンプルなツールです。Sail は、データベースを含むすべての必要なコンテナを自動的に起動および構成します。
使用方法:
- Laravel プロジェクトで
sail
コマンドを実行して、必要なコンテナを起動します。 .env
ファイルでデータベース接続情報を確認します。- PHP スクリプトで Laravel のデータベースファサードを使用してデータベースに接続します。
- Laravel アプリケーションをローカルで開発するためのシンプルで使いやすい方法です。
- データベースを含むすべての必要なコンテナを自動的に起動および構成します。
- Laravel Sail は、Laravel アプリケーション専用に設計されています。
- その他の PHP フレームワークを使用している場合は、この方法は使用できません。
Docker Compose で PHP からローカル MariaDB に接続するには、さまざまな方法があります。それぞれの方法には、利点と注意点があります。ニーズに合った方法を選択してください。
php mysql docker-compose