目录
[1. Docker Volumes](#1. Docker Volumes)
[2. Bind Mounts](#2. Bind Mounts)
[@ 对比总结](#@ 对比总结)
[3. tmpfs Mounts](#3. tmpfs Mounts)
[4. Docker Storage Plugins](#4. Docker Storage Plugins)
[5. Kubernetes Persistent Volumes](#5. Kubernetes Persistent Volumes)
[6. Network Attached Storage (NAS) 和 Storage Area Network (SAN)](#6. Network Attached Storage (NAS) 和 Storage Area Network (SAN))
1. Docker Volumes
使用存储卷进行存储持久化
特点
- 独立于容器生命周期:Volumes 存储的数据独立于容器生命周期,即使容器被删除,数据依然保留。
- 管理便捷:Docker 提供了一些命令用于管理 Volumes,比如创建、删除、列出等。
- 存储位置 :Volumes 存储在 Docker 的管理目录下(通常是
/var/lib/docker/volumes/
),用户无需关心具体路径。 - 支持跨平台:Volumes 在不同的操作系统和 Docker 环境中具有一致的行为。
- 备份和恢复:Volumes 容易备份和恢复,因为它们独立于容器且由 Docker 管理。
示例
#创建 Volume:
[root@rockylinux docker]# docker volume create addvimubuntu
addvimubuntu
-----------------------------------------------------
#查看卷详细信息
[root@rockylinux docker]# docker volume inspect addvimubuntu
[
{
"CreatedAt": "2024-07-01T19:32:05+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/addvimubuntu/_data",
"Name": "addvimubuntu",
"Options": null,
"Scope": "local"
}
]
-----------------------------------------------------
#运行容器并挂载 Volume:
[root@rockylinux docker]# docker run -d -it --volume addvimubuntu:/opt --name vim_demo registry.cn-hangzhou.aliyuncs.com/fujiangdocker2022/addvimubuntu:v1 /bin/bash
root@0f3f450684ed:/opt# touch 1.txt
root@0f3f450684ed:/opt# echo 1.txt > 1.txt
root@0f3f450684ed:/opt# echo hello > 2.txt
[root@rockylinux _data]# pwd
/var/lib/docker/volumes/addvimubuntu/_data
[root@rockylinux _data]# ls
1.txt 2.txt
-----------------------------------------------------
#列出 Volumes:
docker volume ls/list
-----------------------------------------------------
#删除 Volume:
[root@rockylinux _data]# docker volume rm addvimubuntu
# 删除 Volume(需要先停止和删除相关容器)
docker stop <container_id>
2. Bind Mounts
使用宿主机本地目录进行存储持久化
特点
- 直接使用宿主机目录:Bind Mounts 直接将宿主机的一个目录挂载到容器内的一个目录。
- 高灵活性:可以选择任意的宿主机目录进行挂载。
- 依赖于宿主机文件系统结构:由于直接使用宿主机的路径,Bind Mounts 的行为依赖于宿主机的文件系统结构和权限。
- 性能更高:因为直接访问宿主机文件系统,性能可能会更高,特别是在高 I/O 场景下。
- 需要更高的权限管理:由于直接访问宿主机目录,容易出现权限问题和安全风险。
- 共享和重用,数据卷可以在容器之间共享或重用数据
容器数据卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。
特性:卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
示例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
Docker挂载主机目录,可能会出现报错:cannot open directory .: Perission denied
。
解决方案:在命令中加入参数 --privileged=true
。
CentOS7安全模块比之前系统版本加强,不安全的会先禁止,目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了。如果要开启,一般使用 --privileged=true
,扩大容器的权限解决挂载没有权限的问题。也即使用该参数,容器内的root才拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限(不能读写)。
运行一个带有容器卷存储功能的容器实例:
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名
可以使用docker inspect 容器id
查看容器绑定的数据卷。
权限:
-
rw
:读写 (默认)ro
:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取。
容器卷的继承:
# 启动一个容器
docker run -it --privileged=true /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash
# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
--volumes-from 父类
这个选项允许新的容器从另一个已经存在的容器(称为"父类"容器)中挂载卷。换句话说,新容器将继承"父类"容器的卷,并且可以访问这些卷中的数据
u2 容器将能够访问和使用 u1 容器中的 卷
继承的是挂载的规则,即使u1挂了也不会影响u2,容器之间独立。(u1恢复也不会影响)用于容器之间的共享
[root@rockylinux dockerdata]# docker run -it --privileged=true --volumes-from test3 --name test4 ubuntu
root@46c9ab85245e:/# cd /opt
root@46c9ab85245e:/opt# ls
fujiang.txt love.txt mount.test test.txt test3.txt
@ 对比总结
|-----------|---------------------------------------------|-------------------|
| 特性 | Docker Volumes | Bind Mounts |
| 存储位置 | Docker 管理的存储位置(如 /var/lib/docker/volumes
) | 宿主机上的指定路径 |
| 独立于容器生命周期 | 是 | 否 |
| 管理便捷性 | 高(Docker 提供了专门的管理命令) | 低(需要手动管理宿主机目录) |
| 跨平台一致性 | 是 | 否(依赖于宿主机文件系统) |
| 性能 | 较高 | 高(直接访问宿主机文件系统) |
| 权限管理 | 简单 | 复杂(需管理宿主机文件系统的权限) |
3. tmpfs Mounts
tmpfs Mounts 将数据存储在宿主机的内存中,而不是物理磁盘上。这种方法适用于需要快速访问且数据不需要持久化的场景,例如缓存。
docker run -d --tmpfs /path/in/container my_image
4. Docker Storage Plugins
Docker 允许使用第三方存储插件,以便与外部存储系统(如 NFS、Ceph、GlusterFS 等)集成。这些插件提供了更高级的存储功能,如分布式存储、数据冗余和高可用性。
安装存储插件后,可以像使用 Volumes 一样使用这些插件提供的存储。
docker volume create --driver <plugin_name> my_volume
docker run -d -v my_volume:/path/in/container my_image
5. Kubernetes Persistent Volumes
在 Kubernetes 环境中,持久化存储通常使用 Persistent Volumes(PV)和 Persistent Volume Claims(PVC)来管理。PV 是集群中的存储资源,而 PVC 是用户对 PV 的请求。
定义 Persistent Volume(PV):
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
定义 Persistent Volume Claim(PVC):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
使用 PVC:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- mountPath: "/path/in/container"
name: my-volume
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
6. Network Attached Storage (NAS) 和 Storage Area Network (SAN)
在企业环境中,使用 NAS 或 SAN 设备提供集中化存储是常见的做法。这些设备可以通过 NFS、iSCSI 等协议与容器进行连接,实现数据的集中存储和管理。
在宿主机上挂载 NAS 或 SAN 存储,然后将其挂载到容器中:
mount -t nfs <nas_server>:/path/on/nas /mnt/nas
docker run -d -v /mnt/nas:/path/in/container my_image