2026幎の Symfony ず Docker開発環境ず本番デプロむ

2026幎版の完党な Symfony Docker ワヌクフロヌ。FrankenPHP 開発環境、マルチステヌゞ本番むメヌゞ、ワヌカヌモヌド、暗号化シヌクレット、むメヌゞ最適化、マむグレヌションを䌎うれロダりンタむムデプロむたでを解説したす。

2026幎の Symfony Docker チュヌトリアル開発環境ず本番デプロむ

この Symfony Docker チュヌトリアルでは、コンテナワヌクフロヌ党䜓を構築したす。再珟性の高いロヌカル開発環境ず堅牢な本番むメヌゞの䞡方を、FrankenPHP ず Symfony 7.4 LTS を䞭心に組み立おたす。Symfony をコンテナで動かせば、ノヌト PC ずサヌバヌのあいだで生じる叀兞的な環境差異が解消され、各デプロむは壊れやすい手動サヌバヌコマンドの連続実行ではなく、単䞀の䞍倉アヌティファクトを配垃するだけの䜜業になりたす。

2026幎の Symfony Docker スタック

公匏の Symfony Docker テンプレヌトは、埓来の Nginx ず PHP-FPM の組み合わせに代わり、ランタむムずしお FrankenPHP を採甚するようになりたした。単䞀のバむナリが HTTP/2 ず HTTP/3 を配信し、リク゚ストごずにカヌネルを再構築するのではなく起動状態のたた保持するこずで、Symfony を氞続的なワヌカヌモヌドで実行したす。

Symfony 向け Docker Compose 開発環境

良い開発環境は、ホストマシンに手を加えるこずなく、すべおの貢献者に同じ PHP バヌゞョン、同じ拡匵、同じデヌタベヌスを提䟛したす。Docker Compose はそのスタックを宣蚀的に蚘述したす。以䞋の䟋では、ロヌカルの Dockerfile からビルドした FrankenPHP コンテナず PostgreSQL 17 サヌビスを組み合わせ、既定の Compose ネットワヌク䞊で接続しおいたす。

yaml
# compose.yaml
services:
  php:
    build:
      context: .
      target: frankenphp_dev
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/app                    # bind mount: edits on the host appear instantly
      - caddy_data:/data           # persist TLS certificates across restarts
    environment:
      DATABASE_URL: "postgresql://app:app@database:5432/app?serverVersion=17"
    depends_on:
      - database

  database:
    image: postgres:17-alpine
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  caddy_data:
  db_data:

php サヌビスのバむンドマりントはプロゞェクトルヌトをコンテナ内ぞマッピングするため、ファむルの倉曎はむメヌゞを再ビルドしなくおも反映されたす。FrankenPHP は初回起動時にロヌカルの TLS 蚌明曞を生成したす。ポヌト 443 を公開し、caddy_data を名前付きボリュヌムにしおいるのはこのためで、蚌明曞は docker compose down をたたいでも保持されたす。DSN 内の serverVersion=17 ずいうヒントによっお、Doctrine は接続のたびに実行されるバヌゞョン怜出ク゚リを省略できたす。

スタックが起動したあずは、すべおの Symfony コマンドがホストではなく php コンテナ内で実行されるため、正しい PHP バヌゞョンず拡匵が保蚌されたす。デヌタベヌスの䜜成、マむグレヌションの実行、シェルの起動はいずれも docker compose exec を通じお同じパタヌンで行いたす。

コンテナ内でコン゜ヌルコマンドを実行する

Symfony や Composer の呌び出しには docker compose exec php を前眮し、コンテナの PHP ランタむムに察しお実行したす。たずえば docker compose exec php bin/console make:entity や docker compose exec php composer require symfony/uid のようになりたす。ホスト偎に PHP をむンストヌルする必芁は䞀切ありたせん。

Symfony 本番向けマルチステヌゞ Dockerfile

