技術 約4分で読めます

【Docker】レンタルサーバの開発環境を再現する2025 - さくら、ロリポップ編

背景

うちの案件、AWSとかGoogle Cloudみたいな金持ってそうな案件はあんまなくて、 大体さくらインターネット、たまにロリポップみたいな感じ。

それで、レンタルサーバー案件でPHP開発をしていると、こんな問題に遭遇する:

  • 本番環境でしかテストできない
  • 「ローカルでは動いたのに」問題
  • FTPでアップロード→動作確認の無限ループ

これを解決するため、さくらインターネットとロリポップの環境をDockerで再現した。

動作確認環境

項目バージョン
Docker29.0.1
Docker Compose2.40.3

構成概要

サービス コンテナ名 HTTP HTTPS ベースOS
さくら環境sakurahttp://localhost:8081https://localhost:8443AlmaLinux 9
ロリポ環境lolipophttp://localhost:8082https://localhost:8444Ubuntu 24.04
MySQL 8.0rental-mysqllocalhost:3306--
phpMyAdminrental-phpmyadminhttp://localhost:8080--
Mailpitrental-mailpithttp://localhost:8025--

コード全文はGitHubリポジトリを参照: https://github.com/hide3tu/sakura-lolipop-docker

設計思想

入れるもの

  • Apache 2.4
  • PHP 8.3 + 標準拡張(mbstring, gd, curl, intl, pdo_mysql, zip など)
  • mod_rewrite
  • .htaccess 有効
  • SSL(オレオレ証明書)

入れないもの

  • Composer
  • Node.js / npm
  • その他ビルドツール

理由:Composer/npmに依存したコードを書くと本番で動かない。「ローカルでは動いたのに」問題の原因になる。実環境の制約を前提にコードを書く方が安全。

パス構造の統一

両環境で同じパス構造にしている:

/home/user/www/    ← ドキュメントルート
/home/user/log/    ← ログ出力先
/home/user/tmp/    ← 一時ファイル

これにより、環境の違いを意識せずに開発できる。

重要ポイント解説

php-fpm連携設定

レンタルサーバーのCGI/FastCGI動作を再現するため、mod_phpではなくphp-fpmを使用。

# /etc/httpd/conf.d/php-fpm.conf
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

AlmaLinuxではデフォルトのphp.confがUnixソケットを使う設定になっているので削除する。

msmtp + Mailpit連携

PHPのmail()関数で送信したメールをMailpitでキャッチする。実際には外部に送信されないので開発中の誤送信を防げる。

# /etc/msmtprc
account default
host mailpit
port 1025
from noreply@localhost
auth off
tls off

PHP側はsendmail_pathをmsmtpに向ける:

sendmail_path = /usr/bin/msmtp -t

ディレクトリごとのphp.ini

さくらインターネットと同様、各ディレクトリにphp.iniを置くことで設定を上書きできる。

# /etc/php.ini に追加
user_ini.filename = php.ini
user_ini.cache_ttl = 300

使用例:

projects/sakura/www/
├── index.php
├── php.ini              ← ルート全体に適用
└── admin/
    ├── index.php
    └── php.ini          ← admin/ 以下に適用

オレオレSSL証明書

HTTPSが必要な理由:

  • Mixed Content問題(httpsページからhttpのAPIを叩くとブロックされる)
  • Secure属性付きCookieはHTTPSじゃないと動かない
  • navigator.geolocationなどもHTTPS必須

10年有効の自己署名証明書を生成:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -keyout /etc/httpd/ssl/server.key \
    -out /etc/httpd/ssl/server.crt \
    -subj "/C=JP/ST=Tokyo/L=Tokyo/O=LocalDev/CN=localhost" \
    -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"

使い方

セットアップ

# クローン
git clone https://github.com/hide3tu/sakura-lolipop-docker.git
cd sakura-lolipop-docker

# プロジェクトディレクトリ作成
mkdir -p projects/sakura/{www,log}
mkdir -p projects/lolipop/{www,log}

# ビルド&起動
docker-compose up -d --build

動作確認

# テストファイル作成
echo '<?php phpinfo();' > projects/sakura/www/index.php
echo '<?php phpinfo();' > projects/lolipop/www/index.php

ブラウザで確認:

データベース接続

PHPから接続する場合:

<?php
$pdo = new PDO(
    'mysql:host=mysql;port=3306;dbname=development;charset=utf8mb4',
    'devuser',
    'devpass'
);

外部ツール(TablePlusなど)から接続する場合:

項目
Hostlocalhost
Port3306
Userdevuser
Passworddevpass

メール送信テスト

<?php
mail('test@example.com', 'テスト件名', 'テスト本文');

送信されたメールは http://localhost:8025 で確認できる。

注意点

  • さくらの本番はFreeBSDだが、DockerはLinuxベースのためAlmaLinuxで代替している
  • Apache/PHPの動作は互換性があるが、OS固有の挙動は異なる場合がある
  • 本番デプロイ前に実環境でのテストを推奨

まとめ

修正項目対応内容
php-jsonPHP 8.x では不要(標準組み込み)なので削除
msmtp-mtaAlmaLinuxには存在しないパッケージなので削除
ssl.conf / php.confデフォルト設定と競合するので削除
Listen 443ssl.conf削除で消えるので追加
/run/php-fpmディレクトリがないとphp-fpmが起動しないので作成

ビルド中にエラーが出たら、上記の修正ポイントを確認してみてほしい。


余談だけど、最近Xあたりで「Docker Desktopいらんやろ」という声をちらほら見かける。確かにこの記事でもdocker-composeしか使っていないし、GUIで何かを管理しているわけでもない。

でも個人的には、イメージとコンテナが何なのか視覚的にわかるのが好きだったりする。あまり開発者っぽくない発言かもしれないが、ターミナルだけで全部やるより、GUIでパッと確認できる方が安心感がある。