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つのタブが表示されます。
OVERVIEW
FILE EXPLORER
DOCKERFILE
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