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
相关推荐
鸠摩智首席音效师3 小时前
Docker 中如何限制CPU和内存的使用 ?
docker·容器
Michaelwubo3 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
jingyu飞鸟3 小时前
centos-stream9系统安装docker
linux·docker·centos
好像是个likun3 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
装不满的克莱因瓶4 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
来一杯龙舌兰5 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
玖疯子6 小时前
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
docker
暴富的Tdy6 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
Karoku0666 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
豆豆豆豆变7 小时前
docker之compose篇
docker·容器·自动化运维