Docker 存储可以分为分层文件系统和卷(Volume),Docker支持多个存储引擎,每个存储引擎都是以Linux 文件系统为基础的。本文主要介绍 Docker 存储及卷(Volume)。

1、存储驱动(Storage Drivers)

Docker有多个存储驱动程序,仅允许其中一个使用底层存储设备。支持的存储驱动以及存储驱动所使用的技术如下:

存储驱动

技术

overlay or overlay2

OverlayFS

aufs

AUFS

brtfs

Btrfs

devicemanager

Device Manager

vfs

VFS

zfs

ZFS

1)AUFS

AUFS 是一种 Union File System(联合文件系统),又叫 Another UnionFS、Alternative UnionFS、Advance UnionFS。UnionFS是把不同物理位置的目录合并mount到同一个目录中。

2)Devicemapper

Device Mapper是一个基于kernel的框架,增强了很多Linux上的高级卷管理技术。Docker的devicemapper驱动在镜像和容器管理上,利用该框架的超配和快照功能。devicemapper是指Docker的存储驱动。

3)Btrfs

Btrfs是下一代的copy-on-write文件系统,它支持许多先进的存储技术,使它非常适合Docker。 Btrfs包含在主线Linux内核中。 Docker的btrfs存储驱动程序利用了许多btrfs特性来管理映像和容器。 这些特性包括块级操作、精简配置、写时复制快照和易于管理。可以轻松地将多个物理块设备组合成一个Btrfs文件系统。

4)Ovelay

OverlayFS是一个类似于AUFS 的现代联合文件系统,但更快,实现更简单。Docker为OverlayFS提供了一个存储驱动程序。OverlayFS是内核提供的文件系统,overlay和overlay2是docker提供的存储驱动

5)VFS

VFS存储驱动程序非联合文件系统。每一层都是磁盘上的目录,并且不支持写时复制。如创建一个新层,则需要对上一层进行“深度复制”。与其他存储驱动程序相比,相对较低的性能和更多的磁盘空间使用。但它健壮,稳定的,并可以在每种环境下工作。在测试环境中,还可以用作验证其他存储后端所依据的机制。

6)ZFS

ZFS是下一代文件系统,支持许多高级存储技术,如卷管理、快照、校验和、压缩和重复数据删除、复制等。
它是由Sun Microsystems(现在的Oracle Corporation)创建的,并在CDDL许可下开放源代码。 由于CDDL和GPL之间的许可不兼容,ZFS不能作为主流Linux内核的一部分发布。 但是,ZFS On Linux (ZoL)项目提供了一个超出树的内核模块和用户空间工具,可以单独安装它们。
Linux上的ZFS (ZoL)端口是健康和成熟的。 但是,目前不建议在生产环境中使用zfs Docker存储驱动程序,除非对Linux上的zfs有丰富的经验。

7)查看Docker使用的存储驱动

使用docker info 命令可以查看当前所使用存储驱动。

2、数据卷(Data Volumes)

数据卷(Data Volumes)就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统(Union File System),可以提供一些用于持续持久化存储或共享数据。完全独立于容器的生存周期,docker容器删除时,不会删除其挂载的数据卷。

宿主机挂载到容器有三种方式:

1)Volume

普通数据卷,映射到/var/lib/docker/volumes目录下。

2)bind mounts

绑定数据卷,映射到宿主机指定路径下。

3)tmpfs mounts

临时卷,只存在于宿主机内存中。

3、普通数据卷(Volume)

1)创建Volume

docker volume create volumeName

例如,

docker volume create ubuntu_volume

2)查看所有数据卷

查看所有数据卷可以使用命令如下:

docker volume ls

3)查看指定数据卷详细信息

$ docker volume inspect ubuntu_volume
[
    {
        "CreatedAt": "2021-11-19T19:21:14+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/ubuntu_volume/_data",
        "Name": "ubuntu_volume",
        "Options": {},
        "Scope": "local"
    }
]

注意:通过上面示例可以看出,普通数据卷是存储在/var/lib/docekr/volumes/目录。

4)挂载数据卷到容器

创建容器时,使用--mount选项,可以挂载普通卷,如下:

docker run -itd -p 88:80 --mount type=volume,source=ubuntu_volume,target=/usr/share/nginx/html nginx

注意:使用docker inspect查看容器挂载信息。

5)删除清理券

容器被删除之后,数据卷还是存在的,不会被删除。需要删除数据或不再使用本地容器卷,可以手动删除数据券。如下,

docker volume rm volumeName

例如,

docker volume rm ubuntu_volume

4、绑定数据卷(bind mounts)

绑定数据卷可以在创建容器时,使用--mount选项,指定宿主机目录,或者也可以使用之前支持的-v参数指定映射目录关系。如下,

docker run -itd -p 81:80 --mount type=bind,source=/home/web,target=/usr/share/nginx/html nginx

或者

docker run -itd -p 81:80 -v /home/web:/usr/share/nginx/html nginx

注意:使用docker inspect查看容器挂载信息。

5、临时卷(tmpfs mounts)

临时卷可以在创建容器时,使用--mount选项,可以挂载临时卷,如下,

docker run -itd --mount type=tmpfs,target=/mydata ubuntu:18.04

注意:如有安全或其他原因,不想将数据持久化到容器或宿主机上,则可以使用tmpfs mounts模式。

推荐文档