【Docker】DockerでCodeIgniter4の開発環境を作る:前編

あまり情報がないので、忘れないようにメモしておきます。あくまでチュートリアルなので、CodeIgniterのWelcomeページが表示されて、phpMyAdminを見ることができればチュートリアル完了です。CI4からDB […]

あまり情報がないので、忘れないようにメモしておきます。あくまでチュートリアルなので、CodeIgniterのWelcomeページが表示されて、phpMyAdminを見ることができればチュートリアル完了です。CI4からDBに接続する等はやっていません。ネットワークもデフォルトの bridge のままです。とにかくやってみて、動かしてみようという段階です。

ディレクトリ構造

/ci4-tutorial/
├─ docker-compose.yml
├─ src/                 # CodeIgniter4設置場所
└─ docker/
    ├─ Dockerfile       # Dockerfile(本番用)
    ├─ Dockerfile.dev   # Dockerfile (開発用)
    └─ .dockerignore

Dockerfile(今回は使用しない)

# ベースイメージにPHP8.3-Apacheを使用
FROM php:8.3-apache

# マルチステージビルドでComposerをインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# PHPをCloudRunで動作させるために最適化
RUN set -ex; \
  { \
    echo "memory_limit = -1"; \
    echo "max_execution_time = 0"; \
    echo "upload_max_filesize = 32M"; \
    echo "post_max_size = 32M"; \
    echo "opcache.enable = On"; \
    echo "opcache.validate_timestamps = Off"; \
    echo "opcache.memory_consumption = 32"; \
  } > "$PHP_INI_DIR/conf.d/cloud-run.ini"

# PHP拡張モジュールのインストール
RUN docker-php-ext-install pdo pdo_mysql intl

# Apacheのmod_rewriteを有効化
RUN a2enmod rewrite

# ApacheのDocumentRootをCodeIgniter4のpublicディレクトリに変更
RUN sed -i 's|/var/www/html|/var/www/html/public|' /etc/apache2/sites-available/000-default.conf

# アプリケーションコードをコンテナにコピー
COPY ./src /var/www/html/

# Composerで依存関係をインストール
RUN composer install --prefer-dist --no-dev --optimize-autoloader --working-dir=/var/www/html

# writableディレクトリに書き込み権限を付与
RUN chown -R www-data:www-data /var/www/html/writable && chmod -R 775 /var/www/html/writable

# PHPの設定ファイルをコピー
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

# Apacheが使用するポート80を公開
EXPOSE 80

# Apacheの起動
CMD ["apache2-foreground"]

CloudRunにデプロイする時に使うDockerファイルです。今回は使いませんが、とりあえず作りました。CloudRunにデプロイするために最適化する必要があるので、開発マシーン用とCloudRun用でDockerファイルを分ける必要があります。PHP単体での動作確認は済ませていますが、CI4の動作確認はしてませんので、この状態でデプロイして動作するかはわかりません…。今回は使わないので説明は省きます。

Dockerfile.dev

# ベースイメージにPHP8.3-Apacheを使用
FROM php:8.3-apache

# マルチステージビルドでComposerをインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# PHP拡張モジュールのインストール
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libonig-dev \
    libzip-dev \
    unzip \
    && docker-php-ext-install pdo pdo_mysql intl

# Apacheのmod_rewriteを有効化
RUN a2enmod rewrite

# アプリケーションコードをコンテナにコピー
COPY ./src /var/www/html/

# Composerで開発用の依存関係もインストール
RUN composer install --prefer-dist --optimize-autoloader --working-dir=/var/www/html

# writableディレクトリに書き込み権限を付与
RUN chown -R www-data:www-data /var/www/html/writable && chmod -R 775 /var/www/html/writable

# ApacheのDocumentRootをCodeIgniterのpublicディレクトリに変更
RUN sed -i 's|/var/www/html|/var/www/html/public|' /etc/apache2/sites-available/000-default.conf

# PHPの設定ファイルをコピー
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

# Apacheが使用するポート80を公開
EXPOSE 80

# Apacheの起動
CMD ["apache2-foreground"]

開発マシーン用のDockerファイルです。今回使用するのはこちらのDockerファイルです。コメントで軽く説明を書いてますが、忘れてしまいそうなので分かっている範囲で説明していきます。

ベースイメージはPHPの公式Dockerイメージ

FROM php:8.3-apache

PHPの公式Dockerイメージをベースイメージに使用します。PHPバージョンは8.3です。OSはDebian系で、具体的には軽量なバージョンの Debian Slim など、Debianベースのディストリビューションが使われているそうです。

