docker info

docker info 包含了存储驱动和 docker 根目录的信息。

[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
compose: Docker Compose (Docker Inc., v2.14.1)
scan: Docker Scan (Docker Inc., v0.23.0)Server:
Containers: 6
Running: 4
Paused: 0
Stopped: 2
Images: 8
Server Version: 20.10.22
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9ba4b250366a5ddde94bb7c9d1def331423aa323
runc version: v1.1.4-0-g5fd4c4d
init version: de40ad0
Security Options:
seccomp
Profile: default
cgroupns
Kernel Version: 5.14.0-210.el9.x86_64
Operating System: CentOS Stream 9
OSType: linux
Architecture: x86_64
CPUs: 12
Total Memory: 15.36GiB
Name: localhost.localdomain
ID: ASDS:FS3Z:YDA3:M3S5:6V4D:YJN4:5PUH:HSWP:RUT5:V37H:FOPC:P7RF
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

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 根目录:

$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

可以按下 Ctrl+aky 组合键来结束会话。

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:当前使用的镜像源 

Docker 镜像和容器的存储路径_docker

Centos发行版的overlay2文件系统进行介绍,其实不管是什么发行版,其原理都如出一辙,GraphDriver

Docker 镜像和容器的存储路径_Docker_02

从上述图中可以看到三个层结构,即lowerdir、upperdir、merged层

对应的,使用docker inspect [容器ID]就可以看到这几个层所在的位置:

},
"GraphDriver": {
"Data": {
"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",
"MergedDir": "/var/lib/docker/overlay2/d5c972383761dd1987ab782f7edc93af8db773ec440df4de3ccdce21cc0adbd3/merged",
"UpperDir": "/var/lib/docker/overlay2/d5c972383761dd1987ab782f7edc93af8db773ec440df4de3ccdce21cc0adbd3/diff",
"WorkDir": "/var/lib/docker/overlay2/d5c972383761dd1987ab782f7edc93af8db773ec440df4de3ccdce21cc0adbd3/work"
},
"Name": "overlay2"
},
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层,构建过程如下:

Docker 镜像和容器的存储路径_Docker_03

Dockerfile中每一个指令都会生成一个新的image层,如上图所示。

当FROM时就已经生成了bootfs/rootfs层,也就是kernel和base层。

upperdir层

upperdir层是lowerdir的上一层,只有这一层可读可写的,其实就是Container层,在启动一个容器的时候会在最后的image层的上一层自动创建,所有对容器数据的更改都会发生在这一层。

进入upperdir层:cd /var/lib/docker/overlay2/d5c972383761dd1987ab782f7edc93af8db773ec440df4de3ccdce21cc0adbd3/diff

Docker 镜像和容器的存储路径_Docker_04

tree ./var

Docker 镜像和容器的存储路径_d3_05

Docker 镜像和容器的存储路径_Docker_06

merged层

merged层就是联合挂载层,也就是给用户暴露的统一视觉,将image层和container层结合,就如最上边的图中描述一致,同一文件,在此层会展示离它最近的层级里的文件内容,或者可以理解为,只要container层中有此文件,便展示container层中的文件内容,若container层中没有,则展示image层中的。