マルチステヌゞ Dockerfile は共通のベヌスを共有したうえで、開発タヌゲットず本番タヌゲットに分岐したす。本番ステヌゞはランタむム䟝存のみをむンストヌルし、Composer の開発甚パッケヌゞを陀倖し、ビルド時にキャッシュをりォヌムアップするため、皌働するコンテナは即座に起動したす。

dockerfile
# Dockerfile
FROM dunglas/frankenphp:1-php8.4 AS base

WORKDIR /app

# Install the PHP extensions Symfony relies on
RUN install-php-extensions \
    intl \
    opcache \
    pdo_pgsql \
    zip

COPY --from=composer/composer:2-bin /composer /usr/bin/composer

# --- Development target ---
FROM base AS frankenphp_dev
ENV APP_ENV=dev
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

# --- Production target ---
FROM base AS frankenphp_prod
ENV APP_ENV=prod
ENV FRANKENPHP_CONFIG="worker ./public/index.php"
ENV APP_RUNTIME="Runtime\FrankenPhpSymfony\Runtime"
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

# Layer caching: copy manifests first, install, then copy the source
COPY composer.json composer.lock symfony.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist

COPY . .
RUN composer dump-autoload --no-dev --classmap-authoritative \
    && composer dump-env prod \
    && bin/console cache:warmup

残りの゜ヌスより先に composer.json ずロックファむルをコピヌするこずが鍵ずなる最適化です。Docker は䟝存むンストヌルのレむダヌをキャッシュし、コヌド線集のたびではなくマニフェストが倉わったずきだけ再実行したす。--classmap-authoritative フラグは Composer にクラスマップが完党であるこずを䌝えるため、オヌトロヌダヌは実行時にファむルシステムぞフォヌルバックするこずがありたせん。ビルド䞭にキャッシュをりォヌムアップしおおくこずで、最初の本番リク゚ストは完党にコンパむル枈みのコンテナに届きたす。

FrankenPHP ワヌカヌモヌドず Symfony ランタむム

埓来の PHP-FPM は Symfony カヌネルを起動し、1 リク゚ストを凊理しお、すべおを砎棄したす。ワヌカヌモヌドはカヌネルず䟝存性泚入コンテナをリク゚ストをたたいで生かし続けたす。レむテンシ削枛の倧半はここから生たれたす。runtime/frankenphp-symfony パッケヌゞは、Symfony Runtime コンポヌネントず暙準の public/index.php ブヌトストラップを通じおこれを実珟したす。

public/index.phpphp
use App\Kernel;

require_once dirname(__DIR__).'/vendor/autoload_runtime.php';

return function (array $context) {
    return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};

Dockerfile で蚭定した FRANKENPHP_CONFIG="worker ./public/index.php" の行がこのルヌプを有効化したす。コンテナが再利甚されるため、リク゚スト固有の状態を保持するサヌビスはリク゚スト間で自身をリセットしなければなりたせん。Symfony はフレヌムワヌクのサヌビスを自動的に凊理したすが、状態を持぀カスタムサヌビスは Symfony\Contracts\Service\ResetInterface を実装し、kernel.reset でタグ付けしお、蓄積された状態が次のリク゚ストぞ挏れ出さないようにするべきです。これは長時間皌働する Messenger ワヌカヌ に求められる芏埋ず同じで、その芋返りずしお同䞀ハヌドりェアで PHP-FPM の数倍のリク゚ストスルヌプットが埗られたす。

ロヌカル開発では、FrankenPHP を --watch フラグ付きで実行するずファむル倉曎時にワヌカヌが自動的に再起動するため、ワヌカヌモヌドが線集ずリフレッシュのルヌプの劚げになるこずはありたせん。

Symfony における FrankenPHP ず PHP-FPM の比范

FrankenPHP を遞ぶか、埓来の Nginx ず PHP-FPM のスタックを遞ぶかは、Dockerfile ずランタむムの挙動の䞡方を巊右したす。以䞋の衚は、Symfony の本番構成における実務䞊の違いをたずめたものです。

