docker存储管理

docker存储概念

容器本地存储与Docke存储驱动

容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存储驱动进行管理。

容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。

联合文件系统:Docker的一种底层技术,由存储驱动(Storage Driver)实现。相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。

存储驱动:控制镜像和容器在 docker 主机上的存储和管理方式。

每个Docker主机只能选择一种存储驱动,不能为每个容器选择不同的存储驱动。

查看主机支持的存储驱动
[root@localhost ~]# docker info
# 找到如下信息
 Storage Driver: overlay2           # 存储驱动是overlay2
  Backing Filesystem: xfs           # 底层文件系统是xfs
  Supports d_type: true             # 支持d_type
  Native Overlay Diff: true
  userxattr: false
更改现有的存储驱动

可以根据需要修改现有的存储驱动。

注意:

  • 一个主机只能选择一个存储驱动。
  • 系统版本和存储驱动的兼容问题。
  • 更改存储驱动会使得现有的容器和镜像不可访问(原因:每种存储驱动存储镜像层的位置是不同的)
  • 但恢复存储驱动,可以再次访问之前的镜像和容器
# 修改daemon.json文件来更改存储引擎配置
[root@localhost ~]# vi /etc/docker/daemon.json 
{
   
  "registry-mirror":["https://registry.docker-cn.com"],
  "storage-driver":"overlay"                           《————————添加这个信息
}
# 重启docker生效
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker info
# 找到如下信息
 Storage Driver: overlay                 《————————修改生效
  Backing Filesystem: xfs
  Supports d_type: true
