今回は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"]
- 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-headers
やlibxml2-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イメージに変更することで、イメージサイズが軽量化され、起動の高速化が期待できる
- 一方で、一部のパッケージやライブラリが制限されており、アプリケーションによっては動作しなくなる場合がある
参考
今回はDockerのベースイメージをAlpine Linuxに変更したことで、イメージサイズが大幅に軽量化されたので、その概要と手順についてまとめました。Dockerの起動が遅いと感じている場合はイメージを変更することで解決できるかもしれません。