IT未経験者が人生で初めて行ったDockerfileの軽量化で感じたこと

#初めに
2022/1/31に以下の記事を投稿しました。この記事は、以下の記事をまとめ感じたことを記したものとなっております。

https://qiita.com/shirochu0911/items/f18de3e31b9068521a62

#起きたこと
IT未経験者として、初めて現場に配属されて与えられたDockerファイルを軽量化してほしいとの要望をいただきました。
この時の私のステータスとしては以下の通りです。
・研修は受けたが、研修内容はJavaのコーディングのみ
・docker、openshift自体は、3ヶ月間くらい触ってみた
・dockerの理解度としては、コンテナがどういうものなのかという大雑把な理解
　Dockerfileの書き方すらわからない

#わからないことだらけ
現場の指示として、現行で動いている2GBくらいのDockerfileを軽量化してほしいとのこと

#んーわからん、とりあえず分解して調べるか
私が感じた必要な情報としては、以下の通り
・なぜ軽くするのか（そもそも軽くすると何が良くなるのか）
・軽くさせる方法（最も軽いベースイメージとは、軽くするためには何をしなくてはいけないのか）
・ベストプラクティス（どんなことをしているのが多いのか）

#なぜ軽くするのか？
そもそも軽くする理由ってなんだ？、軽くするとどういうメリットが生じるようになるんだ？という疑問が起きました。
この疑問については、以下の資料が理解するのに役立つと思います。

https://speakerdeck.com/stormcat24/oqian-falsedockerimezihamadazhong-i?slide=15

↑スライドが視覚的にわかりやすくタイトルが興味を引くようなものとなっていて読みやすく理解しやすい

https://blog.mosuke.tech/entry/2020/07/09/container-image-size/

↑なぜ軽くしないといけないのかが簡単にまとめてある

結論
軽くしないといけないのは、
●ポータビリティが向上する
●ノード障害等でコンテンが別ノードに移動する際によりはやく起動ができる
　（イメージのサイズが1GBあるとビルドするのに1分もかかる）
●サービスの復旧の速度を早めることにつながる

軽ければ軽いほどいいんだな、じゃあ軽くするか
え？どうすれば軽くなんの？
　　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2486920/d7a1e482-5e83-b9cc-d0e1-cf87ed2b00a7.png)

#軽くさせる方法
ネットの資料を片っ端から読み漁って感じた軽くさせる方法は以下の通り
●ベースイメージを必要最低限のものにする
　今回行った：最小のイメージってどれにすればいいなどを調査した
●イメージのレイヤーを減らす
　今回行った：Dockerfileを小さくするにはこう書いた方がいい
●成果物と機能でイメージを分ける
　今回行っていない：成果物自体だけだとそんな重くなかった
●いらないものを削る(docker-slim)
　今回行っていない：時間がありませんでした...(もしかしたら結構効果あるかも）

#ベースイメージを必要最低限のものにする
よーし軽くするか、じゃあまず基盤をどれにするか。
んーわからん、またwebの記事を漁りました。(web使えなかったら終わってたな笑、、、)

https://blog.inductor.me/entry/alpine-not-recommended

↑何人かの記事はこの人を参考にして作られていることが多かった

https://www.ted027.com/post/docker-debian-difference/

↑イメージのタグでどれを選ぶと軽くなるのかわかる

https://ceblog.mediba.jp/post/662840014480326656/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%97%E3%81%A6distroless%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E7%90%86%E7%94%B1%E3%81%A3%E3%81%A6/amp

結果として私が感じたのは以下の通り
軽量化で選ぶとしたら、、、
・Debian:slim
・redhat/ubi8-micro
・alpine Linux
・distroless

厳しい、、、
・CentOS
・軽くないイメージ系

厳しいと判断したものは、無駄なものが入り過ぎてしまっているので何もしていない段階でもメモリのサイズが大きくなってしまう。
軽量化関係なしで簡単にdockerで動かしたいな、って時にはCentOSなど全部入っているものがおすすめなのかと感じた。

よーし、じゃあ軽いもので行くかと思ったのですが、、、
大きな問題が一つ、軽いものを使うのには現状動いているものにどんなコマンド(yumなど)が必要かが全部わかっていないと削ることができない。

私のように、作成してからかなり経ってしまっているもののスリム化をするとなると規模が大き過ぎて何が必要なのかを洗い出すという時間が必要になり結局私のイメージはバージョンを上げることだけしかできませんでした。(んー、現実は厳しい）

次だ次！

#イメージのレイヤを減らす 成果物と機能でイメージを分ける いらないものを削る(docker-slim)
よしよし、基盤は決まったここから小手先で削っていこう
よーし、調べるか笑

https://www.itbook.info/network/docker02.html

↑dockerの構成を再度頭の中に入れておくとこの後の記事がわかりやすいと思います

https://qiita.com/gorohash/items/2358b4b9e0c708e510d0

https://www.slideshare.net/zembutsu/dockerfile-bestpractices-19-and-advice

https://ichi.pro/docker-ime-ji-no-saitekika-1-16-gb-kara-22-4-mb-92349124653841

https://future-architect.github.io/articles/20210121/

https://qiita.com/takky/items/401344672a803469b896

https://junchang1031.hatenablog.com/entry/2016/02/11/171449

https://hawksnowlog.blogspot.com/2019/12/getting-started-with-docker-slim.html?m=0

https://github.com/docker-slim/docker-slim

結論
方法論としては、以下の通り
・RUN、COPYは1行にまとめる
・マルチステージビルドを用いてビルド部分を切り離す
・docker-slimを用いてイメージ作成後に更なる減量をかける

これらを取り込んだ結果私のイメージは、2GBから1.18GBまでは縮まりました。
んー、まだまだデブだな笑
今後も技術を高めて、ダイエットできるように頑張るか。(現実の体も、、、)

#感想
今回、未経験ながらもなんとかやり切る事ができました。
やっぱりわからないものをゴリゴリ検索して実験してできるようになるのはとても楽しいですね！！
今回の記事が私のようにDockerfileの軽量化で悩んでいる人に少しでも届いていただければ幸せです。
フォロー LGTM DM なんでも待ってます！
では、またの機会