PHPアプリケーションをDocker化する
PHP + NginxのDockerイメージを構築し、Docker Composeでオーケストレーションします
「PHPアプリケーションをDocker化する」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
PHPでDockerを使う理由
Dockerは、アプリケーションとその依存関係をポータブルなコンテナーイメージにパッケージ化します。同じイメージを開発、CI、本番環境で同じように実行できるため、「自分のマシンでは動く」問題をなくせます。
基本的なPHP Dockerfile
PHP + Nginxアプリケーション用の最小限のDockerfileです。
# Dockerfile
FROM php:8.3-fpm-alpine
# Install extensions
RUN docker-php-ext-install pdo pdo_mysql opcache
# Install Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader
COPY . .
RUN chown -R www-data:www-data /app/storage /app/bootstrap/cacheマルチステージビルド
マルチステージビルドを使用して、最終イメージを小さく保ちます。ビルドツールは1つのステージにインストールし、成果物だけを最終イメージにコピーします。
# Stage 1: builder
FROM composer:2 AS builder
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader
# Stage 2: runtime
FROM php:8.3-fpm-alpine
WORKDIR /app
COPY --from=builder /app/vendor ./vendor
COPY . .docker-compose.yml
Docker Composeを使って、複数のサービス(PHP-FPM、Nginx、MySQL、Redis)をオーケストレーションします。
# docker-compose.yml
services:
app:
build: .
volumes:
- .:/app
nginx:
image: nginx:alpine
ports: ["80:80"]
volumes:
- .:/app
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
mysql:
image: mysql:8
environment:
MYSQL_DATABASE: myapp
MYSQL_ROOT_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:alpine
volumes:
db_data:Nginxコンテナの設定
カスタムNginx設定をマウントして、PHP-FPMリクエストをプロキシします。
# docker/nginx.conf
server {
listen 80;
root /app/public;
index index.php;
location / { try_files $uri /index.php?$query_string; }
location ~ \.php$ {
fastcgi_pass app:9000; # service name from docker-compose
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}環境変数
環境変数をコンテナに渡します。シークレットをイメージに決して埋め込まないでください。
# docker-compose.yml:
services:
app:
env_file: .env
# or explicit:
environment:
- APP_ENV=production
- DB_HOST=mysqlLaravel Artisanコマンド
コンテナ内でArtisanコマンドを実行します。
$ docker compose exec app php artisan migrate
$ docker compose exec app php artisan config:cache
$ docker compose exec app php artisan queue:workヘルスチェック
ヘルスチェックを追加し、オーケストレーター(Kubernetes、ECS)がコンテナの準備完了を把握できるようにします。
# Dockerfile:
HEALTHCHECK --interval=30s --timeout=5s \
CMD curl -f http://localhost/health || exit 1イメージのビルドとプッシュ
イメージをビルドし、レジストリ(Docker Hub、ECR、GHCR)にプッシュします。
$ docker build -t myorg/myapp:1.0.0 .
$ docker push myorg/myapp:1.0.0Kubernetesデプロイメント
Kubernetesでは、使用するイメージを指定してDeploymentリソースとServiceリソースを定義します。kubectl set imageを使うか、YAMLを更新して適用することで、新しいバージョンをロールアウトします。
本番環境のセキュリティ強化
本番環境でのDockerの実践方法は、非rootユーザーの使用、ルートファイルシステムの読み取り専用化、最小限のベースイメージ(Alpine)の使用、開発用依存関係の除外、イメージタグの固定、docker scoutによるCVEのスキャンです。
まとめ
PHP-FPM + Composer用のDockerfileを作成します。ローカル開発では、Nginx、MySQL、Redisサービスを含むdocker-composeを使用します。本番環境では、マルチステージビルドを使用し、環境変数を注入して、KubernetesまたはECSで実行します。
確認問題
マルチステージDockerビルドの主な利点は何ですか?
よくある質問
「PHPアプリケーションをDocker化する」レッスンは無料ですか?
はい。「PHPアプリケーションをDocker化する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「PHPアプリケーションをDocker化する」で何を学びますか?
PHP + NginxのDockerイメージを構築し、Docker Composeでオーケストレーションします ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「PHPアプリケーションをDocker化する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- NginxとPHP-FPMの設定
- 環境変数と.envファイル
- GitHub Actionsでデプロイする
- PHPアプリケーションをDocker化する