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
相关推荐
lendq6 小时前
k8s-第二节-常用操作
docker·容器·kubernetes
爱技术的小伙子8 小时前
Docker容器基础:Docker的安装与基本使用
linux·运维·服务器·docker
大卫小东(Sheldon)12 小时前
在Docker中搭建rabbit MQ集群 (Mac + OrbStack)
docker
Java追光着12 小时前
谷粒商城学习-10-docker安装mysql
学习·mysql·docker·谷粒商城
小宏运维有点菜12 小时前
docker
运维·docker·容器
孤城28613 小时前
08 docker Registry搭建docker私仓
运维·docker·容器·devops
明明跟你说过13 小时前
无服务器【Serverless】架构的深度剖析:组件介绍、优缺点与适用场景
微服务·云原生·容器·架构·serverless·运维开发·无服务器
Cherry Xie14 小时前
k8s常见组件之Kube-apiserver
云原生·容器·kubernetes
宿昔不梳一苦十年寒窗14 小时前
docker 安装 nacos
运维·docker·容器
不吃饭的猪16 小时前
【无标题】
java·开发语言·docker