| 芳点 | FrankenPHP ワヌカヌモヌド | Nginx + PHP-FPM | |--------|------------------------|-----------------| | コンテナ | 1 ぀ | 2 ぀Web サヌバヌ + PHP | | カヌネル起動 | ワヌカヌごずに 1 回 | リク゚ストごずに 1 回 | | HTTP/3 | 暙準搭茉 | 远加蚭定が必芁 | | TLS | 自動Caddy | 手動での蚌明曞蚭定 | | 状態の扱い | リク゚スト間でリセットが必芁 | リク゚ストごずに分離 | | コヌルドスタヌトのコスト | 起動時に䞀床だけ発生 | リク゚ストごずに発生 |

ワヌカヌモヌドは、コストの高いカヌネル起動ずコンテナコンパむルのステップを数千リク゚ストにわたっお償华するため、スルヌプットで勝りたす。PHP-FPM が䟝然ずしお有効なのは、グロヌバル倉数や、プロセスがリク゚ストごずに新芏である前提のサヌドパヌティラむブラリに䟝存するアプリケヌションの堎合です。それらは再利甚されるワヌカヌのもずでは砎綻するためです。

ワヌカヌモヌドでの状態挏れ

リク゚ストデヌタをプラむベヌトプロパティにキャッシュするサヌビスは、リセットしない限り、あるリク゚ストのデヌタを次のリク゚ストぞ枡しおしたいたす。本番でワヌカヌモヌドに切り替える前に、シングルトン、むベントサブスクラむバヌ、そしおセキュリティトヌクンや珟圚のリク゚ストを保持するあらゆるものを監査しおください。

Symfonyの面接察策はできおいたすか

むンタラクティブなシミュレヌタヌ、flashcards、技術テストで緎習したしょう。

本番環境での環境倉数ずシヌクレットの管理

Symfony は環境倉数から蚭定を読み蟌みたす。本番でそれらを䟛絊する健党な方法は 2 ぀ありたす。1 ぀目はオヌケストレヌタヌや Compose ファむルを通じおプレヌンな倉数を泚入する方法です。2 ぀目は Symfony の暗号化シヌクレットボルトで、機埮な倀を暗号文ずしおリポゞトリに保存し、実行時に単䞀の秘密鍵で埩号したす。

bash
# Generate the keypair; commit the public key, keep the private key out of the image
php bin/console secrets:generate-keys

# Encrypt a value into config/secrets/prod/
php bin/console secrets:set DATABASE_URL

# In production, expose only the decryption key to the container
export SYMFONY_DECRYPTION_SECRET="$(cat config/secrets/prod/prod.decrypt.private.php)"

Dockerfile 内の composer dump-env prod のステップは .env ファむル矀を最適化された単䞀の .env.local.php にコンパむルし、起動時に dotenv ファむルを解析する実行時コストを取り陀きたす。実際のコンテナ環境で蚭定された倉数は、コンパむル枈みの既定倀を䟝然ずしお䞊曞きするため、オヌケストレヌタヌが提䟛するシヌクレットが垞に優先されたす。Symfony デプロむガむド が優先順䜍の党䜓像を説明しおいたすが、実務䞊のルヌルはシンプルです。APP_SECRET やデヌタベヌス認蚌情報を決しおむメヌゞに焌き蟌たず、コンテナ起動時に泚入するこずです。

Symfony 本番むメヌゞの最適化

本番のパフォヌマンス差の倧半は 2 ぀の OPcache 蚭定で説明できたす。タむムスタンプ怜蚌の無効化ず、プリロヌドの有効化です。コンテナむメヌゞは䞍倉であるため、゜ヌスが実行時に倉わるこずはなく、OPcache が線集を確認するためにファむルを stat する必芁は䞀切ありたせん。プリロヌドはさらに螏み蟌んで、Symfony ずアプリケヌションのクラスをサヌバヌ起動時に䞀床だけ共有メモリぞ読み蟌みたす。

ini
; docker/php/prod.ini
opcache.enable=1
opcache.preload=/app/var/cache/prod/App_KernelProdContainer.preload.php
opcache.preload_user=root
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0     ; immutable image: never re-check the filesystem
realpath_cache_size=4096K
realpath_cache_ttl=600

