コンテナイメージを zstd (Zstandard) で圧縮するとどのぐらいサイズを小さくできるのかに興味があって試してみた❗️今回は BuildKit(docker buildx
コマンド)で zstd 圧縮をする.zstd 自体の詳細は以下のドキュメントなどを読むと良さそう👀
サンプル Dockerfile
今回はサンプルとして Build Your Own Radar (BYOR) の Dockerfile
を使う.zstd とは全然関係ないけど,今年 BYOR を試したときに(記事1/記事2)イメージサイズが大きいなぁー💨という印象があって,今回サンプルに使えると思った.
BYOR を macOS で普通にビルドすると「1.7 GB」もあって,Docker Hub に push すると「582.63 MB」になる.また docker buildx imagetools inspect
コマンドを実行すると gzip 圧縮をしてることも確認できる.
$ docker buildx imagetools inspect --raw ${IMAGE_URI}:default | grep mediaType "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "mediaType": "application/vnd.docker.container.image.v1+json", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
zstd 圧縮を試す
さっそく zstd 圧縮を試す❗️まずは準備として docker buildx create
コマンドを使って BuildKit ビルダーインスタンスを作る.
$ docker buildx create \ --name zstd-builder \ --driver docker-container \ --driver-opt image=moby/buildkit:v0.11.6 $ docker buildx use zstd-builder
次に docker buildx build
コマンドを使ってビルドしつつ,直接 Docker Hub に push までしてしまう.ポイントは compression=zstd
を指定するところと compression-level
に圧縮レベル(0-22まで)を指定するところ💡
今回は compression-level
として "3, 5, 10, 15, 22" で比較してみた.環境やイメージなどによって結果が違う可能性もあるため,参考値ではあるけど,もともとの「582.63 MB」から最大で「458.82 MB(123.81 MB 削減)」まで確認できた❗️
おおっー \( 'ω')/
# compression-level=3 # 529.96 MB $ docker buildx build \ --output type=image,name=${IMAGE_URI}:zstd3,oci-mediatypes=true,compression=zstd,compression-level=3,force-compression=true,push=true . # compression-level=5 # 529.97 MB $ docker buildx build \ --output type=image,name=${IMAGE_URI}:zstd5,oci-mediatypes=true,compression=zstd,compression-level=5,force-compression=true,push=true . # compression-level=10 # 458.82 MB $ docker buildx build \ --output type=image,name=${IMAGE_URI}:zstd10,oci-mediatypes=true,compression=zstd,compression-level=10,force-compression=true,push=true . # compression-level=15 # 458.82 MB $ docker buildx build \ --output type=image,name=${IMAGE_URI}:zstd15,oci-mediatypes=true,compression=zstd,compression-level=15,force-compression=true,push=true . # compression-level=22 # 458.93 MB $ docker buildx build \ --output type=image,name=${IMAGE_URI}:zstd22,oci-mediatypes=true,compression=zstd,compression-level=22,force-compression=true,push=true .
まとめ
今回はコンテナイメージの zstd (Zstandard) 圧縮を試してみた❗️Build Your Own Radar (BYOR) の Dockerfile を対象にして,結果的に gzip よりもイメージサイズを削減できた👏 ビルド時間は遅くなってしまうけど,保存サイズを小さくできて,ダウンロードも速くなる可能性もあるし,選択肢として覚えておくと良さそう.
また以下の記事に書いてある通り,AWS Fargate でも zstd 圧縮したコンテナを動かすことができて,次に試してみたいところ👌