Slide 1

Slide 1 text

Docker Imageについてほんの少し だけ詳しくなれるかも知れない話(5 分版) @i_whammy_

Slide 2

Slide 2 text

目的 ● Docker Imageのtagについてる -slim, -bullseyeみたいなやつが何なのかなんとなくわかるようになる ● 前よりほんの強めに目的意識を持ってDocker Imageを選択できるようになる ○ ちょっと前の自分のように、なんとなくImageを選んでた人に視点を提供したい ○ 結果的にパイプライン実行時間やリードタイムの短縮とかに繋がると嬉しい ● LTとかあんまりしたことないので練習したかった ○ 対戦よろしくお願いします

Slide 3

Slide 3 text

はじまり ● 「1時間デプロイ」目指したかった ● 現状のストーリー着手〜リリースまでのフローを見直した ● docker pull って開発時、CI時に必ず何度か実行されるなって気付いた ● より小さいイメージを求めて調べた結果 -slim と出会う ○ ちゃんと知りたいなと思うようになる

Slide 4

Slide 4 text

そもそも ● Docker Imageが関係する「時間」にはいくつか種類がある ○ docker pull にかかる時間 ■ baseとなるDocker Imageのsize、レイテンシ、キャッシュの有無等に依存する ■ 今回の話のメインはここ ○ docker push にかかる時間 ■ 成果物のDocker Imageのsize、レイテンシ、キャッシュの有無などに依存する ○ docker build にかかる時間 ■ build時に実行される処理内容、ビルド環境のスペック等に依存する ○ docker run にかかる時間 ■ run時に実行される処理内容、実行環境のスペック等に依存する

Slide 5

Slide 5 text

シンプルな問い ● docker pull にかかる時間を短くするにはどうすれば良い? ○ つよつよなネットワーク環境を用意する ■ できたらいいよね ■ とはいえ時間もコストもかかるよね ○ sizeの小さいDocker Imageをbase imageにする ■ こっちだ!

Slide 6

Slide 6 text

いろいろなDocker Image ● 標準 ○ latest
 ○ 所謂「フルイメージ」「full distribution」 ○ Clojureの場合、最新のDebianのstable releaseをベースにしている

Slide 7

Slide 7 text

いろいろなDocker Image ● Debianベース ○ それぞれのバージョンの開発コード名が付与されている ■ bullseye(Debian 11), buster(Debian 10), stretch(Debian 9), jessie(Debian 8) ■ Debianベースにするなら、最新のstableを使いましょう(2022/7/7現在ならbullseye) ○ 軽量版 ■ slim
 ■ フルイメージの下位互換, UbuntuやDebianをベースにした最小限 ■ 使用頻度の高いパッケージのみに削ぎ落とされている

Slide 8

Slide 8 text

いろいろなDocker Image ● Alpine Linuxベース ○ alpine
 ■ 超軽量 ■ いくつか留意すべき点あり ● Windowsベース ○ windowsservercore
 ○ nanoserver


Slide 9

Slide 9 text

いろいろなDocker Image(おまけ) ● Distroless ○ https://github.com/GoogleContainerTools/distroless ○ "Distroless" images contain only your application and its runtime dependencies. They do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution. ○ アプリケーション実行に必要な最小限のもののみに絞り込む事で軽量化、セキュアな実行環境を実現す る ○ 但しパッケージマネージャーやシェルも入ってないので、デバッグが大変になる可能性がある

Slide 10

Slide 10 text

Alpineってどうなんだい? ● Docker公式にもAlpine使うと良いよって書いてある ○ Whenever possible, use current official images as the basis for your images. We recommend the Alpine image as it is tightly controlled and small in size (currently under 6 MB), while still being a full Linux distribution. ○ (雑訳)オフィシャルなイメージを使いましょう。Alpineはいいぞ。 ● ただ以下のような考慮点もあるので、要所要所できちんと判断して使う方が良い ○ bash, apt-get等, Ubuntuでは利用できるが、Alpineでは利用できないコマンドがある ○ apkで利用可能なパッケージのバージョンが古いことがある ○ Alpineが悪いというわけではありません

Slide 11

Slide 11 text

実際どのくらい違うの? ● clojure(2022/7/7時点 linux/amd64)の場合 ○ latest ... 357.38 MB ○ openjdk-17-bullseye ... 334.25 MB ○ openjdk-17-slim-bullseye ... 268.28 MB ○ openjdk-17-alpine ... 197.49 MB

Slide 12

Slide 12 text

実際にプロジェクトで使ってみた ● あるClojureのアプリケーションの話 ○ 元々ビルドで使っていたイメージ:clojure:openjdk-17-lein-2.9.8-bullseye(328.08MB) ○ 今使ってるイメージ:clojure:openjdk-17-lein-2.9.8-slim-bullseye(225.94MB) ○ その差約100MB ● イメージを変更した結果、ビルド時間が20秒短縮された(キャッシュ無しの状態)

Slide 13

Slide 13 text

さいごに ● いろいろなDocker Imageがあることを知っていこう ● 少なくともdocker pull時に限ってはimage sizeが小さいことは良いこと ● build時、run時のパフォーマンスについても調べられると楽しそう ● 1時間デプロイは目指すと楽しいぞ

Slide 14

Slide 14 text

References ● https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from ● https://hub.docker.com/_/clojure ● https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences -in-docker-62171ed4531d ● https://github.com/GoogleContainerTools/distroless