07 docker 容器存储持久化

目录

[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

使用存储卷进行存储持久化

特点
  1. 独立于容器生命周期:Volumes 存储的数据独立于容器生命周期,即使容器被删除,数据依然保留。
  2. 管理便捷:Docker 提供了一些命令用于管理 Volumes,比如创建、删除、列出等。
  3. 存储位置 :Volumes 存储在 Docker 的管理目录下(通常是/var/lib/docker/volumes/),用户无需关心具体路径。
  4. 支持跨平台:Volumes 在不同的操作系统和 Docker 环境中具有一致的行为。
  5. 备份和恢复: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

使用宿主机本地目录进行存储持久化

特点
  1. 直接使用宿主机目录:Bind Mounts 直接将宿主机的一个目录挂载到容器内的一个目录。
  2. 高灵活性:可以选择任意的宿主机目录进行挂载。
  3. 依赖于宿主机文件系统结构:由于直接使用宿主机的路径,Bind Mounts 的行为依赖于宿主机的文件系统结构和权限。
  4. 性能更高:因为直接访问宿主机文件系统,性能可能会更高,特别是在高 I/O 场景下。
  5. 需要更高的权限管理:由于直接访问宿主机目录,容易出现权限问题和安全风险。
  6. 共享和重用,数据卷可以在容器之间共享或重用数据

容器数据卷就是目录或文件,存在于一个或多个容器中,由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
相关推荐
alden_ygq36 分钟前
K8S Svc Port-forward 访问方式
云原生·容器·kubernetes
hwj运维之路37 分钟前
k8s监控方案实践(二):集成Alertmanager告警与钉钉Webhook通知
云原生·容器·kubernetes
心动啊1212 小时前
docker常用命令总结
docker·容器·eureka
python算法(魔法师版)2 小时前
Docker容器启动失败?无法启动?
linux·运维·nginx·docker·容器
不学无术の码农7 小时前
Ubuntu 22.04 (WSL2) 上使用 Docker 安装 Nacos 3.0.0
ubuntu·docker
AnnyYoung9 小时前
从Dockerfile 构建docker镜像——保姆级教程
docker·容器·eureka
慧一居士9 小时前
Docker Compose 的详细使用总结、常用命令及配置示例
容器·架构
何怀逸9 小时前
安装 Docker
运维·docker·容器
码码哈哈0.09 小时前
2025最新:3分钟使用Docker快速部署单节点Redis
redis·docker·eureka
云攀登者-望正茂9 小时前
通过Kubernetes 外部 DNS控制器来自动管理Azure DNS 和 AKS
容器·kubernetes·azure