LoginSignup
1
1

More than 3 years have passed since last update.

コンテナイメージサイズ削減手法の効果

Posted at

サービスインにかかる時間短縮等のため、コンテナイメージサイズはできるだけ小さくする必要があります。Dockerではイメージレイヤ数削減が、コンテナイメージサイズ削減の常套手段です。

しかし、マルチステージビルドが利用可能になったこともあり、コンテナイメージサイズ削減の手法ごとの効果を改めて調べてみました。

対象

  • Dockerの概要は知っている人
  • コンテナイメージサイズ削減手法の効果が知りたい人

サンプル

以下の条件でコンテナイメージサイズを比較します。

  • ベースイメージ:nginx
  • トップページ:ngixのLicenseページ

Debian

比較元となるコンテナイメージです。以下のDockerfileを使用します。

FROM nginx:latest
WORKDIR /usr/share/nginx/html

RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y wget
RUN wget https://nginx.org/LICENSE -O index.html

Alpine

ディストリビューションの変更によりコンテナイメージサイズ削減を図ります。以下のDockerfileを使用します。

FROM nginx:alpine
WORKDIR /usr/share/nginx/html

RUN apk update
RUN apk upgrade
RUN apk add wget
RUN wget https://nginx.org/LICENSE -O index.html

Alpine + &&結合

&&結合によりイメージレイヤ数削減を図ります。以下のDockerfileを使用します。

FROM nginx:alpine
WORKDIR /usr/share/nginx/html

RUN apk update &&\
  apk upgrade &&\
  apk add wget  &&\
  wget https://nginx.org/LICENSE -O index.html

Alpine + マルチステージビルド

マルチステージビルドの利用により、イメージレイヤ数削減を図ります。マルチステージビルドはDocker ver 17.05以降で利用可能です。以下のDockerfileを使用します。

FROM alpine:latest AS build # .............................. A
WORKDIR /
RUN apk update
RUN apk upgrade
RUN apk add wget # ...................................... 1
RUN wget https://nginx.org/LICENSE -O index.html # ...... 2

FROM nginx:alpine # ........................................ B
COPY --from=build /index.html /usr/share/nginx/html # ... 3

上記のDockerfileの処理を解説します。

A. ビルド用コンテナ

B. 実行コンテナ

  1. ビルド用コンテナにwegetをインストールする
  2. ngixのLicenseページをindex.htmlとして保存する
  3. ビルド用コンテナのindex.htmlを実行コンテナのトップページとする
  • ビルド用コンテナはイメージのビルドが終われば削除される
  • 実行コンテナはアプリケーションの実行に必要なパッケージのみインストールすればよい
    • よって、コンテナイメージサイズの削減が図れる

結果

Debian Alpine Alpine + &&結合 Alpine + マルチステージビルド
ディストリビューション Debian Alpine Alpine Alpine
メモリ使用量(MB) 152 25.7 25.6 21.3

結論

  • ディストリビューションの変更によるコンテナイメージサイズ削減が最も効果が大きかった
  • &&結合はイメージレイヤ数が多くないとコンテナイメージサイズ削減の効果を発揮しにくい
  • イメージ削減の代償として、可読性も悪くなっている
    • 本番用実行コンテナをローカル環境でテストできることが重要で、開発用実行コンテナと本番用実行コンテナとの構成は異なってよいのでは?
    • ディストリビューションは共通で、開発時は可読性優先、本番用はコンテナイメージサイズ削減優先とすればよいのでは?

終わりに

コンテナイメージサイズ削減の手法と、手法ごとのコンテナのサイズをまとめました。可読性の問題も絡むため、コンテナイメージサイズ削減の手法はケースバイケースでよいのではないでしょうか。

参考

マルチステージ・ビルドを使う

Docker/Kubernetes 実践コンテナ開発入門

Docker multi stage buildで変わるDockerfileの常識

Dockerのマルチステージビルドを使う

今更ながらDocker マルチステージビルド

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1