在我的“系统学习Docker,践行DevOps理念”课程里,对于新手,我曾经说过,在玩docker的时候,尽量不要在自己电脑上(Mac或者windows)上直接安装docker和使用他,而是找一个虚拟机。Docker本身如果我们用的时间长了,会占用系统不少硬盘空间,特别是学习期间,今天拉一个image下来,明天又拉一个,今天建一个容器,明天建一个,久而久之,我们的电脑硬盘就吃紧了。如果是在虚拟机(vmware或者virtualbox),我们可以直接删除虚机,但是如果我们不想删除虚机,那如何清理docker所占的硬盘空间呢,本文我们一起来看看吧。 首先,我们先准备一台docker host,比如下面,我们通过df命令先看看系统当前的硬盘空间。
    1. [vagrant@localhost ~]$ docker version
    2. Client:
    3. Version: 18.05.0-ce
    4. API version: 1.37
    5. Go version: go1.9.5
    6. Git commit: f150324
    7. Built: Wed May 9 22:14:54 2018
    8. OS/Arch: linux/amd64
    9. Experimental: false
    10. Orchestrator: swarm
    11. Server:
    12. Engine:
    13. Version: 18.05.0-ce
    14. API version: 1.37 (minimum version 1.12)
    15. Go version: go1.9.5
    16. Git commit: f150324
    17. Built: Wed May 9 22:18:36 2018
    18. OS/Arch: linux/amd64
    19. Experimental: false
    20. [vagrant@localhost ~]$ df -h
    21. Filesystem Size Used Avail Use% Mounted on
    22. /dev/mapper/VolGroup00-LogVol00 38G 1.3G 37G 4% /
    23. devtmpfs 236M 0 236M 0% /dev
    24. tmpfs 245M 0 245M 0% /dev/shm
    25. tmpfs 245M 4.5M 240M 2% /run
    26. tmpfs 245M 0 245M 0% /sys/fs/cgroup
    27. /dev/sda2 1014M 63M 952M 7% /boot
    28. tmpfs 49M 0 49M 0% /run/user/1000
    29. tmpfs 49M 0 49M 0% /run/user/0
    30. [vagrant@localhost ~]$
    系统现在用了1.3G空间,还有37G可用空间。 首先我们先介绍一个命令,叫 docker system df ,我们看到目前我们没有任何镜像,容器,存储和cache。
    1. [vagrant@localhost ~]$ docker system df
    2. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    3. Images 0 0 0B 0B
    4. Containers 0 0 0B 0B
    5. Local Volumes 0 0 0B 0B
    6. Build Cache 0B 0B
    7. [vagrant@localhost ~]$
    我们拉一个image看看
    1. [vagrant@localhost ~]$ docker pull alpine
    2. Using default tag: latest
    3. latest: Pulling from library/alpine
    4. ff3a5c916c92: Pull complete
    5. Digest: sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
    6. Status: Downloaded newer image for alpine:latest
    7. [vagrant@localhost ~]$ docker system df
    8. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    9. Images 1 0 4.148MB 4.148MB (100%)
    10. Containers 0 0 0B 0B
    11. Local Volumes 0 0 0B 0B
    12. Build Cache 0B 0B
    13. [vagrant@localhost ~]$
    创建一个容器,退出,我们看到其实这个容器本身并不占空间
    1. [vagrant@localhost ~]$ docker run -d alpine
    2. 8b7f9b1e11b85c6d2335b17ea2c303cf500f2a19cccd57864fb1eeceb4021a5d
    3. [vagrant@localhost ~]$ docker system df
    4. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    5. Images 1 1 4.148MB 0B (0%)
    6. Containers 1 0 0B 0B
    7. Local Volumes 0 0 0B 0B
    8. Build Cache 0B 0B
    下面我们用Dockerfile基于alpine制作一个image,往这个image写入一个1G大小的文件,然后build完,我们看到系统空间多了1G,这个1G后面括号显示100%, 这个100%意思是,这个空间可以100%回收,怎么回收?把这个docker image删了就回收了。
    1. [vagrant@localhost ~]$ more Dockerfile
    2. FROM alpine
    3. RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    4. [vagrant@localhost ~]$ docker build -t test1 .
    5. Sending build context to Docker daemon 125.4kB
    6. Step 1/2 : FROM alpine
    7. ---> 3fd9065eaf02
    8. Step 2/2 : RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    9. ---> Running in 6d9e95f54e26
    10. 1+0 records in
    11. 1+0 records out
    12. Removing intermediate container 6d9e95f54e26
    13. ---> 4ebfe90ead11
    14. Successfully built 4ebfe90ead11
    15. Successfully tagged test1:latest
    16. [vagrant@localhost ~]$ docker system df
    17. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    18. Images 2 1 1.078GB 1.078GB (100%)
    19. Containers 1 0 0B 0B
    20. Local Volumes 0 0 0B 0B
    21. Build Cache 0B 0B
    22. [vagrant@localhost ~]$
    我们再修改下dockerfile,改成写2个1G的文件,然后重新build,我们看到系统的空间变成了之前的两倍,并没有变成3G,也就是它用了之前的image作为cache
    1. [vagrant@localhost ~]$ docker image ls
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. test1 latest 4ebfe90ead11 3 minutes ago 1.08GB
    4. alpine latest 3fd9065eaf02 4 months ago 4.15MB
    5. [vagrant@localhost ~]$ more Dockerfile
    6. FROM alpine
    7. RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    8. RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    9. [vagrant@localhost ~]$ docker build -t test1 .
    10. Sending build context to Docker daemon 125.4kB
    11. Step 1/3 : FROM alpine
    12. ---> 3fd9065eaf02
    13. Step 2/3 : RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    14. ---> Using cache
    15. ---> 4ebfe90ead11
    16. Step 3/3 : RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    17. ---> Running in 93929b2a75ce
    18. 1+0 records in
    19. 1+0 records out
    20. Removing intermediate container 93929b2a75ce
    21. ---> 9fbb2427fc1d
    22. Successfully built 9fbb2427fc1d
    23. Successfully tagged test1:latest
    24. [vagrant@localhost ~]$ docker image ls
    25. REPOSITORY TAG IMAGE ID CREATED SIZE
    26. test1 latest 9fbb2427fc1d 5 seconds ago 2.15GB
    27. alpine latest 3fd9065eaf02 4 months ago 4.15MB
    28. [vagrant@localhost ~]$ docker system df
    29. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    30. Images 2 1 2.152GB 2.152GB (100%)
    31. Containers 1 0 0B 0B
    32. Local Volumes 0 0 0B 0B
    33. Build Cache 0B 0B
    34. [vagrant@localhost ~]$
    但是有时候我们并不会这么幸运,假如我们的Dockerfile变成
    1. [vagrant@localhost ~]$ more Dockerfile
    2. FROM alpine
    3. RUN echo test
    4. RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    5. RUN dd if=/dev/zero of=1g3.img bs=1G count=1
    RUN echo test 的位置导致docker build image时候不会去使用之前的cache,那么灾难就来了。我们的image变成了3个,我们的系统空间占用变成了4G,之前的test1变成了一个, 这个僵尸image叫dangling images, 这时候怎么办呢?
    1. [vagrant@localhost ~]$ docker image ls
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. test1 latest 8c32028a8557 45 seconds ago 2.15GB
    4. <none> <none> 9fbb2427fc1d 5 minutes ago 2.15GB
    5. alpine latest 3fd9065eaf02 4 months ago 4.15MB
    6. [vagrant@localhost ~]$ docker system df
    7. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    8. Images 3 1 4.299GB 4.299GB (100%)
    9. Containers 1 0 0B 0B
    10. Local Volumes 0 0 0B 0B
    11. Build Cache 0B 0B
    12. [vagrant@localhost ~]$
    这时候,其实我们手动通过docker image rm可以删除这两个容器,从而释放空间。但是有点麻烦对吧。这时候我们可以试试一个命令

    <font style="color:rgb(28, 31, 33);background-color:rgb(248, 250, 252);">docker system prune</font>

    1. [vagrant@localhost ~]$ docker system prune
    2. WARNING! This will remove:
    3. - all stopped containers
    4. - all networks not used by at least one container
    5. - all dangling images
    6. - all build cache
    7. Are you sure you want to continue? [y/N] y
    8. Deleted Containers:
    9. 8b7f9b1e11b85c6d2335b17ea2c303cf500f2a19cccd57864fb1eeceb4021a5d
    10. Deleted Images:
    11. deleted: sha256:9fbb2427fc1dbaba37fd67a81f84970255e50325ea128aa06bcc60a138835ce8
    12. deleted: sha256:63f58c3c4640f0ed9b1d917e2f01b0ca461929768712a4c8899cbf3b27f0d716
    13. deleted: sha256:4ebfe90ead11af51f131372292709d590e4856bb6bf9855e1bd1e5b801920364
    14. deleted: sha256:45f5bb8b1109d2e61b2aa4ab2d392582cbe89bba99d2e3a3d15192500ed5d22c
    15. Total reclaimed space: 2.147GB
    16. [vagrant@localhost ~]$ docker system df
    17. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    18. Images 2 0 2.152GB 2.152GB (100%)
    19. Containers 0 0 0B 0B
    20. Local Volumes 0 0 0B 0B
    21. Build Cache 0B 0B
    22. [vagrant@localhost ~]$
    docker system prune会清理所有已停止的容器,没有被用的network,所有的僵尸image,还是build cache。能够迅速帮我们清理空间。 当然docker system prune 我们可以加一个 -a 参数,这个就厉害了,除了删除之前docker system prune能删除的东西以外,他还会删除所有没有容器使用的image,比如
    1. [vagrant@localhost ~]$ docker system prune -a
    2. WARNING! This will remove:
    3. - all stopped containers
    4. - all networks not used by at least one container
    5. - all images without at least one container associated to them
    6. - all build cache
    7. Are you sure you want to continue? [y/N] y
    8. Deleted Images:
    9. untagged: alpine:latest
    10. untagged: alpine@sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
    11. untagged: test1:latest
    12. deleted: sha256:8c32028a8557a1bdd9cc0bdba9b0bb6e9f3c52e139c62de166b24ac3b2abddab
    13. deleted: sha256:cf8eec9e8e0dfdb48a628e284a8bce27b5d6968e94baacc16ca47ef9d667dc82
    14. deleted: sha256:91e956dd9cf9f736e9b0ee7a7211e91b6858ad746d3b1cf7713e1492da575c04
    15. deleted: sha256:e7264a1948b8edae8f94172c5034d5223e4bf045d1d7eb00b431402d52528aec
    16. deleted: sha256:8bbc26e497f57eb0caef4a26a06333f32522ab0d8fae32637a5a85c2d477436e
    17. deleted: sha256:3fd9065eaf02feaf94d68376da52541925650b81698c53c6824d92ff63f98353
    18. deleted: sha256:cd7100a72410606589a54b932cabd804a17f9ae5b42a1882bd56d263e02b6215
    19. Total reclaimed space: 2.152GB
    20. [vagrant@localhost ~]$ docker system df
    21. TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    22. Images 0 0 0B 0B
    23. Containers 0 0 0B 0B
    24. Local Volumes 0 0 0B 0B
    25. Build Cache 0B 0B
    26. [vagrant@localhost ~]$
    test1这个好的image也被删了,因为没有容器使用它,所以 -a 参数要小心使用。