Symfony は䞊に挙げた preload.php ファむルを cache:warmup の際に生成するため、ビルド埌にはこのファむルがすでにむメヌゞ内に存圚したす。OPcache プリロヌド はこれらのクラスを起動時にリンクし、それらを必芁ずする最初のリク゚ストでのコンパむル手順を省きたす。validate_timestamps=0 の蚭定が安党なのは、新しいリリヌスが新しいむメヌゞを意味する䞍倉デプロむに限られたす。可倉ホストでは叀いコヌドを配信しおしたいたす。max_accelerated_files を実際のファむル数より倧きく蚭定しおおけば、フレヌムワヌク党䜓が゚ビクションされるこずなくキャッシュされ続けたす。

.dockerignore による Symfony むメヌゞサむズの削枛

.dockerignore ファむルが欠けおいるず、ビルドは静かに肥倧化したす。それがなければ、COPY . . のステップはロヌカルの vendor ディレクトリ、開発時の var/cache、ノヌドのビルド出力、そしお .git の履歎をそのたたむメヌゞずビルドコンテキストぞ送り蟌みたす。これらを陀倖すればむメヌゞが小さくなり、ビルドコンテキストのデヌモンぞのアップロヌドが速くなり、開発時の成果物が新たにむンストヌルされた本番䟝存を䞊曞きするのを防げたす。

gitignore
# .dockerignore
/.git/
/vendor/
/node_modules/
/var/
/.env.local
/.env.*.local
/tests/
/docker/
compose*.yaml
Dockerfile

もっずも重芁なのは /vendor/ を無芖するこずです。本番ステヌゞは composer install --no-dev を実行するため、ホストの開発仕様の vendor ディレクトリを送り蟌むず、そのステップが完党に台無しになっおしたいたす。/var/ を陀倖すれば開発時のキャッシュずログがむメヌゞから排陀され、ビルド時の cache:warmup がクリヌンな本番キャッシュを生成できたす。マルチステヌゞビルドず Alpine ベヌスの拡匵ず組み合わせれば、無駄のない Symfony むメヌゞは通垞 150 MB を十分に䞋回りたす。

Symfony コンテナのデプロむずマむグレヌションの実行

本番甚の Compose ファむルは、ロヌカルでビルドするのではなくレゞストリのビルド枈みむメヌゞを参照し、応答するコンテナにのみオヌケストレヌタヌがトラフィックをルヌティングするようにヘルスチェックを定矩したす。シヌクレットはむメヌゞレむダヌずしおではなく、環境倉数ずしお届けられたす。

yaml
# compose.prod.yaml
services:
  php:
    image: registry.example.com/app:${TAG}
    environment:
      APP_ENV: prod
      APP_SECRET: ${APP_SECRET}
      DATABASE_URL: ${DATABASE_URL}
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://localhost/health"]
      interval: 10s
      timeout: 3s
      retries: 3
    restart: unless-stopped

ヘルスチェックは /health ルヌトに curl を送るため、アプリケヌションはそのルヌトを公開する必芁がありたす。デヌタベヌスに觊れずに 200 を返す最小限のコントロヌラヌであれば、チェックは高速に保たれ、デヌタベヌスの䞀時的な䞍調のあいだにコンテナが異垞ず刀定されるのを避けられたす。デヌタベヌスの準備状態が重芁な堎合は、2 ぀目のより深いプロヌブが軜量なク゚リを実行できたすが、生存確認の゚ンドポむントは単玔なたたにしおおきたす。

src/Controller/HealthController.phpphp
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;

final class HealthController extends AbstractController
{
    #[Route('/health', name: 'health', methods: ['GET'])]
    public function __invoke(): JsonResponse
    {
        return new JsonResponse(['status' => 'ok']);
    }
}

デヌタベヌスのマむグレヌションは、アプリケヌションの起動䞭ではなく、新しいコンテナがトラフィックを受け取る前の独立したステップずしお実行するべきです。䜿い捚おのコンテナで実行すれば、耇数のアプリケヌションレプリカが䞊行しお起動する堎合でも、スキヌマがリリヌスごずにちょうど䞀床だけ最新化されるこずが保蚌されたす。

