【Xserver VPS】Docker Compose V2への移行とPHP&MySQL環境構築
Xserver VPSでWebサイトを自作しようとした際、最初にして最大の壁となるのが「環境構築」です。特に、OS標準の古いDocker Compose(V1)が原因で発生するエラーや、コンテナ間のネットワーク設定は、初心者にとって非常に難解です。本記事では実際に直面したエラーから、最新のDocker Compose V2を導入してPHPとMySQLを連携させるまでのプロセスを、最短の「正解ルート」としてまとめました。
目次
1. 遭遇したエラー:古いDocker Composeの限界
初期設定で docker-compose up を実行した際、 KeyError: 'ContainerConfig' というエラーでビルドが失敗しました。これは古いV1(ハイフンあり)が最新のPHPイメージに対応していないことが原因です。
2. 解決策:Docker公式リポジトリからV2を導入
Xserver VPSの標準リポジトリでは最新版が入らないため、公式のGPG鍵とリポジトリを登録し、最新の docker-compose-plugin をインストールします。
# 公式リポジトリのセットアップ sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # インストール sudo apt-get update sudo apt-get install docker-compose-plugin
3. 正解のディレクトリ構造と設定ファイル
MySQL接続用のドライバをインストールするため、独自の Dockerfile を用意するのがポイントです。
Dockerfile
PHPに pdo_mysql を追加
FROM php:8.2-apache # MySQL接続に必要なPHP拡張機能(PDO MySQL)をインストール RUN docker-php-ext-install pdo pdo_mysql
docker-compose.yml:
build: . を指定し、NPMと同じネットワーク(npm_default)を指定
services:
web:
build: .
container_name: my-web-app
restart: always
networks:
- npm_link
volumes:
- ./html:/var/www/html
db:
image: mysql:8.0
container_name: my-db
restart: always
networks:
- npm_link
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: my_database
MYSQL_USER: user_name
MYSQL_PASSWORD: user_password
volumes:
- ./db_data:/var/lib/mysql
networks:
npm_link:
external: true
name: npm_default # NPMが使用しているネットワーク名に合わせる
4. 実行コマンドの変更
コマンドはハイフンなしの「スペースあり」に変わります。
docker compose up -d --build
5. NPM(Nginx Proxy Manager)との連携
コンテナが立ち上がったら、NPMの管理画面で Forward Hostname をコンテナ名(my-web-app)に設定し、ポートを 80 にします。設定を一度「Save」し直すことが、502エラーを回避するコツです。
6. PHPからMySQLへの接続確認
html/index.php を作成し、PHPからDBコンテナへ内部通信が可能かテストします。
<?php
// 1. まず接続情報を変数に代入する(ここが重要!)
$host = 'db'; // docker-compose.ymlのサービス名
$db = 'my_database'; // 自分で決めたDB名
$user = 'user_name'; // 自分で決めたユーザー名
$pass = 'user_password'; // 自分で決めたパスワード
try {
// 2. 変数を使って接続文字列(DSN)を作る
$dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass);
// 成功時
echo "<h1 style='color: green;'>MySQLへの接続に成功しました!</h1>";
echo "<p>接続先ホスト: " . $host . "</p>";
} catch (PDOException $e) {
// 失敗時
echo "<h1 style='color: red;'>接続失敗</h1>";
echo "<p>エラー内容: " . $e->getMessage() . "</p>";
}
echo "<hr>";
// PHPの構成情報を表示
// phpinfo();
?>
ブラウザで https://satoshi71.com にアクセスし、「MySQLへの接続に成功しました!」というメッセージが表示されれば、インフラ構築はすべて完了です。
スポンサーリンク

