docker info
docker info 包含了存储驱动和 docker 根目录的信息。
Docker 镜像和容器的存储路径
Docker 容器由网络文件、卷和镜像组成。Docker 文件的存储路径取决于你的操作系统。常用操作系统中的路径如下:
- Ubuntu: /var/lib/docker/
- Fedora: /var/lib/docker/
- Debian: /var/lib/docker/
- Windows: C:\ProgramData\DockerDesktop
- MacOS: ~/Library/Containers/com.docker.docker/Data/vms/0/~
在 macOS 和 Windows 系统中,Docker 在一个虚拟机中运行 Linux 容器。关于这两种情况,你需要了解一些额外信息。
Mac 系统中的 Docker
Docker 在 Mac 系统中并不是原生兼容的,所以需要使用 Hyperkit 来运行虚拟机。虚拟机数据存储在:
/Library/Containers/com.docker.docker/Data/vms/0
在虚拟机内部,Docker 的路径是默认的 /var/lib/docker。
在虚拟机中创建一个 shell 窗口来查看 Docker 根目录:
可以按下 Ctrl+a,k,y 组合键来结束会话。
Windows 系统中的 Docker
Windows 系统中,Docker 比较复杂,因为有类似于 Linux 容器的原生 Windows 容器,也有运行在基于 Hyper-V 的最小虚拟机中的 Linux 容器。
配置信息和运行 linux 镜像的虚拟机存储在默认的 Docker 根目录。
C:\ProgramData\DockerDesktop
案例说明
下面以linux centos的nginx容器为例:
查看常规镜像的信息,会得到 linux 系统中的路径,如:
通过docker inspect nginx查看nginx容器的相关文件系统信息。
- Client:docker 客户端信息
- Server:docker 服务端信息
- Containers:容器数量
- Images:镜像数量
- Server Version:docker 版本
- Docker Root Dir:docker 根目录
- Registry Mirrors:当前使用的镜像源
Centos发行版的overlay2文件系统进行介绍,其实不管是什么发行版,其原理都如出一辙,GraphDriver
从上述图中可以看到三个层结构,即lowerdir、upperdir、merged层
对应的,使用docker inspect [容器ID]就可以看到这几个层所在的位置:
lowerdir层:
nginx容器的lowerdir层:
"LowerDir": "/var/lib/docker/overlay2/d5c972383761dd1987ab782f7edc93af8db773ec440df4de3ccdce21cc0adbd3-init/diff:/var/lib/docker/overlay2/5247d16b7172758cd378ec7bff7abe47efc0b89cdb14dc461b1f46f1e0cff023/diff:/var/lib/docker/overlay2/286bd6e507297e4f949386a674862d396fcc0436964eb279c4a403eeddc9479e/diff:/var/lib/docker/overlay2/7fe5d8e1e6fd689a423a8709a634cc7c0dfdfda0ea9b07710a20eac61f46be66/diff:/var/lib/docker/overlay2/52015973ea4520bdf1d2fc105de7ad06e0571796b63457e4e128d88bf6aa97ab/diff:/var/lib/docker/overlay2/215bc1e1da2d5b143d3f5a2cd5eeaf1304ac9365f04819a85ed8989d7ec63f7a/diff:/var/lib/docker/overlay2/0ded47b5e9ec41baf32147c95e212266993d02241341dabe8b79fa3c2b859b61/diff",
其中lowerdir是只读的镜像层(image layer),其中就包含bootfs/rootfs层,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,当boot成功 kernel 被加载到内存中,bootfs就被umount了,rootfs(root file system)包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录。
lowerdir是可以分很多层的,除了bootfs/rootfs层以外,还可以通过Dockerfile建立很多image层,构建过程如下:
Dockerfile中每一个指令都会生成一个新的image层,如上图所示。
当FROM时就已经生成了bootfs/rootfs层,也就是kernel和base层。
upperdir层
upperdir层是lowerdir的上一层,只有这一层可读可写的,其实就是Container层,在启动一个容器的时候会在最后的image层的上一层自动创建,所有对容器数据的更改都会发生在这一层。
进入upperdir层:cd /var/lib/docker/overlay2/d5c972383761dd1987ab782f7edc93af8db773ec440df4de3ccdce21cc0adbd3/diff
tree ./var
merged层
merged层就是联合挂载层,也就是给用户暴露的统一视觉,将image层和container层结合,就如最上边的图中描述一致,同一文件,在此层会展示离它最近的层级里的文件内容,或者可以理解为,只要container层中有此文件,便展示container层中的文件内容,若container层中没有,则展示image层中的。