# 更改存储驱动会使得现有的容器和镜像不可访问
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
# 恢复存储驱动,可以再次访问之前的镜像和容器
[root@localhost ~]# vi /etc/docker/daemon.json  
{
   
  "registry-mirror":["https://registry.docker-cn.com"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
ubuntu             latest    825d55fb6340   2 weeks ago    72.8MB
centos             latest    5d0da3dc9764   7 months ago   231MB

容器和非持久化数据

非持久化数据:不需要保存的数据。容器本地存储中的数据属于非持久化数据。

容器创建时会创建非持久化存储,非持久化存储自动创建,从属于容器,生命周期与容器相同。删除容器也会删除全部非持久化数据。

非持久化数据存在问题:

  1. 这类数据从属于容器,生命周期与容器相同,会随着容器的删除而被删除。(易丢失)
  2. 当该容器不再运行时,数据不会持久保存,如果另一个进程需要,则可能很难从该容器中获取数据。(难获取)
  3. 容器的可写层与运行容器的Docker主机紧密耦合,无法轻松地将数据转移到其他位置。(难转移)
  4. 写入容器的可写层需要Docker存储驱动管理文件系统。存储驱动使用Linux内核提供的联合文件系统,其性能不如直接写入主机文件系统的Docker卷。(读写性能差)

容器和持久化数据

持久化数据:需要保存的数据。例如:日志、业务数据、客户信息等有用的数据。

外部存储:Docker通过将主机中的文件系统挂载到容器中供容器存取,从而实现持久化数据存储。

容器持久化数据存储方式:Docker目前支持卷、绑定挂载,这两种挂载类型实现容器的持久化。

卷(数据卷):Docker中进行持久化数据存储的最佳方式。本质是Docker主机文件系统中的目录或文件直接挂载到容器的文件系统中。

卷和容器是解耦的,可以独立地创建并管理卷
卷不与容器的生命周期绑定(容器的停止删除和卷无关)
可以将任意数量的卷装入容器,多个容器也可以共享一个或多个卷(多对多关系)

挂载类型

往容器中挂载的外部文件系统主要有:卷、绑定挂载、tmpfs挂载。无论哪种挂载,对容器内部来说是一样的,都会显示为文件或目录。

卷存储在主机文件系统中由Docker管理的位置,在Linux主机上该位置默认就是/var/lib/docker/volumes目录。

卷是Docker持久化存储数据的最佳方式。卷支持使用卷驱动,可以让用户将数据存储在远程主机或云提供商处等。

可以以命名方式或匿名方式挂载卷:

  1. 匿名卷(Anonymous Volumes):首次挂载容器未指定名称,Docker为其随机指定一个唯一名称。
  2. 命名卷(Named Volumes):指定明确名称,和匿名卷其他特性相同。

卷由Docker创建并管理,卷适合以下应用场景。

  1. 在多个正在运行的容器之间共享数据。(数据共享)
  2. 当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置与容器运行时解耦。(构建新目录与主机不同)
  3. 当需要将容器的数据存储到远程主机或云提供商处,而不是本地时。(可以远程挂载卷,公有云、灾备等场景)
  4. 当需要在两个Docker主机之间备份、恢复或迁移数据时。(主机间备份迁移)

绑定挂载

绑定挂载可以存储到主机系统的任意位置,甚至会存储到一些重要的系统文件或目录中。

特点:

  1. 主机上进程或容器可以随时修改。
  2. 相比卷,功能更受限、性能更高。
  3. 绑定挂载运行访问敏感文件。

绑定挂载适合以下应用场景。

  1. 在主机和容器之间共享配置文件。
  2. 在Docker主机上的开发环境和容器之间共享源代码或构建工件。
  3. 当Docker主机上的目录结构保证与容器要求的绑定挂载一致时。

tmpfs挂载

tmpfs挂载仅限于运行Linux操作系统的Docker主机使用,它只存储在主机的内存中,不会被写到主机的文件系统中,因此不能持久保存容器的应用数据。
在不需要将数据持久保存到主机或容器中时,tmpfs挂载最合适。
如果容器产生了非持久化数据,那么可以考虑使用tmpfs挂载避免将数据永久存储到任何位置,并且通过避免写入容器的可写层来提高容器的性能。

docker卷

docker volume是Docker卷的管理命令。

# 语法
[root@localhost volumes]# docker volume
Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume                                            # 创建卷
  inspect     Display detailed information on one or more volumes        # 查看卷的详细信息
  ls          List volumes                                               # 列出本地docker主机上的卷
  prune       Remove all unused local volumes                            # 删除未被使用的卷
  rm          Remove one or more volumes                                 # 删除指定卷

创建卷

使用 docker volume create命令创建卷。

# 语法
[root@localhost volumes]# docker volume create --help
Usage:  docker volume create [OPTIONS] [VOLUME]
Create a volume
Options:
  -d, --driver string   Specify volume driver name (default "local")     # 说明卷驱动名称(默认是'local')
      --label list      Set metadata for a volume                        # 设置卷元数据
  -o, --opt map         Set driver specific options (default map[])      # 设置驱动特殊选项


# 案例1:创建普通卷
[root@localhost volumes]# docker volume create test-vol01
test-vol01
[root@localhost volumes]# docker volume inspect test-vol01
[
    {
   
        "CreatedAt": "2022-04-27T17:02:27+08:00",
        "Driver": "local",
        "Labels": {
   },
        "Mountpoint": "/var/lib/docker/volumes/test-vol01/_data",
        "Name": "test-vol01",
        "Options": {
   },
        "Scope": "local"
    }
]

# 案例2:创建tmpfs卷,大小100m,uid为1000
[root@localhost volumes]# docker volume create --driver local \
> --opt type=tmpfs \
> --opt device=tmpfs \
> --opt o=size=100m,uid=1000 \
> test-vol02
test-vol02
[root@localhost volumes]# docker volume inspect test-vol02
[
    {
   
        "CreatedAt": "2022-04-27T17:10:21+08:00",
        "Driver": "local",
        "Labels": {
   },
        "Mountpoint": "/var/lib/docker/volumes/test-vol02/_data",
        "Name": "test-vol02",
        "Options": {
   
            "device": "tmpfs",
            "o": "size=100m,uid=1000",
            "type": "tmpfs"
        },
        "Scope": "local"
    }
]


# 案例3:设置元数据
[root@localhost volumes]# docker volume create --label city=wuhan test-vol03
test-vol03
[root@localhost volumes]# docker volume inspect test-vol03
[
    {
   
        "CreatedAt": "2022-04-27T17:07:44+08:00",
        "Driver": "local",
        "Labels": {
   
            "city": "wuhan"
        },
        "Mountpoint": "/var/lib/docker/volumes/test-vol03/_data",
        "Name": "test-vol03",
        "Options": {
   },
        "Scope": "local"
    }
]

查看卷列表

使用 docker volume ls 命令列出当前的卷。

format关键词:

Placeholder Description
.Name Volume name
.Driver Volume driver
.Scope Volume scope (local, global)
.Mountpoint The mount point of the volume on the host
.Labels All labels assigned to the volume
.Label Value of a specific label for this volume. For example { {.Label “project.version”}}
# 语法
[root@localhost volumes]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值