どうも、若松です。
前回はDockerでLaravelを起動するまでをまとめました。
https://qiita.com/t_wkm2/items/9b2011af9569627fee40
しかしながら、現在のコンテナイメージはお世辞にも軽量とは言えません。
コンテナイメージサイズはコンテナ起動時間に直結するため、できるだけ軽量化していきたいと思います。
Dockerfile
FROM amazonlinux:2 as vender
# PHPインストール
RUN amazon-linux-extras install -y php7.3
RUN yum install -y php-pecl-zip php-mbstring php-dom
# Composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
# 環境変数設定
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME "/opt/composer"
ENV PATH "$PATH:/opt/composer/vendor/bin"
# Laravelインストール
RUN composer global require "laravel/installer"
# Laravelプロジェクト作成
WORKDIR /var/www
RUN composer create-project laravel/laravel laravel
FROM php:7.3-alpine
# ビルド用コンテナから必要なコンテンツをコピー
COPY --from=vender /var/www/ /var/www/
# ポートを公開
EXPOSE 8000
# Laravelサーバーを実行
WORKDIR /var/www/laravel
CMD ["php","artisan","serve","--host","0.0.0.0"]
軽量化に際して覚えておくこと
マルチステージビルド
マルチステージビルドは、一般的にビルドに必要なコンテンツの生成フェーズと実行に必要なコンテンツに絞ってコンテナを固めるフェーズに分けてコンテナをビルドすることを指します。
ビルド時に必要だが実行時にには必要ない(一般的にDeveloperKitのような)ものを実行するコンテナから除外できるため、コンテナイメージの軽量化が期待できます。
squashオプション
Dockerfileでビルドする際、Step毎にコンテナのレイヤーが生成され、最終的なコンテナはそのレイヤーを含むためにサイズが肥大化しがちです。
ビルド時にsquashオプションを用いると、最終的にレイヤー1つに集約してくれるため、コンテナイメージの軽量化が期待できます。
Alpine Linux
詳細は割愛しますが、軽量OSとしてコンテナ界隈では有名です。
https://ja.wikipedia.org/wiki/Alpine_Linux
Alpine Linuxをベースとすることで、その他のイメージをベースとするよりも、コンテナイメージの軽量化が期待できます。
Dockerfile詳細
ビルド用イメージ
FROM amazonlinux:2 as vender
前回同様、AmazonLinux2をベースとしていますが、後段でしようするためにエイリアスとして as vender
を付けています。
省略
# PHPインストール
# Composerインストール
# 環境変数設定
# Laravelインストール
# Laravelプロジェクト作成
# ポートを公開
# Laravelサーバーを実行
上記は前回と同じなため、解説を省略します。
実行用イメージ
FROM php:7.3-alpine
PHP公式から提供されているAlpineLinuxのイメージを使用します。
これによってAlpineLinux且つPHP7.3の環境を構築できます。
ビルド用コンテナから必要なコンテンツをコピー
COPY --from=vender /opt/composer/vendor/ /opt/vender/
COPY --from=vender /var/www/ /var/www/
前段のビルド用コンテナから必要なコンテンツをコピーします。
ここで前段で用いた、 as vender
効力を発揮します。
コンテナビルド
docker build -t laravel . --squash
ビルド時に --squash
オプションを付加します。
これによってレイヤーを1つに集約し、計量化を図ります。
軽量化前と軽量化後の比較
軽量化前
docker images laravel
REPOSITORY TAG IMAGE ID CREATED SIZE
laravel latest xxxxxxxxxxxx xx seconds ago 748MB
軽量化後
docker images laravel
REPOSITORY TAG IMAGE ID CREATED SIZE
laravel latest xxxxxxxxxxxx xx seconds ago 117MB
まとめ
少しの工夫でコンテナが軽量化できることがわかっていただけたと思います。
最初にも述べたように、コンテナイメージサイズはコンテナ起動時間に直結するため、積極的に軽量化を図っていきたいですね。