概要
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
docker-slim build --http-probe ruby
docker images ruby
あれ小さくなっていないぞ、、
どうやらポートを 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
必要なライブラリをインストールした分少し大きくなっているのがわかります
小さくしてみる
ではこれを小さくしてみましょう
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
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 件のコメント:
コメントを投稿