Docker

【Rails】DockerイメージをAlpine Linuxに変更したことでイメージサイズが5分の1になった話

Docker

 

今回はDockerのベースイメージをAlpine Linuxに変更したことで、イメージサイズが大幅に軽量化されたので、その概要と手順についてまとめました。イメージサイズが軽量化されることで様々なメリットが得られるため、アプリケーションの特性や要件に合わせて適切なイメージを使用することをおすすめします。

Alpine Linuxイメージとは

Alpine Linuxイメージは、Dockerコンテナ内で動作するための軽量でコンパクトなLinuxディストリビューションの一種です。このイメージはAlpine Linuxと呼ばれるLinuxディストリビューションをベースにしており、Dockerコンテナ内でアプリケーションを実行するための最小限の環境を提供します。

Alpine Linuxイメージの特徴としては以下の5つになります。

  • 軽量性
    Alpine Linuxイメージは非常に軽量化されたイメージのため、ディスクスペースの節約やネットワーク帯域の効率的な利用が可能です。
  • 高速な起動
    Alpine LinuxイメージをベースにしたDockerコンテナは非常に高速に起動します。
  • セキュリティ
    Alpine Linuxはセキュリティに特に注意を払っており、軽量であるが故に攻撃面を狭めることができます。
  • カスタマイズ可能
    Alpine Linuxイメージは、ユーザーが必要なライブラリやツールを追加してカスタマイズすることができます。これにより、アプリケーションの要件に合わせた最小限の環境を構築できます。
  • パッケージ管理
    Alpine Linuxイメージは、apkと呼ばれる独自のパッケージ管理ツールを使用します。apkはパッケージのインストール、アップグレード、依存関係の解決を行うため、必要なソフトウェアを効率的に管理できます。

Alpine Linuxイメージのメリット・デメリット

メリット

  • 軽量性
    Alpine Linuxは小さなイメージサイズであるため、イメージのダウンロードや起動が非常に高速です。これにより、クラウド環境やコンテナオーケストレーションプラットフォームでのスケーリングが効率的に行えます。
  • 効率的なリソース利用
    イメージサイズが小さいことで、ディスクスペースやメモリ使用量を節約し、リソースを効果的に利用することができます。
  • セキュリティ
    Alpine Linuxはセキュリティに重点を置いており、軽量ながらも攻撃面を狭める設計がされています。セキュリティの強化が求められる環境やアプリケーションに適しています。

デメリット

  • パッケージの制約
    Alpine Linuxは軽量さを追求するために、一部のパッケージやライブラリが制約されている場合があります。これにより、一部のアプリケーションや依存関係が動作しない可能性があります。
  • 互換性
    Alpine Linuxに変更する際、アプリケーションやライブラリが正しく動作するかテストが必要です。特にアプリケーションが特定のパッケージやライブラリに依存している場合に注意が必要です。

Alpine Linuxイメージへの移行手順

今回は以下のDockerfileの内容をAlpine Linuxイメージへ移行しました。

FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y nodejs yarnpkg chromium chromium-driver vim
RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
上記Dockerfileはクイックスタートを参考に作成しています。
  • Ruby: 3.2.2
  • Rails: 7.0.4.3
  • DB: MySQL

 

移行後のDockerfileは以下のようになります。

FROM ruby:3.2.2-alpine3.18

WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN apk update && \
    apk upgrade && \
    apk add --no-cache linux-headers libxml2-dev make gcc libc-dev nodejs yarn tzdata bash mysql-dev && \
    apk add --no-cache -t .build-packages --no-cache build-base curl-dev mysql-client && \
    bundle install && \
    apk del --purge .build-packages

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
  • ベースイメージの変更
    ベースイメージをruby:3.2.2からruby:3.2.2-alpine3.18に変更しました。これにより、Alpine Linuxベースの軽量な環境を利用することができます。
  • パッケージ管理の変更
    Alpine Linuxではapt-getではなくapkを使用します。変更後のDockerfileでは、apkコマンドを使用して必要なパッケージをインストールしています。また、--no-cacheオプションを使用することで、不要なキャッシュファイルを削除してイメージサイズを小さく保ちます。
  • パッケージの追加と削除
    linux-headerslibxml2-devなどの必要なパッケージを追加し、不要なパッケージはapk delコマンドを使用して削除しています。これにより、イメージの軽量化とセキュリティの向上が図られます。
  • Dockerイメージビルドの最適化
    apk addおよびbundle installを同じRUNステートメント内で実行し、不要な中間イメージを作成せずに済むようにしています。また、ビルドにのみ必要な一時的なパッケージ(.build-packages)を明示的に指定し、後でそれらを削除しています。

Alpine Linuxイメージに移行後の結果

sample_app_webのSIZEを確認すると、Alpine Linuxイメージ変更前ではイメージサイズが2.39GBでしたが、Alpine Linuxイメージ変更後は468MBまで軽量化されています。

Alpine Linuxイメージに変更することで、イメージサイズを約5分の1まで軽量化することができました。

# Alpineイメージ変更前

% docker images         
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
sample_app-web                latest    dadc1043b2eb   3 minutes ago   2.39GB
mysql                         8.0.32    412b8cc72e4a   4 months ago    531MB
# Alpineイメージ変更後

% docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
sample_app-web                 latest    e81c9b7e2994   3 minutes ago   468MB
mysql                         8.0.32    412b8cc72e4a   4 months ago    531MB

まとめ

  • Alpine Linuxイメージは、Dockerコンテナ内で動作するための軽量でコンパクトなLinuxディストリビューションの一種
  • Alpine Linuxイメージに変更することで、イメージサイズが軽量化され、起動の高速化が期待できる
  • 一方で、一部のパッケージやライブラリが制限されており、アプリケーションによっては動作しなくなる場合がある

参考

Ruby Official Image

 

今回はDockerのベースイメージをAlpine Linuxに変更したことで、イメージサイズが大幅に軽量化されたので、その概要と手順についてまとめました。Dockerの起動が遅いと感じている場合はイメージを変更することで解決できるかもしれません。