Docker——我們的硬盤空間去哪了?
對于新手,我曾經(jīng)說過,在玩docker的時候,盡量不要在自己電腦上(Mac或者windows)上直接安裝docker和使用他,而是找一個虛擬機。Docker本身如果我們用的時間長了,會占用系統(tǒng)不少硬盤空間,特別是學(xué)習(xí)期間,今天拉一個image下來,明天又拉一個,今天建一個容器,明天建一個,久而久之,我們的電腦硬盤就吃緊了。如果是在虛擬機(vmware或者virtualbox),我們可以直接刪除虛機,但是如果我們不想刪除虛機,那如何清理docker所占的硬盤空間呢,本文我們一起來看看吧。
首先,我們先準(zhǔn)備一臺docker host,比如下面,我們通過df命令先看看系統(tǒng)當(dāng)前的硬盤空間。
- [vagrant@localhost ~]$ docker version
- Client:
- Version: 18.05.0-ce
- API version: 1.37
- Go version: go1.9.5
- Git commit: f150324
- Built: Wed May 9 22:14:54 2018
- OS/Arch: linux/amd64
- Experimental: false
- Orchestrator: swarm
- Server:
- Engine:
- Version: 18.05.0-ce
- API version: 1.37 (minimum version 1.12)
- Go version: go1.9.5
- Git commit: f150324
- Built: Wed May 9 22:18:36 2018
- OS/Arch: linux/amd64
- Experimental: false
- [vagrant@localhost ~]$ df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/mapper/VolGroup00-LogVol00 38G 1.3G 37G 4% /
- devtmpfs 236M 0 236M 0% /dev
- tmpfs 245M 0 245M 0% /dev/shm
- tmpfs 245M 4.5M 240M 2% /run
- tmpfs 245M 0 245M 0% /sys/fs/cgroup
- /dev/sda2 1014M 63M 952M 7% /boot
- tmpfs 49M 0 49M 0% /run/user/1000
- tmpfs 49M 0 49M 0% /run/user/0
- [vagrant@localhost ~]$
系統(tǒng)現(xiàn)在用了1.3G空間,還有37G可用空間。
首先我們先介紹一個命令,叫 docker system df ,我們看到目前我們沒有任何鏡像,容器,存儲和cache。
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 0 0 0B 0B
- Containers 0 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
我們拉一個image看看
- [vagrant@localhost ~]$ docker pull alpine
- Using default tag: latest
- latest: Pulling from library/alpine
- ff3a5c916c92: Pull complete
- Digest: sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
- Status: Downloaded newer image for alpine:latest
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 1 0 4.148MB 4.148MB (100%)
- Containers 0 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
創(chuàng)建一個容器,退出,我們看到其實這個容器本身并不占空間
- [vagrant@localhost ~]$ docker run -d alpine
- 8b7f9b1e11b85c6d2335b17ea2c303cf500f2a19cccd57864fb1eeceb4021a5d
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 1 1 4.148MB 0B (0%)
- Containers 1 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
下面我們用Dockerfile基于alpine制作一個image,往這個image寫入一個1G大小的文件,然后build完,我們看到系統(tǒng)空間多了1G,這個1G后面括號顯示100%, 這個100%意思是,這個空間可以100%回收,怎么回收?把這個docker image刪了就回收了。
- [vagrant@localhost ~]$ docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- test1 latest 4ebfe90ead11 3 minutes ago 1.08GB
- alpine latest 3fd9065eaf02 4 months ago 4.15MB
- [vagrant@localhost ~]$ more Dockerfile
- FROM alpine
- RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- [vagrant@localhost ~]$ docker build -t test1 .
- Sending build context to Docker daemon 125.4kB
- Step 1/3 : FROM alpine
- ---> 3fd9065eaf02
- Step 2/3 : RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- ---> Using cache
- ---> 4ebfe90ead11
- Step 3/3 : RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- ---> Running in 93929b2a75ce
- 1+0 records in
- 1+0 records out
- Removing intermediate container 93929b2a75ce
- ---> 9fbb2427fc1d
- Successfully built 9fbb2427fc1d
- Successfully tagged test1:latest
- [vagrant@localhost ~]$ docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- test1 latest 9fbb2427fc1d 5 seconds ago 2.15GB
- alpine latest 3fd9065eaf02 4 months ago 4.15MB
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 2 1 2.152GB 2.152GB (100%)
- Containers 1 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
我們再修改下dockerfile,改成寫2個1G的文件,然后重新build,我們看到系統(tǒng)的空間變成了之前的兩倍,并沒有變成3G,也就是它用了之前的image作為cache
- [vagrant@localhost ~]$ more Dockerfile
- FROM alpine
- RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- [vagrant@localhost ~]$ docker build -t test1 .
- Sending build context to Docker daemon 125.4kB
- Step 1/2 : FROM alpine
- ---> 3fd9065eaf02
- Step 2/2 : RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- ---> Running in 6d9e95f54e26
- 1+0 records in
- 1+0 records out
- Removing intermediate container 6d9e95f54e26
- ---> 4ebfe90ead11
- Successfully built 4ebfe90ead11
- Successfully tagged test1:latest
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 2 1 1.078GB 1.078GB (100%)
- Containers 1 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
但是有時候我們并不會這么幸運,假如我們的Dockerfile變成
- [vagrant@localhost ~]$ more Dockerfile
- FROM alpine
- RUN echo test
- RUN dd if=/dev/zero of=1g3.img bs=1G count=1
- RUN dd if=/dev/zero of=1g3.img bs=1G count=1
RUN echo test 的位置導(dǎo)致docker build image時候不會去使用之前的cache,那么災(zāi)難就來了。我們的image變成了3個,我們的系統(tǒng)空間占用變成了4G,之前的test1變成了一個, 這個僵尸image叫dangling images, 這時候怎么辦呢?
- [vagrant@localhost ~]$ docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- test1 latest 8c32028a8557 45 seconds ago 2.15GB
- <none> <none> 9fbb2427fc1d 5 minutes ago 2.15GB
- alpine latest 3fd9065eaf02 4 months ago 4.15MB
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 3 1 4.299GB 4.299GB (100%)
- Containers 1 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
這時候,其實我們手動通過docker image rm可以刪除這兩個容器,從而釋放空間。但是有點麻煩對吧。這時候我們可以試試一個命令
- vagrant@localhost ~]$ docker system prune
- WARNING! This will remove:
- - all stopped containers
- - all networks not used by at least one container
- - all dangling images
- - all build cache
- Are you sure you want to continue? [y/N] y
- Deleted Containers:
- 8b7f9b1e11b85c6d2335b17ea2c303cf500f2a19cccd57864fb1eeceb4021a5d
- Deleted Images:
- deleted: sha256:9fbb2427fc1dbaba37fd67a81f84970255e50325ea128aa06bcc60a138835ce8
- deleted: sha256:63f58c3c4640f0ed9b1d917e2f01b0ca461929768712a4c8899cbf3b27f0d716
- deleted: sha256:4ebfe90ead11af51f131372292709d590e4856bb6bf9855e1bd1e5b801920364
- deleted: sha256:45f5bb8b1109d2e61b2aa4ab2d392582cbe89bba99d2e3a3d15192500ed5d22c
- Total reclaimed space: 2.147GB
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 2 0 2.152GB 2.152GB (100%)
- Containers 0 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
docker system prune會清理所有已停止的容器,沒有被用的network,所有的僵尸image,還是build cache。能夠迅速幫我們清理空間。
當(dāng)然docker system prune 我們可以加一個 -a 參數(shù),這個就厲害了,除了刪除之前docker system prune能刪除的東西以外,他還會刪除所有沒有容器使用的image,比如
- [vagrant@localhost ~]$ docker system prune -a
- WARNING! This will remove:
- - all stopped containers
- - all networks not used by at least one container
- - all images without at least one container associated to them
- - all build cache
- Are you sure you want to continue? [y/N] y
- Deleted Images:
- untagged: alpine:latest
- untagged: alpine@sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
- untagged: test1:latest
- deleted: sha256:8c32028a8557a1bdd9cc0bdba9b0bb6e9f3c52e139c62de166b24ac3b2abddab
- deleted: sha256:cf8eec9e8e0dfdb48a628e284a8bce27b5d6968e94baacc16ca47ef9d667dc82
- deleted: sha256:91e956dd9cf9f736e9b0ee7a7211e91b6858ad746d3b1cf7713e1492da575c04
- deleted: sha256:e7264a1948b8edae8f94172c5034d5223e4bf045d1d7eb00b431402d52528aec
- deleted: sha256:8bbc26e497f57eb0caef4a26a06333f32522ab0d8fae32637a5a85c2d477436e
- deleted: sha256:3fd9065eaf02feaf94d68376da52541925650b81698c53c6824d92ff63f98353
- deleted: sha256:cd7100a72410606589a54b932cabd804a17f9ae5b42a1882bd56d263e02b6215
- Total reclaimed space: 2.152GB
- [vagrant@localhost ~]$ docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 0 0 0B 0B
- Containers 0 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
- [vagrant@localhost ~]$
test1這個好的image也被刪了,因為沒有容器使用它,所以 -a 參數(shù)要小心使用。
好的,希望本文能幫助到大家。