## How the `devicemapper` storage driver works
> [!WARNING]
> Do not directly manipulate any files or directories within
> `/var/lib/docker/`. These files and directories are managed by Docker.
Use the `lsblk` command to see the devices and their pools, from the operating
system's point of view:
```console
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 100G 0 disk
├─docker-thinpool_tmeta 253:0 0 1020M 0 lvm
│ └─docker-thinpool 253:2 0 95G 0 lvm
└─docker-thinpool_tdata 253:1 0 95G 0 lvm
└─docker-thinpool 253:2 0 95G 0 lvm
```
Use the `mount` command to see the mount-point Docker is using:
```console
$ mount |grep devicemapper
/dev/xvda1 on /var/lib/docker/devicemapper type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
```
When you use `devicemapper`, Docker stores image and layer contents in the
thinpool, and exposes them to containers by mounting them under
subdirectories of `/var/lib/docker/devicemapper/`.
### Image and container layers on-disk
The `/var/lib/docker/devicemapper/metadata/` directory contains metadata about
the Devicemapper configuration itself and about each image and container layer
that exist. The `devicemapper` storage driver uses snapshots, and this metadata
include information about those snapshots. These files are in JSON format.
The `/var/lib/docker/devicemapper/mnt/` directory contains a mount point for each image
and container layer that exists. Image layer mount points are empty, but a
container's mount point shows the container's filesystem as it appears from
within the container.
### Image layering and sharing
The `devicemapper` storage driver uses dedicated block devices rather than
formatted filesystems, and operates on files at the block level for maximum
performance during copy-on-write (CoW) operations.
#### Snapshots
Another feature of `devicemapper` is its use of snapshots (also sometimes called
_thin devices_ or _virtual devices_), which store the differences introduced in
each layer as very small, lightweight thin pools. Snapshots provide many
benefits:
- Layers which are shared in common between containers are only stored on disk
once, unless they are writable. For instance, if you have 10 different
images which are all based on `alpine`, the `alpine` image and all its
parent images are only stored once each on disk.
- Snapshots are an implementation of a copy-on-write (CoW) strategy. This means
that a given file or directory is only copied to the container's writable
layer when it is modified or deleted by that container.
- Because `devicemapper` operates at the block level, multiple blocks in a
writable layer can be modified simultaneously.
- Snapshots can be backed up using standard OS-level backup utilities. Just
make a copy of `/var/lib/docker/devicemapper/`.
#### Devicemapper workflow
When you start Docker with the `devicemapper` storage driver, all objects
related to image and container layers are stored in
`/var/lib/docker/devicemapper/`, which is backed by one or more block-level
devices, either loopback devices (testing only) or physical disks.
- The _base device_ is the lowest-level object. This is the thin pool itself.
You can examine it using `docker info`. It contains a filesystem. This base
device is the starting point for every image and container layer. The base
device is a Device Mapper implementation detail, rather than a Docker layer.
- Metadata about the base device and each image or container layer is stored in
`/var/lib/docker/devicemapper/metadata/` in JSON format. These layers are
copy-on-write snapshots, which means that they are empty until they diverge
from their parent layers.
- Each container's writable layer is mounted on a mountpoint in
`/var/lib/docker/devicemapper/mnt/`. An empty directory exists for each
read-only image layer and each stopped container.