【Docker】レンタルサーバの開発環境を再現する2025 - さくら、ロリポップ編
背景
うちの案件、AWSとかGoogle Cloudみたいな金持ってそうな案件はあんまなくて、 大体さくらインターネット、たまにロリポップみたいな感じ。
それで、レンタルサーバー案件でPHP開発をしていると、こんな問題に遭遇する:
- 本番環境でしかテストできない
- 「ローカルでは動いたのに」問題
- FTPでアップロード→動作確認の無限ループ
これを解決するため、さくらインターネットとロリポップの環境をDockerで再現した。
動作確認環境
| 項目 | バージョン |
|---|---|
| Docker | 29.0.1 |
| Docker Compose | 2.40.3 |
構成概要
| サービス | コンテナ名 | HTTP | HTTPS | ベースOS |
|---|---|---|---|---|
| さくら環境 | sakura | http://localhost:8081 | https://localhost:8443 | AlmaLinux 9 |
| ロリポ環境 | lolipop | http://localhost:8082 | https://localhost:8444 | Ubuntu 24.04 |
| MySQL 8.0 | rental-mysql | localhost:3306 | - | - |
| phpMyAdmin | rental-phpmyadmin | http://localhost:8080 | - | - |
| Mailpit | rental-mailpit | http://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
ブラウザで確認:
- さくら: http://localhost:8081
- ロリポ: http://localhost:8082
データベース接続
PHPから接続する場合:
<?php
$pdo = new PDO(
'mysql:host=mysql;port=3306;dbname=development;charset=utf8mb4',
'devuser',
'devpass'
);
外部ツール(TablePlusなど)から接続する場合:
| 項目 | 値 |
|---|---|
| Host | localhost |
| Port | 3306 |
| User | devuser |
| Password | devpass |
メール送信テスト
<?php
mail('test@example.com', 'テスト件名', 'テスト本文');
送信されたメールは http://localhost:8025 で確認できる。
注意点
- さくらの本番はFreeBSDだが、DockerはLinuxベースのためAlmaLinuxで代替している
- Apache/PHPの動作は互換性があるが、OS固有の挙動は異なる場合がある
- 本番デプロイ前に実環境でのテストを推奨
まとめ
| 修正項目 | 対応内容 |
|---|---|
| php-json | PHP 8.x では不要(標準組み込み)なので削除 |
| msmtp-mta | AlmaLinuxには存在しないパッケージなので削除 |
| ssl.conf / php.conf | デフォルト設定と競合するので削除 |
| Listen 443 | ssl.conf削除で消えるので追加 |
| /run/php-fpm | ディレクトリがないとphp-fpmが起動しないので作成 |
ビルド中にエラーが出たら、上記の修正ポイントを確認してみてほしい。
余談だけど、最近Xあたりで「Docker Desktopいらんやろ」という声をちらほら見かける。確かにこの記事でもdocker-composeしか使っていないし、GUIで何かを管理しているわけでもない。
でも個人的には、イメージとコンテナが何なのか視覚的にわかるのが好きだったりする。あまり開発者っぽくない発言かもしれないが、ターミナルだけで全部やるより、GUIでパッと確認できる方が安心感がある。