2019年12月13日金曜日

docker-slim 使ってみた

概要

docker-silm はビルドした docker のイメージのサイズを小さくすることができるツールです
イメージは無駄に大きくなることが多いのでこれを使うことでレジストリのディスク容量を節約することができます

環境

  • macOS 10.15.2
  • docker-slic 1.26.1

インストール

執筆時点では Homebrew ではインストールできないようです
公式のホームページからバイナリをダウンロードして PATH 配下に配置すれば OK です

  • unzip dist_mac.zip
  • mv dist_mac/docker-slim* /usr/local/bin
  • docker-slim --version

試してみる

よく使ってる Ruby のイメージがどれくらい小さくなるか試してみました

  • docker images ruby
REPOSITORY TAG IMAGE ID CREATED SIZE ruby latest d529acb9f124 5 months ago 840MB
  • docker-slim build --http-probe ruby
  • docker images ruby
REPOSITORY TAG IMAGE ID CREATED SIZE ruby latest d529acb9f124 5 months ago 840MB

あれ小さくなっていないぞ、、
どうやらポートを EXPOSE しているようなイメージでないとダメなようです
要するに Web アプリのイメージであれば良いようです

イメージを作成する

簡単な Web アプリのイメージを作成してみましょう
元のイメージは Ruby を使っています

  • bundle init
  • vim Gemfile
gem "sinatra"
  • vim app.rb
require 'sinatra'

get '/' do
  'ok'
end
  • vim Dockerfile
FROM ruby

ADD . /home
WORKDIR /home
RUN bundle install

EXPOSE 4567
CMD ["bundle", "exec", "ruby", "app.rb", "-o", "0.0.0.0"]
  • docker build -t my_app .
  • docker images my_app
REPOSITORY TAG IMAGE ID CREATED SIZE my_app latest 09c12a3382ec About a minute ago 872MB

必要なライブラリをインストールした分少し大きくなっているのがわかります

小さくしてみる

ではこれを小さくしてみましょう

  • docker-slim build --http-probe my_app

作成したイメージからコンテナが起動し EXPOSE したポートに対してアクセスします
うまくアクセスできればスリム化が始まります

docker-slim[build]: info=results status='MINIFIED BY 35.26X [872106607 (872 MB) => 24732141 (25 MB)]'」こんな感じのログが表示されれば成功です
スリム化したイメージはイメージ名の最後に .slim が付与されているようです

  • docker images my_app.slim
REPOSITORY TAG IMAGE ID CREATED SIZE my_app.slim latest 3a67521db855 About a minute ago 24.7MB

872MB -> 25MB にまで縮小されました
かなり小さくなっているのがわかります

イメージの動作確認

念の為 Web アプリが起動するか確認してみましょう

  • docker run -d -p 4567:4567 --name my_app my_app.slim

あとは 4567 ポートにアクセスして OK が返ってくるか確認しましょう

  • curl localhost:4567

動作確認できたら停止しておきましょう

  • docker stop my_app
  • docker rm my_app

Web アプリでないとダメなのか

単純に EXPOSE されているイメージであればいけるのかなと思いやってみました

  • vim Dockerfile
FROM ruby

EXPOSE 4567
  • docker build -t my_app2 .
  • docker-slim build --http-probe my_app2

結果はダメでした
docker-slim の途中で EXPOSE したポートにアクセスするときにレスポンスが返ってこないためエラーになりました
docker-slim[build]: info=http.probe.call status=error method=GET target=http://127.0.0.1:32780/ attempt=1 error='Get http://127.0.0.1:32780/: EOF' time=2019-12-11T23:36:21Z

やはりスリム化するためには Web アプリのように何かしらのプロセスでコンテナが LISTEN している必要があるようです
ただ、そこまで仕組みなどを調査していないので他に方法があるかもしれません
サンプル もいろいろとあるので興味があれば見てください

最後に

docker-slim を試してみました
すでに Web アプリがある場合は導入が簡単なのですぐにでも適用できると思います
スリム化後は別のイメージとしてできあがるのでコンテナを起動する際は小さくなったイメージからコンテナを生成するようにしましょう
そうしないと大きいサイズのイメージを使い続けることになるのでせっかくイメージを小さくしたのに大きいサイズのイメージを削除することができません

現状は Web アプリ限定な感じがあるのでポートを EXPOSE しないようなイメージの場合は適用できないかなと思います
小さくするためだけに無理やり EXPOSE するのも微妙かなと思います

参考サイト

0 件のコメント:

コメントを投稿