Dockerイメージを小さくするための3つの簡単な方法

3 simple tricks for smaller Docker images – Skills Matter – Medium
の記事です。 オライリーニュースレターで紹介されてました。

面白かった。

まず、ちょっとnodeの勉強になった。npmってこう使うんだ。へーw

で、"multi-stage Docker build" へー。へー。

1. レイヤをまとめると少し小さくできる

まず、マルチステージを使って、複数レイヤを1つにまとめることで、Dockerイメージのサイズを少し小さくできる。

2. distrolessを使って不要なレイヤを省く

GitHub - GoogleContainerTools/distroless: 🥑 Language focused docker images, minus the operating system.
!!!! これはいいじゃん。

へー。ふむふむ。ビルドは node:8 を使って普通にやって、 マルチステージの2つ目で、ベースを
gcr.io/distroless/nodejs
にする、って方法なのか。

上記Googlegithubには、
gcr.io/distroless/nodejs
は'experimental'て書いてるけど、
gcr.io/distroless/base
gcr.io/distroless/java
gcr.io/distroless/cc
はそうじゃないらしいぞ!それはすごい。

OSが全然ないので、sshしてbashとか走らせられないけど、裏を返せば、クラッカーも自由が効かなくて悪さしにくい、ってメリットもあると。
In other words, fewer binaries mean smaller sizes and increased security.
まぁ本番コンテナではデバッグとかあんましないはずだしね、とも。

Alpineでより小さなイメージ

コンテナに入りたければ、んじゃ、Alpineはどうよ、ってことで、Alpineの紹介に続いてます。 Alpineは、より小さいけど、glibcじゃなくてmuslcなので、互換性に問題でるかもよ、と。Alpineでビルドしたものがglibcで走らないとか。

あなたにはどのベースイメージが向いてる?

んで、この記事の結論パート。

  • If you’re running in production and you’re concerned about security, perhaps distroless images are more appropriate.
  • If you’re concerned about size at all costs, then you should switch to Alpine-based images.
  • The vanilla base image is perfect for testing and development.

感想

なるほどなるほど。 いやぁ面白かった。

さて、僕は、実際の仕事で使うチャンスあるかな?