譯者按: Docker鏡像,容器,數(shù)據(jù)卷以及網(wǎng)絡(luò)都會占用主機(jī)的磁盤空間,這樣的話,磁盤很容易就會被用完。這篇博客介紹了一個(gè)簡單的解決方案 - Docker System命令。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比紹興網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式紹興網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋紹興地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。原文: What’s eating my disk? Docker System Commands explained
為了保證可讀性,本文采用意譯而非直譯。
用了一段時(shí)間Docker后,會發(fā)現(xiàn)它占用了不少硬盤空間。還好Docker 1.13引入了解決方法,它提供了簡單的命令來查看/清理Docker使用的磁盤空間。
本文通過一個(gè)簡單的示例,可以證明Docker能夠很快地將磁盤占滿。該示例通過play-with-docker.com運(yùn)行。點(diǎn)擊Add new instance即可創(chuàng)建新的實(shí)例,該實(shí)例安裝了最新版的Docker 17.03。這篇博客主要討論磁盤空間,那么不妨使用df命令查看磁盤的初始狀態(tài):
$ 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
可知,在新創(chuàng)建的play-with-docker.com實(shí)例,一共有10GB磁盤空間,其中接近500MB已被占用。
接下來編寫Dockerfile來創(chuàng)建一個(gè)鏡像。這個(gè)鏡像基于Alpine鏡像;鏡像將寫入3個(gè)隨機(jī)的文件,每個(gè)文件1GB,文件由dd命令生成;因?yàn)檫@個(gè)鏡像并沒有實(shí)際作用,因此CMD設(shè)為/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
運(yùn)行docker build -t test .即可創(chuàng)建鏡像,執(zhí)行完成后將生成一個(gè)3GB的鏡像。
$ docker image ls
REPOSITORY TAG CREATED SIZE
test latest 38 seconds ago 3.23GB
alpine latest 5 weeks ago 3.99MB
不難理解,該鏡像占用了相應(yīng)大小的磁盤空間。
$ df -h
Filesystem Size Used Available Use% Mounted on
/dev/mapper/... 10.0G 3.4G 6.5G 34% /
若只寫入2個(gè)隨機(jī)文件,則需要修改Dockerfile,刪掉一行。為了避免構(gòu)建鏡像時(shí)使用緩存,我在dd命令之前添加了一行echo命令。
FROM alpine
RUN echo foo
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
本來以為這樣可以節(jié)省1GB磁盤空間,然而實(shí)際情況更加糟糕!
$ df -h
Filesystem Size Used Available Use% Mounted on
/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
可知,實(shí)例上一共有3個(gè)Docker鏡像: apline鏡像,包含3個(gè)1GB隨機(jī)文件的鏡像以及包含2個(gè)1GB隨機(jī)文件的鏡像。這些鏡像占用了超過5GB磁盤空間。由于我們并沒有基于這些鏡像運(yùn)行容器,所以它們都可以被刪除,所以可回收的(RECLAIMABLE)磁盤空間為100%。使用docker run test運(yùn)行test鏡像再查看:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 1 5.373GB 3.225GB (60%)
Containers 1 0 0B 0B
Local Volumes 0 0 0B 0B
現(xiàn)在情況就不同了,我運(yùn)行了一個(gè)容器,它執(zhí)行/bin/true之后就很快退出了。這個(gè)容器綁定了test鏡像,test鏡像被標(biāo)記為活躍(active)因而不能被刪除,這導(dǎo)致可回收的磁盤空間變少了。
現(xiàn)在來清理一下磁盤空間。Docker提供了docker system prune,可以用于清理dangling鏡像(參考What are Docker
$ 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
根據(jù)警告信息可知,這個(gè)命令會刪除所有關(guān)閉的容器以及dangling鏡像。示例中,含有3個(gè)1GB隨機(jī)文件的鏡像的名稱被占用了,名稱為
更進(jìn)一步,使用-a選項(xiàng)可以做深度清理。這時(shí)我們會看到更加嚴(yán)重的WARNING信息:
$ docker system prune -a
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 images without at least one container associated to them
Are you sure you want to continue? [y/N] y
Deleted Images:
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
這個(gè)命令將清理整個(gè)系統(tǒng),并且只會保留真正在使用的鏡像,容器,數(shù)據(jù)卷以及網(wǎng)絡(luò),因此需要格外謹(jǐn)慎。比如,我們不能在生產(chǎn)環(huán)境中運(yùn)行prune -a命令,因?yàn)橐恍﹤溆苗R像(用于備份,回滾等)有時(shí)候需要用到,如果這些鏡像被刪除了,則運(yùn)行容器時(shí)需要重新下載。
此時(shí),所有未綁定容器的鏡像將會被刪除。由于第一次prune命令刪除了所有容器,因此所有鏡像(它們沒有綁定任何容器)都會被刪除。
$ df -h
Filesystem Size Used Available Use% Mounted on
/dev/mapper/... 10.0G 442.5M 9.6G 4% /
現(xiàn)在,已使用的磁盤空間又變成了4%。本文的示例只是冰山一角,因?yàn)橐坏┪覀冞\(yùn)行了真正的容器,并且使用了Docker數(shù)據(jù)卷和Docker網(wǎng)絡(luò),則磁盤空間將會更快用完。感興趣的話,可以查看博客最后的視頻(不要忘了訂閱!)。在視頻中,我介紹一個(gè)簡單的WordPress應(yīng)用,它由數(shù)個(gè)容器,數(shù)據(jù)卷以及網(wǎng)絡(luò)構(gòu)成。這個(gè)應(yīng)用可以很快地消耗掉磁盤空間,我將介紹如何處理這個(gè)問題。
視頻: What's eating my disk?!Clean up your Docker System
Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了7億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!
轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/19/docker-system-explain/
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。