1. 程式人生 > >誰用光了磁碟?Docker System命令詳解

誰用光了磁碟?Docker System命令詳解

譯者按: Docker映象,容器,資料卷以及網路都會佔用主機的磁碟空間,這樣的話,磁碟很容易就會被用完。這篇部落格介紹了一個簡單的解決方案 - Docker System命令

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

用了一段時間Docker後,會發現它佔用了不少硬碟空間。還好Docker 1.13引入瞭解決方法,它提供了簡單的命令來檢視/清理Docker使用的磁碟空間。

本文通過一個簡單的示例,可以證明Docker能夠很快地將磁碟佔滿。該示例通過play-with-docker.com執行。點選Add new instance即可建立新的例項,該例項安裝了最新版的Docker 17.03。這篇部落格主要討論磁碟空間,那麼不妨使用df命令檢視磁碟的初始狀態:

$ 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.1
G 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

可知,在新建立的play-with-docker.com例項,一共有10GB磁碟空間,其中接近500MB已被佔用。

接下來編寫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
不難理解,該映象佔用了相應大小的磁碟空間。
$ df -h
Filesystem        Size       Used Available Use% Mounted on
/dev/mapper/...   10.0G      3.4G      6.5G  34% /

若只寫入2個隨機檔案,則需要修改Dockerfile,刪掉一行。為了避免構建映象時使用快取,我在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
本來以為這樣可以節省1GB磁碟空間,然而實際情況更加糟糕!
$ 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
可知,例項上一共有3個Docker映象: apline映象,包含3個1GB隨機檔案的映象以及包含2個1GB隨機檔案的映象。這些映象佔用了超過5GB磁碟空間。由於我們並沒有基於這些映象執行容器,所以它們都可以被刪除,所以可回收的(RECLAIMABLE)磁碟空間為100%。使用**docker run test**執行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

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

現在來清理一下磁碟空間。Docker提供了docker system prune,可以用於清理dangling映象(參考What are Docker : images?)和容器,以及失效的資料卷和網路。

$ 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
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: [email protected]:58e1a1bb75db1...
deleted: sha256:4a415e366...
deleted: sha256:23b9c7b43...
Total reclaimed space: 2.151GB

這個命令將清理整個系統,並且只會保留真正在使用的映象,容器,資料卷以及網路,因此需要格外謹慎。比如,我們不能在生產環境中執行prune -a命令,因為一些備用映象(用於備份,回滾等)有時候需要用到,如果這些映象被刪除了,則執行容器時需要重新下載。

此時,所有未繫結容器的映象將會被刪除。由於第一次prune命令刪除了所有容器,因此所有映象(它們沒有繫結任何容器)都會被刪除。

$ df -h
Filesystem          Size      Used Available Use% Mounted on
/dev/mapper/...    10.0G    442.5M      9.6G   4% /

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

歡迎加入我們FundebugDocker技術交流群: 305097057

相關推薦

磁碟Docker System命令

譯者按: Docker映象,容器,資料卷以及網路都會佔用主機的磁碟空間,這樣的話,磁碟很容易就會被用完。這篇部落格介紹了一個簡單的解決方案 - Docker System命令。 為了保證可讀性,本文采用意譯而非直譯。 用了一段時間Docker後,

磁盤?Docker System命令

network 清理 容器 查看 vol ner oci overlay asc 譯者按: Docker鏡像,容器,數據卷以及網絡都會占用主機的磁盤空間,這樣的話,磁盤很容易就會被用完。這篇博客介紹了一個簡單的解決方案 - Docker System命令。 原文: Wh

佔用這麼多磁碟空間?Docker System命令

用了一段時間Docker後,會發現它佔用了不少硬碟空間。還好Docker 1.13引入瞭解決方法,它提供了簡單的命令來檢視/清理Docker使用的磁碟空間。 本文通過一個簡單的示例,可以證明Docker能夠很快地將磁碟佔滿。該示例通過play-with-docker.com執行。點選Add new insta

Docker常用命令

nbsp 詳解 .cn 本地 test 並且 www 更多 top docker ps 查看當前正在運行的容器 docker ps -a 查看所有容器的狀態 docker start/stop id/name 啟動/停止某個容器 docker attach id 進

Linux 磁碟維護 : fsck 命令

fsck命令被用於檢查並且試圖修復檔案系統中的錯誤。當檔案系統發生錯誤四化,可用fsck指令嘗試加以修復。 語法 fsck(選項)(引數) 選項 -a:自動修復檔案系統,不詢問任何問題; -A:依照/etc/fstab配置檔案的內容,檢查檔案內所列的全部檔案系統; -

