非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【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への接続に成功しました!」というメッセージが表示されれば、インフラ構築はすべて完了です。

 

 

スポンサーリンク

 - Xserver VPS