サービスインにかかる時間短縮等のため、コンテナイメージサイズはできるだけ小さくする必要があります。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. 実行コンテナ
- ビルド用コンテナにwegetをインストールする
- ngixのLicenseページをindex.htmlとして保存する
- ビルド用コンテナのindex.htmlを実行コンテナのトップページとする
- ビルド用コンテナはイメージのビルドが終われば削除される
- 実行コンテナはアプリケーションの実行に必要なパッケージのみインストールすればよい
- よって、コンテナイメージサイズの削減が図れる
結果
Debian | Alpine | Alpine + &&結合 | Alpine + マルチステージビルド | |
---|---|---|---|---|
ディストリビューション | Debian | Alpine | Alpine | Alpine |
メモリ使用量(MB) | 152 | 25.7 | 25.6 | 21.3 |
結論
- ディストリビューションの変更によるコンテナイメージサイズ削減が最も効果が大きかった
- &&結合はイメージレイヤ数が多くないとコンテナイメージサイズ削減の効果を発揮しにくい
- イメージ削減の代償として、可読性も悪くなっている
- 本番用実行コンテナをローカル環境でテストできることが重要で、開発用実行コンテナと本番用実行コンテナとの構成は異なってよいのでは?
- ディストリビューションは共通で、開発時は可読性優先、本番用はコンテナイメージサイズ削減優先とすればよいのでは?
終わりに
コンテナイメージサイズ削減の手法と、手法ごとのコンテナのサイズをまとめました。可読性の問題も絡むため、コンテナイメージサイズ削減の手法はケースバイケースでよいのではないでしょうか。