Linux 磁碟維護 : losetup 命令

Linux losetup命令用於設定迴圈裝置。 迴圈裝置可把檔案虛擬成區塊裝置,籍以模擬整個檔案系統,讓使用者得以將其視為硬碟驅動器,光碟機或軟碟機等裝置,並掛入當作目錄來使用。 語法 losetup [-d][-e <加密方式>][-o <平移數目

docker 操作命令

docker 有為數不多,但是足夠實用的命令 現已完成已有35個命令的完全翻譯講解 主要用於對docker容器做相應的操作 轉載請註明來自:簡果網 轉載請註明本文連結:docker 操作命令詳解[https://www.simapple.com/316.html]

docker build命令

docker build命令用於根據給定的Dockerfile和上下文以構建Docker映象。 docker build命令的使用格式:docker build [OPTIONS] <PATH | URL | -> 1. 常用選項說明--build-arg,設定

dockerdocker run命令

Docker run命令用於執行一個新容器,而啟動一個容器需要非常多的資訊,所以該命令的引數非常多,今天就詳細分析下該命令支援的引數。 首先看一下該命令的格式: Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG..

docker run 命令

在Docker中,run應該是使用者使用最多的命令了,很多讀者反饋不是很明白run命令的用法,而且相關的書籍、中文資料中對run命令的描述也不是非常完整,所以DockerOne組織翻譯了Docker官方的文件,以饗讀者。注意,本文基於最新的Docker 1.4文件翻譯。Docker會在隔離的容器中執行程序。當

Linux 磁碟管理 : stat 命令

[email protected]:<~>$ ls -al link_vim lrwxrwxrwx 1 yexiang yexiang 20 Jul 11 23:02 link_vim -> /home/yexiang/yxvim_[email protected]:&l

Linux 磁碟管理 : du 命令

Linux du命令也是檢視使用空間的,但是與df命令不同的是Linux du命令是檢視當前指定檔案或目錄(會遞迴顯示子目錄)佔用磁碟空間大小,還是和df命令有一些區別的. 1.命令格式: du [選項][檔案] 2.命令功能: 顯示每個檔案和目錄的磁碟使用空間。

DOCKER命令docker run 命令

docker run 命令可以新建並啟動一個容器。     他有幾個簡單的引數,此篇文章不做詳細說明,如果有興趣,請檢視本部落格另外一篇文章。   難點引數          -network     -network=bridge  預設選項,表示連線到預設的網橋。   

我的資料庫空間?

還有一個方法可以精確地統計出某張表格的空間使用量,那就是DBCC SHOWCONTIG(或者直接查詢系統管理檢視sys.dm_db_index_physical_stats)。它可以說是最精確的方法,可以告訴你某張表(或索引)用了多少頁面,多少區,甚至頁面上的平均資料量。從這些值可以算出一張表格佔用了多少空間

教你Cobra開發類似docker命令

目錄前言一、安裝二、初始化應用初始化專案建立入口檔案cmd/root.go建立主程式main.go三、如何自定義命令建立hello子命令建立version子命令四、如何設定flag選項全域性選項本地選項設定必填繫結配置五、如何設定arguments使用示例六、如何使用引數獲取flag引數獲取args引數七、如

top命令之深入CPU

綁核 top cpu top tasksettop命令之你不一定懂的cpu顯示信息http://www.cnblogs.com/wjoyxt/p/4918742.html理解CPU steal timehttp://blog.csdn.net/jessysong/article/details/7

docker命令

docker 雲計算 虛擬化 Docker常用命令詳解 docker ps 查看當前正在運行的容器 docker ps -a 查看所有容器的狀態 docker search seanlo 在docker index中搜索image(search) docker start/stop id/nam

第四課-第一講04_01_Linux戶管理命令

文件 his 同時 comment ash .... 登陸 name lin 第四課-第一講04_01_Linux用戶管理命令詳解1.useradd [option] USERNAME-u UID(大於500且沒使用過的)-c 用戶說明,COMMENT-d 家目錄 HOME

rsync命令、rsyncssh隧道方式同步

命令 針對 添加 ssh root res 方式 author 設備文件 對待 ● rsync格式安裝命令 yum install -y rsync與scp的區別:scp復制為完全覆蓋,rsync為增量同步,只同步修改過的數據。rsync命令格式如下: rsync 選項

Linux命令-戶管理

用戶密碼 應該 分隔 user 鎖定 所有 密碼管理 沒有 new 1. 用戶管理1.Linux用戶管理linux有三類用戶: (1.)超級用戶 : root用戶具有操作系統的一切權限 uid=0 (2.)普通用戶: 具有操作系統有限的權限 uid=500-6000