ChatGPTからの回答では、Debianは安定性が高く、PHPやApacheを含む多くのサーバーソフトウェアとの互換性が良いため、PHP公式イメージではDebianが多く採用されているとのことでした。私がDocker初心者でOSの知識もまったくないので、OSはなんでもいいかなと思ってます。

マルチステージビルドでComposerをインストール

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

マルチステージビルドが何のかが、まだ完璧には理解できてないのですが、最終的な成果物だけを取り出してイメージを軽量化するという処理らしいです。ここでやっていることは、Composerの公式Dockerイメージから /usr/bin/composer という実行ファイルだけを取り出して、自身のコンテナ内に複製しています。

つまり、Composerイメージ全体をとってくるのではなく、実行ファイルだけコピーして、それ以外は保持しないということです。なんのこっちゃという感じですが、Composerを使えるようになりつつ、イメージを軽量化できると覚えておきましょう。

PHPの拡張モジュールをインストール

RUN apt-get update && apt-get install -y \
    libicu-dev \
    libonig-dev \
    libzip-dev \
    unzip \
    && docker-php-ext-install pdo pdo_mysql intl

PHP環境を構築するために必要なライブラリをインストールし、PHPの拡張機能を有効にしています。今回はDBにMySQLを使用するので、そのための拡張モジュールと、CI4を使えるようにするための拡張モジュールをインストールしています。

他にも色々インストールしてますが、ここら辺は足りないと警告で足りない拡張機能が何なのか教えてくれるので、足りなかったら追加する感じでいいと思います。でも、このコマンドでインストールしている拡張機能はデフォルトでインストールしとく感じでもいいと思います。

リライトMODを有効化

RUN a2enmod rewrite

Apacheのリライトを有効化します。これはCodeIgniterやLaravelの様なフレームワーク系には付き物ですが、ルーティングをフレームワーク側で行いますので、リライトを有効にする必要があります。それだけです。

作業ディレクトリのソースをコピー

COPY ./src /var/www/html/

CodeIgniterをインストールしている作業ディレクトリの中身をApacheの /var/www/html にコピーします。パスの指定が同階層の指定になっていて「Dockerfileのひとつ上の階層なのでは?」と疑問に思うかもしれませんが、これは docker-compose.yml 側でビルドコンテキストの位置を指定しているためです。詳しくは docker-compose.yml の説明時に説明します。

Composer で依存関係をインストール

RUN composer install --prefer-dist --optimize-autoloader --working-dir=/var/www/html

見慣れたコマンドとは少しことなりますが /var/www/html にある composer.json ファイルに定義されている依存パッケージをComposerでインストールしています。

--prefer-dist は、ソースコードではなくディストリビューション形式(zipなどのアーカイブファイル)を優先してダウンロードする設定です。こうすることでインストールが高速化します。

--optimize-autoloader は、オートローダーを最適化する設定です。オートローダーは、PHPがクラスを自動的に読み込む仕組みです。このオプションは、パフォーマンスを向上させるためにクラスマップを事前に生成し、本番環境でのパフォーマンスを最適化します。

--working-dir=/var/www/html は、作業ディレクトリの指定です。このオプションで、/var/www/html というディレクトリに移動してからコマンドを実行します。このディレクトリ内の composer.json に基づいてライブラリがインストールされます。

書き込み権限の付与

RUN chown -R www-data:www-data /var/www/html/writable && chmod -R 775 /var/www/html/writable

CodeIgniterがキャッシュやログの書き込みを行えるように writable ディレクトリに書き込み権限を付与します。AppEngineでは、書き込み権限付与ができないので、書き込み先のディレクトリを変更していましたが、ClouRunでは書き込み権限を付与できるので、CodeIgniter側で設定をいじくる必要はありません。

ドキュメントルートを変更

RUN sed -i 's|/var/www/html|/var/www/html/public|' /etc/apache2/sites-available/000-default.conf

ドキュメントを /var/www/html/public に変更します。これをやらないと、/public にアクセスしないとWelcomeページが表示されません。

PHP設定ファイルをコピー

RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

開発環境用の php.ini ファイルをコピーして、PHP設定ファイルとして使います。"$PHP_INI_DIR/php.ini-production" とありますが、これはPHPの公式DockerイメージからPHP設定ファイルをコピーしてきています。もし、自身で設定した php.ini ファイルを使いたいのであれば、 COPY ./config/php.ini $PHP_INI_DIR/php.ini みたいな感じで移動元を指定してあげましょう。今回は手軽さ重視で元から用意されているファイルを使用します。

その他

EXPOSE 80
CMD ["apache2-foreground"]

Apacheが使用するポートを指定して、Apacheを起動します。それだけです。

後編へ続く

思ったよりも長くなったので、docker-compose.ymlの説明は後編に続きます。