iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

我在 D3 - Docker Image ft. node image 差異 提到了 Node.Js 有好幾種不同系列的 Docker Image,上次觀察的角度是從 Dockerfile 去瞭解 image 的內容,

但不同系列間的 image 大小 (size) 有明顯的差異,像是 node:ltsnode:lts-slim 分別是 911 MB 及 179 MB,大小差了 4 倍,
我很好奇這個差異是從哪裡來的、Docker image 的 Image Size 又是從什麼計算而來的,

因此我們今天就來研究一下關於 Image Size。


Node Image

我們以 node image 為範例,先查看一下 Image Size:

$ sudo docker images

REPOSITORY    TAG          IMAGE ID       CREATED        SIZE
node          lts-slim     926ef1876ce3   20 hours ago   179MB
node          lts          9d2401e9e469   20 hours ago   911MB

du 指令

在 Linux 系統中,可以使用 du (disk usage 的縮寫) 這個指令來查看檔案及資料夾的大小,

我們在 Server 上試試:

# 當前路徑
$ pwd
/home/ubuntu/louis/2022-ithelp-docker-is-not-so-hard

# 取得大小總和
$ du --summarize --human-readable --total *
# or
# $ du -shc *

20K	D02-my-hello-world
76K	D05-hello-world-server
80K	D08-ithelp-team-crawler
20K	D10-mysql-database
11M	D11-ithelp-team-crawler-server
4.0K	README.md
11M	total

--summarize (-s) 會加總資料夾的內容大小,
--human-readable (-h) 會用人類容易閱讀的方式印出來 (10000 vs. 10 K),
--total 則是在最後也列出全部加總的大小,

Image size with du

來嘗試用 du 來看看 node:ltsnode:lts-slim 這兩個 image 的內容,可以用這個指令啟動一個 container:

$ sudo docker run --rm -it image-name:tag bash

另外,我們在 du 指令後面,再加上 sort 指令,排序一下大小

$ du -shc * | sort -h

(Credit: How can I sort du -h output by size)

1. node:lts

du -shc * | sort -h

0	dev
0	proc
0	sys
4.0K	boot
4.0K	lib64
4.0K	media
4.0K	mnt
4.0K	srv
8.0K	run
20K	home
140K	root
2.1M	etc
2.2M	tmp
5.2M	opt
5.2M	sbin
5.9M	bin
13M	lib
15M	var
886M	usr
934M	total

2. node:lts-slim

du -shc * | sort -h

0	dev
0	proc
0	sys
4.0K	boot
4.0K	lib64
4.0K	media
4.0K	mnt
4.0K	srv
8.0K	run
20K	home
140K	root
616K	etc
2.2M	tmp
4.1M	sbin
4.8M	bin
5.2M	opt
5.9M	var
12M	lib
152M	usr
187M	total

觀察大小

透過 sudo docker images 查看,兩個 Image Size 分別是 911 MB、179 MB,
而進到 container 後,du 指令所計算出來的空間總和,分別是 934M 跟 187M,

稍微有點差距,但這裡要注意一點,MB 通常不是 10 million Byte,而是 1024*1024 Byte (參考 WikiPedia - Megabyte),
同時可以看到 du 指令印的並不是 MB,而是 M

934 / 1.024 = 912.1
187 / 1.024 = 182.6

雖然還有些許誤差,但這樣就跟預期的數字很接近了,du 可能是用 KB 來加總並呈現的,

因此,我們可以推測,Docker Image Size 就是用內容物的大小來加總後的結果。

觀察內容

可以發現兩個 image 主要的差異是在於 /usr 資料夾中,Linux 多數的軟體會被安裝在 /usr 下,
而根據我們上次的研究,ltslts-slim 的 Dockerfile 差異是在於是否放入了一些開發工具或執行的軟體,

我們的觀察也跟從 Dockerfile 理解的很相似,
lts 為了提供較完整的軟體跟工具,安裝了比較多的東西,盡可能滿足大部分的需求,
lts-slim 則不引入工具,為的是減少 Container 執行環境的大小,像是如果是 Production 環境就不需要開發環境,兩者是類似的原理。


上一篇
D11 - 團隊觀戰區爬蟲 v2
下一篇
D13 - NGINX Image
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言