问题描述
在使用Docker时有关于Docker容器占用空间的疑问。他注意到当列出Docker镜像时,可以看到它们的大小。然而,Docker容器在运行时并没有显示出占用的空间。用户想知道在创建容器时,Docker是否实际克隆了镜像,然后再启动容器?还是它是通过差异工作的,只存储镜像与当前容器磁盘状态之间的差异?另外,用户也想知道如何查看容器实际使用的磁盘空间。
解决方案
请注意以下操作可能会受版本差异影响,建议做好备份操作。
Docker 容器是基于分层文件系统构建的。这意味着容器不会在磁盘上完全克隆镜像,而是通过在基础镜像上叠加文件系统来创建容器。容器只会占用额外的空间,用于存储在运行时创建或下载的文件、对象等,这些不属于基础镜像的内容。
当你运行一个基础镜像为1GB大小的容器时,Docker并不会消耗100GB的磁盘空间。因为 Docker 使用分层文件系统,多个容器共享相同的顶层不可变(immutable)层。所以,每个容器只会占用额外的空间,用于存储与基础镜像不同的部分。
当你停止并删除容器(可以使用 docker rm
命令,或在运行 docker run
命令时使用 --rm
标志),相应的空间会被释放。
要查看容器(以及其他对象)使用的磁盘空间,你可以使用以下命令:
$ docker system df
这会显示出 Docker 使用的磁盘空间情况,包括镜像、容器、本地卷等等。你可以使用 docker system df -v
命令来查看更详细的信息。
初始状态下,当你启动一个容器时,SIZE
列可能会显示为 0B,但是一旦你开始在容器内写入数据,SIZE
列的值就会发生变化,表示容器占用的磁盘空间增加。
如果你想查看特定容器使用的磁盘空间,你可以通过 docker container inspect
命令来获取该容器的详细信息,包括文件系统的使用情况。以下是一个示例命令:
$ docker container inspect <container_id> --format '{{json .GraphDriver}}' | jq .
在上面的命令中,你需要将 <container_id>
替换为实际的容器ID。这将输出容器使用的文件系统路径,你可以使用标准的磁盘占用命令(如 du
)来查看实际使用的空间。
需要注意的是,Docker 容器的实际磁盘空间使用情况是包括容器内的文件系统更改的,因为分层文件系统采用写时复制机制,每次对文件进行更改时,实际上会将文件从底层复制到容器特定的文件系统中。此外,Docker 也会保留容器的日志、标准输出和错误输出,默认情况下这些日志是不受限制的。
总之,Docker 容器在运行时会根据你的工作负载和应用程序占用一些空间,但是它们的实际磁盘使用是基于分层文件系统,只会占用额外的空间来存储在运行时产生的更改。你可以使用上述命令来查看容器的磁盘使用情况。