天天看點

誰用光了磁盤?Docker System指令詳解

<b>本文講的是誰用光了磁盤?Docker System指令詳解,</b>

為了保證可讀性,本文采用意譯而非直譯。

$ df -h

Filesystem Size Used Available Use% Mounted on

/dev/mapper/... 10.0G 443.3M 9.6G 4% /

tmpfs 60.0G 0 60.0G 0% /dev

tmpfs 60.0G 0 60.0G 0% /sys/fs/cgroup

/dev/xvda1 49.1G 3.7G 43.3G 8% /etc/resolv.conf

/dev/xvda1 49.1G 3.7G 43.3G 8% /etc/hostname

/dev/xvda1 49.1G 3.7G 43.3G 8% /etc/hosts

shm 64.0M 0 64.0M 0% /dev/shm

/dev/mapper/... 10.0G 443.3M 9.6G 4% /graph/overlay2

接下來編寫Dockerfile來建立一個鏡像。這個鏡像基于Alpine鏡像;鏡像将寫入3個随機的檔案,每個檔案1GB,檔案由dd指令生成;因為這個鏡像并沒有實際作用,是以CMD設為/bin/true。

FROM alpine

RUN dd if=/dev/zero of=1g1.img bs=1G count=1

RUN dd if=/dev/zero of=1g2.img bs=1G count=1

RUN dd if=/dev/zero of=1g3.img bs=1G count=1

CMD /bin/true

運作docker build -t test .即可建立鏡像,執行完成後将生成一個3GB的鏡像。

$ docker image ls

REPOSITORY TAG CREATED SIZE

test latest 38 seconds ago 3.23GB

alpine latest 5 weeks ago 3.99MB

不難了解,該鏡像占用了相應大小的磁盤空間。

Filesystem Size Used Available Use% Mounted on

/dev/mapper/... 10.0G 3.4G 6.5G 34% /

RUN echo foo

# RUN dd if=/dev/zero of=1g3.img bs=1G count=1

本來以為這樣可以節省1GB磁盤空間,然而實際情況更加糟糕!

/dev/mapper/... 10.0G 5.4G 4.5G 54% /

舊的Docker鏡像一直存在,最終磁盤空間會很快被用完。Docker 1.13引入了docker system df指令,類似于Linux上的df指令,用于檢視Docker的磁盤使用情況。

$ docker system df

TYPE TOTAL ACTIVE SIZE RECLAIMABLE

Images 3 0 5.373GB 5.373GB (100%)

Containers 0 0 0B 0B

Local Volumes 0 0 0B 0B

可知,執行個體上一共有3個Docker鏡像: apline鏡像,包含3個1GB随機檔案的鏡像以及包含2個1GB随機檔案的鏡像。這些鏡像占用了超過5GB磁盤空間。由于我們并沒有基于這些鏡像運作容器,是以它們都可以被删除,是以可回收的(RECLAIMABLE)磁盤空間為100%。使用docker run test運作test鏡像再檢視:

Images 3 1 5.373GB 3.225GB (60%)

Containers 1 0 0B 0B

現在情況就不同了,我運作了一個容器,它執行/bin/true之後就很快退出了。這個容器綁定了test鏡像,test鏡像被标記為活躍(active)因而不能被删除,這導緻可回收的磁盤空間變少了。

$ docker system prune

WARNING! This will remove:

- all stopped containers

- all volumes not used by at least one container

- all networks not used by at least one container

- all dangling images

Are you sure you want to continue? [y/N] y

Deleted Containers:

1cdf866157b4a97e151125af3c2a7f186a59b6f63807e2014ce1a00d68f44e1d

Deleted Images:

deleted: sha256:f59bb277...

deleted: sha256:695b8e70...

deleted: sha256:93b1cceb...

deleted: sha256:c74d6bcd...

deleted: sha256:df8b9bb1...

deleted: sha256:dfe8340f...

deleted: sha256:ce1ee654...

Total reclaimed space: 3.221GB

根據警告資訊可知,這個指令會删除所有關閉的容器以及dangling鏡像。示例中,含有3個1GB随機檔案的鏡像的名稱被占用了,名稱為:,為dangling鏡像,是以會被删除。同時,所有的中間鏡像也會被删除。這樣的話,一共3GB的磁盤空間被回收了!

更進一步,使用-a選項可以做深度清理。這時我們會看到更加嚴重的WARNING資訊:

$ docker system prune -a

- all images without at least one container associated to them

untagged: test:latest

deleted: sha256:c515ebfa2...

deleted: sha256:07302c011...

deleted: sha256:37c0c6474...

deleted: sha256:5cc2b6bc4...

deleted: sha256:b283b9c35...

deleted: sha256:8a8b9bd8b...

untagged: alpine:latest

untagged: alpine@sha256:58e1a1bb75db1...

deleted: sha256:4a415e366...

deleted: sha256:23b9c7b43...

Total reclaimed space: 2.151GB

這個指令将清理整個系統,并且隻會保留真正在使用的鏡像,容器,資料卷以及網絡,是以需要格外謹慎。比如,我們不能在生産環境中運作prune -a指令,因為一些備用鏡像(用于備份,復原等)有時候需要用到,如果這些鏡像被删除了,則運作容器時需要重新下載下傳。

此時,所有未綁定容器的鏡像将會被删除。由于第一次prune指令删除了所有容器,是以所有鏡像(它們沒有綁定任何容器)都會被删除。

Filesystem Size Used Available Use% Mounted on

/dev/mapper/... 10.0G 442.5M 9.6G 4% /

現在,已使用的磁盤空間又變成了4%。本文的示例隻是冰山一角,因為一旦我們運作了真正的容器,并且使用了Docker資料卷和Docker網絡,則磁盤空間将會更快用完。感興趣的話,可以檢視部落格最後的視訊(不要忘了訂閱!)。在視訊中,我介紹一個簡單的WordPress應用,它由數個容器,資料卷以及網絡構成。這個應用可以很快地消耗掉磁盤空間,我将介紹如何處理這個問題。

<b></b>

<b>原文釋出時間為:2017年4月19日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>