docker存储管理"/>
docker存储管理
docker存储概念
容器本地存储与Docke存储驱动
容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存储驱动进行管理。
容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。
联合文件系统:Docker的一种底层技术,由存储驱动(Storage Driver)实现。相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
存储驱动:控制镜像和容器在 docker 主机上的存储和管理方式。
每个Docker主机只能选择一种存储驱动,不能为每个容器选择不同的存储驱动。
查看主机支持的存储驱动
[root@localhost ~]# docker info
# 找到如下信息Storage Driver: overlay2 # 存储驱动是overlay2Backing Filesystem: xfs # 底层文件系统是xfsSupports d_type: true # 支持d_typeNative Overlay Diff: trueuserxattr: false
更改现有的存储驱动
可以根据需要修改现有的存储驱动。
注意:
- 一个主机只能选择一个存储驱动。
- 系统版本和存储驱动的兼容问题。
- 更改存储驱动会使得现有的容器和镜像不可访问(原因:每种存储驱动存储镜像层的位置是不同的)
- 但恢复存储驱动,可以再次访问之前的镜像和容器
# 修改daemon.json文件来更改存储引擎配置
[root@localhost ~]# vi /etc/docker/daemon.json
{"registry-mirror":[""],"storage-driver":"overlay" 《————————添加这个信息
}
# 重启docker生效
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker info
# 找到如下信息Storage Driver: overlay 《————————修改生效Backing Filesystem: xfsSupports d_type: true
# 更改存储驱动会使得现有的容器和镜像不可访问
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 恢复存储驱动,可以再次访问之前的镜像和容器
[root@localhost ~]# vi /etc/docker/daemon.json
{"registry-mirror":[""]
}
[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
容器和非持久化数据
非持久化数据:不需要保存的数据。容器本地存储中的数据属于非持久化数据。
容器创建时会创建非持久化存储,非持久化存储自动创建,从属于容器,生命周期与容器相同。删除容器也会删除全部非持久化数据。
非持久化数据存在问题:
- 这类数据从属于容器,生命周期与容器相同,会随着容器的删除而被删除。(易丢失)
- 当该容器不再运行时,数据不会持久保存,如果另一个进程需要,则可能很难从该容器中获取数据。(难获取)
- 容器的可写层与运行容器的Docker主机紧密耦合,无法轻松地将数据转移到其他位置。(难转移)
- 写入容器的可写层需要Docker存储驱动管理文件系统。存储驱动使用Linux内核提供的联合文件系统,其性能不如直接写入主机文件系统的Docker卷。(读写性能差)
容器和持久化数据
持久化数据:需要保存的数据。例如:日志、业务数据、客户信息等有用的数据。
外部存储:Docker通过将主机中的文件系统挂载到容器中供容器存取,从而实现持久化数据存储。
容器持久化数据存储方式:Docker目前支持卷、绑定挂载,这两种挂载类型实现容器的持久化。
卷(数据卷):Docker中进行持久化数据存储的最佳方式。本质是Docker主机文件系统中的目录或文件直接挂载到容器的文件系统中。
卷和容器是解耦的,可以独立地创建并管理卷
卷不与容器的生命周期绑定(容器的停止删除和卷无关)
可以将任意数量的卷装入容器,多个容器也可以共享一个或多个卷(多对多关系)
挂载类型
往容器中挂载的外部文件系统主要有:卷、绑定挂载、tmpfs挂载。无论哪种挂载,对容器内部来说是一样的,都会显示为文件或目录。
卷
卷存储在主机文件系统中由Docker管理的位置,在Linux主机上该位置默认就是/var/lib/docker/volumes
目录。
卷是Docker持久化存储数据的最佳方式。卷支持使用卷驱动,可以让用户将数据存储在远程主机或云提供商处等。
可以以命名方式或匿名方式挂载卷:
- 匿名卷(Anonymous Volumes):首次挂载容器未指定名称,Docker为其随机指定一个唯一名称。
- 命名卷(Named Volumes):指定明确名称,和匿名卷其他特性相同。
卷由Docker创建并管理,卷适合以下应用场景。
- 在多个正在运行的容器之间共享数据。(数据共享)
- 当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置与容器运行时解耦。(构建新目录与主机不同)
- 当需要将容器的数据存储到远程主机或云提供商处,而不是本地时。(可以远程挂载卷,公有云、灾备等场景)
- 当需要在两个Docker主机之间备份、恢复或迁移数据时。(主机间备份迁移)
绑定挂载
绑定挂载可以存储到主机系统的任意位置,甚至会存储到一些重要的系统文件或目录中。
特点:
- 主机上进程或容器可以随时修改。
- 相比卷,功能更受限、性能更高。
- 绑定挂载运行访问敏感文件。
绑定挂载适合以下应用场景。
- 在主机和容器之间共享配置文件。
- 在Docker主机上的开发环境和容器之间共享源代码或构建工件。
- 当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]
更多推荐
docker存储管理
发布评论