Docker Hub image 大小與本地大小不同原因與 Docker tar archive

最近在使用 docker image 時候發現本地的 image 大小與 Docker Hub 顯示的大小不太一樣,所以就研究了一下。

下載 ubuntu docker image

首先先下載一個 docker image 來看看這個 docker image 的大小這邊以 ubuntu:20.04 來做示範

$ docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
a31c7b29f4ad: Pull complete
Digest: sha256:b3e2e47d016c08b3396b5ebe06ab0b711c34e7f37b98c9d37abe794b71cea0a2
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04

比較 Docker Hub image 大小與 local image 大小

使用 docker images 查詢一下大小這邊可以發現我們本地端下載下來的 docker image 大小是 72.8MB

$ docker images ubuntu:20.04
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
ubuntu       20.04     c29284518f49   2 days ago   72.8MB

再來我們使用 API 查詢一下 Docker Hub 上面的 image 大小可以看到上面只有顯示 28565863

$ curl -s https://hub.docker.com/v2/repositories/library/ubuntu/tags\?page\=3 | \
    jq '.results[] | select(.name=="20.04") | .full_size'
28565863

打開網頁看一下大小與 API 查到的也差不多,不過整個大小明顯比我們用 docker images 看到的小很多

在 AWS ECR 的說明文件下看到 Docker push 到 V2 Docker registry 前會先壓縮,所以 docker images 的大小才會不一樣。

從 Docker 1.9 版本開始,Docker 用戶端在將映像推送至 V2 Docker 登錄檔前,會先壓縮映像層。的輸出docker images指令會顯示未壓縮的影像大小。因此,請記住,Docker 可能會傳回比AWS Management Console。

https://docs.aws.amazon.com/zh_tw/AmazonECR/latest/userguide/repository-info.html

製作封裝的 docker image

最近有一個需求是要用檔案的方法傳輸自己的 Docker image,那這樣 image 的大小就會影響速度跟流量,那降低大小就很重要,所以下面就來說明怎麼製作與 Docker Hub 顯示大小差不多的 Docker image 封裝檔

我們使用兩種打包方式比較一下他們的大小,一個是直接使用 tar 與另一個使用 tar.gz,可以看到 tar.gz 壓出來的檔案與 Docker Hub 顯示的一樣

$ docker save ubuntu:20.04 > ubuntu.tar
$ docker save ubuntu:20.04 | gzip > ubuntu.tar.gz
$ ls -lh
-rw-rw-r-- 1 clarence clarence  72M Jul 16 07:44 ubuntu.tar
-rw-rw-r-- 1 clarence clarence  27M Jul 16 07:46 ubuntu.tar.gz

還原封裝的 docker image 到本地

那這樣抓到檔案之後我們要怎麼還原呢?其實只要使用一行指令就可以了!指令可以混用

$ docker load --input ubuntu.tar
Loaded image: ubuntu:20.04
$ docker load < ubuntu.tar.gz
Loaded image: ubuntu:20.04

參考資料