Slim.AI Docker Extensionでコンテナイメージのダイエット
昨日はフロントエンドえんじにゃー谷さんのアートとエンジニアリングでした。
自分が今まで触れてきたことない技術領域についての話だったのでとても新鮮でした。
まだ読んでいない方はぜひご一読ください。
こんにちは、寒くなりジムにいけずダイエットが停滞しているkata_devです。
せめてコンテナイメージくらいはダイエットしたいものです。
本記事ではSlim.AI Docker Extensionを使って、コンテナイメージのダイエットを行う流れを雑に書きたいと思います。
Slim.AI Docker Extensionとは
Slim.AI Docker Extensionはslim.aiが提供する一部機能をDocker Desktop上で使用できるものです。
この拡張機能を利用することで、ローカル上のコンテナイメージを分析し、可視化・最適化を行うことができます。
(slim.aiのアカウントを持っていれば、リモートリポジトリ上のイメージに対しても可能)
※ 以降、Slim.AI Docker Extensionだと長いのでSlim.AIと表記します
Slim.AIのインストール
Docker DesktopのサイドバーのAdd Extensionを押すとExtensions Marketplaceが開くので、
Slim.AIで検索してインストールを行います。

Extensions Marketplace
Slim.AIでダイエットしてみる
インストールが終わったら、デモ用のイメージを作りSlim.AIを使ってダイエットしていきます。
テスト用のイメージを作成
Slim.AIを起動する前に、以下のDockerfileを使ってダイエット対象のコンテナイメージを作成します。
FROM ubuntu:22.04
RUN <<EOF
apt-get update -y
apt-get install -y bash vim
EOF
# 約100MBの実行ファイル
COPY exec-file .
RUN chmod +x exec-file
ダミーの100MBのファイルはddコマンドなどで作っちゃいます。
$ dd if=/dev/zero of=exec-file bs=1M count=100
これをsample:latestという名前でビルドします。
docker build -t sample:latest --load .
イメージのビルドが完了したらSlim.AIを使ってsample:latestイメージを分析していきます。
Slim.AIを起動する
サイドバーのExtentionsからSlim.AIを押すと、裏でSlim.AIのコンテナが起動します。
初回アクセス時はSlim.AIのコンテナがまだ起動完了していないためエラーとなるので、コンテナが起動するまで待ちます。

初回アクセス時はエラーになっちゃう...
Docker DestktopのContainersを確認し、Slim.AIのコンテナがRunningとなっていればokです。

Containers
再度Slim.AIにアクセスし、Start exploring containersを押すとローカルに保持されているコンテナイメージの一覧が表示されます。

slim.ai
ローカルのイメージを分析する
では先ほどビルドしたデモ用のイメージを分析してみましょう。
ローカル上のイメージの一覧の中からsample:latestを探してExploreを押します。

Explore
分析が完了すると、以下の3つのタブが表示されます。
OVERVIEWFILE EXPLORERDOCKERFILE
OVERVIEWでは実行ユーザ・ベースOS・圧縮前のイメージサイズなどコンテナイメージの概要について確認できます。
sample:latestイメージは圧縮前のサイズで374MBなのが確認できます。

イメージの概要
FILE EXPLORERでは、イメージのファイルシステムの中身や、各レイヤーごとのファイルシステムの差分を確認することができます。
例えば、Layer Allを見てみるとコンテナイメージのファイルシステムの中身を確認することができます。

イメージのファイルシステムの中身
DOCKERFILEでは、Slim.AIが分析したコンテナイメージを元に最適化したDockerfileを吐き出してくれます。
(あまりちゃんと調べてないので深く触れません)

最適化されたDockerfile
Dockerfileのダイエット
それでは、FILE EXPLORERに表示される各レイヤーごとのファイルシステムの差分を確認し、不要なファイル・ディレクトリを削ってダイエットしていきます。
まずはRUN apt-get~のレイヤーを見てみましょう。
レイヤーサイズが95.6MBあるのが分かります。
更にレイヤーの差分を見ていくと、/var/lib/apt/listsが37.4MBあるのが確認できます。

レイヤーの差分
これはaptのキャッシュとして使われるディレクトリで、ビルドした後は不要なので消してしまいます。
対象のレイヤーを以下のように書き換えてaptのキャッシュをイメージに含まないようにします。
RUN <<EOF
apt-get update -y
apt-get install -y bash vim
+ rm -rf /var/lib/apt/lists
EOF
次にCOPY exec-file .のレイヤーを確認します。
こちらは単純にファイルをコピーしているだけなので、それが差分として表示されています。

COPY exec-file .のレイヤ
最後にRUN chmod +x exec-fileのレイヤーを確認します。
COPY exec-file .でコピーしたファイルのパーミッションを変更するだけですが、対象ファイルのサイズが差分として出てしまっています。

RUN chmod +x exec-fileのレイヤ
実はDockerfileではファイルパーミッションのようなメタデータの変更もレイヤーの差分として記録されます。
Dockerfileに慣れていない場合はやってしまいがちなやつだと思います。
これを防ぐにはCOPY命令の--chmodを使用します。
--chmodオプションを付けることで、ファイルのコピーとパーミッションの変更を1つの命令で実行できます。
# 約100MBの実行ファイル
- COPY exec-file .
- RUN chmod +x exec-file
+ COPY --chmod=777 exec-file .
これでデモ用イメージ内の全てのレイヤーの中身を精査できました。
修正後のDockerfileは以下となります。
FROM ubuntu:22.04
RUN <<EOF
apt-get update -y
apt-get install -y bash vim
rm -rf /var/lib/apt/lists
EOF
# 約100MBの実行ファイル
COPY --chmod=777 exec-file .
これをsample:fixという名前でビルドします
docker build -t sample:fix --load .
ダイエット結果
修正後のDockerfileを元にビルドしたsample:fixイメージの中身を確認していきます。
新たにビルドしたイメージをSlim.AIで分析する場合は、Slim.AIコンテナを起動しなおす必要があります。
ContainerからSlim.AIコンテナをRestartして、再度Slim.AIにアクセスします。

Slim.AIコンテナの再起動
先ほどビルドしたsample:fixのタグを指定して、Exploreを実行してみましょう。

sample:fixイメージ
分析が完了したらOVERVIEWを確認します。
圧縮前のサイズが232MBに減ったのがわかります。
(Dockerfile修正前は374MBだった)

OVERVIEW
各レイヤーの中身も見ていきましょう。
RUN apt-get~のレイヤーを見てみると、/var/lib/apt/lists/のサイズが消えているのが確認できます。

RUN apt-get~のレイヤ
COPY --chmod=777 exec-file .のレイヤーも確認します。
ファイルのコピーと共に実行権限が付与されていますが、修正前のように余分なレイヤー差分が作成されていないことがわかります。

COPY --chmod=777 exec-file .のレイヤ
ダイエット大成功!!!!
やったね!!!!
終わりに
Slim.AI便利ですね。
各レイヤーの中身まで簡単に確認できるので今後も重宝しそうです。
他にもコンテナイメージのダイエットに便利なツールなどあれば教えてください!
Discussion