CA Reward

Tech Blog

Tech Blogトップに戻る

docker-slimによるImageの簡単ダイエット

2016.02.11

  • このエントリーをはてなブックマークに追加
  • Pocket
junchang1031
junchang1031エンジニア

Docker Container Imageのダイエット

先日こちらに参加してきました。非常に興味深い内容ばかりだったのですが、その中でもこのスライドの内容はとても印象に残りました。

私自身は残念ながら今の職場がオンプレミス環境(一部ハイブリッド)なこともあり、Dockerの本番運用は出来ていないのですが、 Dockerを使ったImmutable Infrastructureな環境下では、Dockerレジストリからpullする際の時間の割合がDeployの多くを占めること、 その時間を短縮することが重要であることは容易に想像がつきます。

サーバー - レジストリの物理的な距離によるレイテンシは自前でレジストリを建てるなり、 AWSではAmazon EC2 Container Registryを利用するなりで解決できる問題ですが、 Container Imageのサイズに関しては、作る際に必要に応じて容量の圧縮(ダイエット)を行う必要があります。

上記スライドにもある通り、基本的には地道に頑張るのが王道だとは思いますが、 怠惰な私からすると非常に辛い作業に映ったので(ディスっているわけではありません。念のため) 何か良いものがないのかを探してみたところ、良さそうなものを見つけましたのでご紹介します。

docker-slim

docker-slim は、 定期的に開催されている Global Docker Hack Day で生まれたプロジェクトですが、 その後も継続的にOSSとして開発が進められているようです。

詳細はREADMEとDemoのビデオを見てもらえればおおよそのイメージはつかめると思いますが、 特徴をいくつかご紹介します。

  • Go製のDocker Container Imageサイズ圧縮自動化ツール
  • 静的(Dockerfile)及び動的(各レイヤーでのプロセスの起動情報など)な解析による最適化
  • ダイエットしたImageだけではなくDockerfileも作成してくれる(リバースエンジニアリング)
  • デモではnode.jsのイメージが431.7MBから14.22MB(約97%削減!)

動かしてみる

インストール手順などは割愛します。GithubのREADMEをご覧ください。

デモと同じことをしても面白くないのでイメージを別で用意して動かしてみました。 今回は公式の golang 1.5のイメージを使用します。

docker-library/golang | github.com

まず普通にbuildします

725.1MBでした。

docker-slimを実行してみます

注意: サンプル通りdocker-slim実行ファイル直下で行わないと動作しません

作成されたイメージを見てみると・・99%以上削減されています。マジか。。

DockerFileを見てみます

まずベースのイメージが上のスライドでも紹介されていた超軽量イメージのscratchに置き換わっています。 まあここは予想通りでした。

あとはオリジナルの方で行っているGoのSDKのダウンロードがバッサリ消されていますね。 おそらく動的な解析の結果、これらのファイルを利用しているレイヤーが無いため不要と判断しているのだと思います。

docker exec /bin/bash でログインして何らかのプロセスを立ち上げる、みたいなコンテナには使用できませんね。 (まあ本番利用ではほぼありえないと思いますが)

まとめ

今回はちょっとサンプルが良くなかった気がしますが、、コード自体もslimで素晴らしいプロダクトだと思います。 Docker Imageのダイエットにお悩みの方は、ぜひ導入ご検討されてみては如何でしょうか。

junchang1031
junchang1031エンジニア