kakakakakku blog

Weekly Tech Blog: Keep on Learning!

コンテナイメージの zstd 圧縮を試してみた

コンテナイメージを zstd (Zstandard) で圧縮するとどのぐらいサイズを小さくできるのかに興味があって試してみた❗️今回は BuildKit(docker buildx コマンド)で zstd 圧縮をする.zstd 自体の詳細は以下のドキュメントなどを読むと良さそう👀

docs.docker.com

github.com

サンプル Dockerfile

今回はサンプルとして Build Your Own Radar (BYOR)Dockerfile を使う.zstd とは全然関係ないけど,今年 BYOR を試したときに(記事1記事2)イメージサイズが大きいなぁー💨という印象があって,今回サンプルに使えると思った.

github.com

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",

docs.docker.com

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

docs.docker.com

docs.docker.com

次に docker buildx build コマンドを使ってビルドしつつ,直接 Docker Hub に push までしてしまう.ポイントは compression=zstd を指定するところと compression-level に圧縮レベル(0-22まで)を指定するところ💡

docs.docker.com

今回は 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 圧縮したコンテナを動かすことができて,次に試してみたいところ👌

aws.amazon.com