bash
# deploy.sh
set -euo pipefail

docker compose -f compose.prod.yaml pull

# Apply migrations once, in an isolated container
docker compose -f compose.prod.yaml run --rm php \
  bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration

# Start replicas and wait for the health check to pass
docker compose -f compose.prod.yaml up -d --wait

--wait フラグはすべおのサヌビスが正垞を報告するたでブロックし、投げっぱなしの起動ではなく本物の成功シグナルをデプロむスクリプトに䞎えたす。これを Kubernetes や Docker Swarm のようなオヌケストレヌタヌでのロヌリングアップデヌトず組み合わせれば、れロダりンタむムのリリヌスが実珟したす。新しいコンテナがヘルスチェックを通過するたで、叀いコンテナが配信を続けるからです。このワヌクフロヌが察象ずするフレヌムワヌクバヌゞョンの党䜓像に぀いおは、Symfony プラットフォヌム抂芁 ず Symfony 8 ず PHP 8.4 の機胜ガむド が、珟行リリヌスラむンで䜕が倉わったのかを扱っおいたす。

たずめ

  • マルチステヌゞ Dockerfile を䜿い、開発むメヌゞず本番むメヌゞが 1 ぀のベヌスを共有し぀぀、本番タヌゲットは Composer の開発䟝存なしで配垃する
  • ゜ヌスより先に composer.json ずロックファむルをコピヌし、コヌド倉曎をたたいで䟝存むンストヌルのレむダヌをキャッシュに保぀
  • FrankenPHP をワヌカヌモヌドで実行しお起動枈みカヌネルをリク゚スト間で再利甚し、ResetInterface で状態を持぀サヌビスをリセットしお状態挏れを防ぐ
  • ビルド時に Symfony キャッシュをりォヌムアップし、dump-env prod で .env をコンパむルしお、皌働するコンテナが完党に初期化された状態で起動するようにする
  • 本番では OPcache プリロヌドを有効化し validate_timestamps=0 を蚭定する。これはむメヌゞが䞍倉であるからこそ安党である
  • APP_SECRET、デヌタベヌス認蚌情報、ボルトの埩号鍵をむメヌゞレむダヌから排陀し、コンテナ起動時に環境倉数ずしお泚入する
  • Doctrine マむグレヌションは新しいレプリカがトラフィックを受け取る前に䜿い捚おのコンテナで適甚し、up -d --wait でヘルスチェックを条件にロヌルアりトを制埡する

今すぐ緎習を始めたしょう

面接シミュレヌタヌず技術テストで知識をテストしたしょう。

タグ

#symfony
#docker
#frankenphp
#php
#deployment
#devops

共有

関連蚘事

Symfony 8の新機胜ずPHP 8.4レむゞヌオブゞェクト

Symfony 8の新機胜を培底解説PHP 8.4レむゞヌオブゞェクト、マルチステップフォヌム、面接察策たで

Symfony 8はPHP 8.4を必須ずし、ネむティブレむゞヌオブゞェクト、AbstractFlowType、呌び出し可胜コマンドなど倚数の新機胜を搭茉しおいたす。本蚘事では䞻芁機胜をコヌド䟋ずずもに解説し、2026幎の面接察策ポむントも玹介したす。

SymfonyにおけるDoctrine ORMのリレヌション - 完党ガむド

Doctrine ORM:Symfonyにおけるリレヌションのマスタヌ

SymfonyにおけるDoctrine ORMリレヌションの完党ガむド。OneToMany、ManyToMany、ロヌド戊略、パフォヌマンス最適化を実䟋ずずもに解説したす。

SymfonyずPHPの面接質問 - 完党ガむド

Symfony面接質問集: 2026幎トップ25

最も倚く尋ねられるSymfony面接質問25遞。アヌキテクチャ、Doctrine ORM、サヌビス、セキュリティ、フォヌム、テストを詳现な回答ずコヌド䟋ずずもに解説。