Docker
同梱の Dockerfile と compose.yaml は、1 つのコンテナで 1 つのサイトを実行します。コンテナは、ホスト名にかかわらずすべてのリクエストを FLEXAGON_PUBLIC ディレクトリ(デフォルトは public)に送ります。どのドメインをどのコンテナに振り分けるかは、ロードバランサー、Ingress、または Cloud Run のドメインマッピングで決めます。
| ターゲット | 用途 | 内容 |
|---|---|---|
dev |
ローカル開発(compose.yaml) |
プロジェクトを /app にマウント、php.ini-development、composer、Xdebug(インストール済み、未ロード) |
alpha、beta、production |
ステージごとのデプロイ用イメージ | プロジェクトをコピーし、application/ を application/_Config/<stage>/ のファイルで上書き、composer install --no-dev、php.ini-production、opcache のタイムスタンプチェック無効、www-data で実行、ビルド中に flexagon check を実行 |
PHP 8.3 + Apache のイメージで、コンテナは PORT(デフォルトは 8080)で待ち受けます。インストールする拡張モジュールは Dockerfile 冒頭の PHP_EXTENSIONS で指定します。使わないものは削除し、足りないものは追加してください(DEPLOY.md を参照)。
イメージに含まれるデフォルトの PHP 拡張モジュール:pdo_mysql、pdo_pgsql、opcache、bcmath、exif、gd、gettext、intl、zip
開発
docker compose up -d # web(:8080)
docker compose exec web composer install # vendor/ がない場合
docker compose --profile xdebug up -d # + Xdebug を有効にした web-xdebug(:8081)
MySQL 8.4 と PostgreSQL 17 のコンテナはコメントアウトされた状態で含まれているため、デフォルトでは起動せず、アプリケーションは .env.php の設定どおりに接続します。どちらかを使う場合は、compose.yaml のうち MySQL または PostgreSQL と記された部分(environment 配下の DB_* / PGSQL_DB_*、depends_on、サービス本体、volumes)のコメントを解除してください。
コメントを解除すると、DB_* と PGSQL_DB_* の値が .env.php より優先されるため、コンテナ内のアプリケーションは .env.php の内容にかかわらず、これらのデータベースコンテナに接続します。すべてのポートは 127.0.0.1 でのみ待ち受け、FLEXAGON_HTTP_PORT、FLEXAGON_XDEBUG_PORT、FLEXAGON_MYSQL_PORT、FLEXAGON_PGSQL_PORT で変更できます。
複数のサイト — public/ と同じ階層にある public_* ディレクトリは、それぞれ別のサイトになります。application/ は共有されますが、サイトごとに __flexagon.php、.htaccess、_entry.php、_prepare.php、_router.php が必要です(public/ からコピーしてください)。サイトごとに 1 つのコンテナを、たとえば FLEXAGON_PUBLIC: public_admin のように指定して実行します(compose.yaml の admin の例を参照)。ローカルではサイトごとにポートが異なりますが、Cookie はポートで区別されないため、それぞれ別のホスト名でも開くようにしてください。例:http://admin.localhost:8082
デプロイ — 手順の詳細は DEPLOY.md にあります。
docker build --target production -t myapp .
docker run -p 8080:8080 -e DB_HOST=... -e DB_PASSWORD=... myapp # public/
docker run -p 8080:8080 -e FLEXAGON_PUBLIC=public_admin -e DB_HOST=... myapp # public_admin/
- シークレットは、プラットフォームのシークレットストアを通じて環境変数として渡してください。
.dockerignoreによって.env.phpと.envはビルドから除外されるため、イメージに含まれることはありません。 - イメージは 1 つだけビルドし、
FLEXAGON_PUBLICだけを変えてサイトごとに 1 つのサービスとして実行します。これにより、サイトごとにデータベースアカウント、スケーリング、ネットワークへの公開範囲(たとえば管理サイトは内部ネットワークのみ)を分けられます。 - 各ステージ(
alpha、beta、production)は--targetでそれぞれ別のイメージとしてビルドされるため、myapp:1.0.0-betaのようにタグで区別してください。 - ビルドではホストの
vendor/を使わず、コンテナ内でcomposer.lockからインストールします。プロジェクト内のパスリポジトリ(./packages/...)もインストールされます。 - セッションは暗号化された Cookie なので、インスタンスを増やしても共有ストアは必要ありません。すべてのインスタンスに同じ
SESSION_ENCRYPTION_STRINGを設定してください。 - コンテナのファイルシステムは再起動すると消えます。本番環境では SQLite やローカルへのアップロードを使わず、マネージドデータベースとオブジェクトストレージを使用してください。
- ルートファイルシステムを読み取り専用にする場合は、
/var/run/apache2と/tmpに tmpfs をマウントしてください。 - Apache のプロセス数(
MaxRequestWorkers)は、起動時にコンテナのメモリ上限から(上限 − 64MB)÷ 48MB として算出され、最小 2、最大 256 になります(512MB → 9、1GB → 20、2GB → 41)。リクエストがより多くのメモリを使う場合はAPACHE_WORKER_MEMORY_MBを引き上げるか、APACHE_MAX_REQUEST_WORKERSで数を直接指定してください。上限を超えたリクエストは失敗せず、待機します。Cloud Run のようにインスタンスごとの同時実行数を設定するプラットフォームでは、その値をプロセス数に合わせてください。各プロセスは 1000 接続ごとに入れ替えられます(APACHE_MAX_CONNECTIONS_PER_CHILD)。