Docker详解-数据卷

容器的数据分层目录

LowerDir: image 镜像层,即镜像本身,只读 diff

UpperDir: 容器的上层,可读写 ,容器变化的数据存放在此处

MergedDir: 容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和 upperdir 合并完成 后给容器使用,最终呈现给用户的统一视图 merged

WorkDir: 容器在宿主机的工作目录,挂载后内容会被清空,且在使用过程中其内容用户不可见 work

容器数据持久保持
  • 卷(Volume)

Docker推荐到挂载方式, 卷是完全由 Docker 管理的文件目录,可以在容器之间共享和重 用。在创建卷时,Docker 创建了一个目录在宿主机上,然后将这个目录挂载到容器内。卷的主要 优点是你可以使用 Docker CLI 或 Docker API 来备份、迁移或者恢复卷,而无需关心卷在宿主机上 的具体位置。

-v, --volumes   Remove the volumes associated with the container

数据卷分类

管理数据卷命令

docker volume COMMAND
Commands:
 create     Create a volume
 inspect     Display detailed information on one or more volumes
  ls         List volumes
 prune       Remove all unused local volumes
  rm         Remove one or more volumes

数据卷的使用方式

-v, --volume=[host-src:]container-dest[:<options>]
<options>
ro 从容器内对此数据卷是只读,不写此项默认为可读可写
rw 从容器内对此数据卷可读可写,此为默认值
host-src 宿主机目录如果不存在,会自动创建

1.指定宿主机目录或文件,不会创建数据卷

绑定挂载

#指定宿主机目录或文件格式: 
-v <宿主机绝对路径的目录或文件>:<容器目录或文件>[:ro]  #将宿主机目录挂载容器目录,两个目录都可
自动创建
#注意:如果初始容器中有旧数据,将被宿主机目录覆盖
#注意:如果挂载文件,必须指定文件的相对或绝对路径,否则会将文件名当成命名卷

2.匿名卷:不指定数据名称,只指定容器内目录路径充当挂载点,会创建匿名数据卷。Dockerfile中gVOLUME指定的卷为此种

匿名卷

#匿名卷,只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes/<卷
ID>/_data目录,并挂载至容器指定路径
#注意:如果初始容器中有旧数据,将被复制到宿主机数据卷目录
-v <容器内路径>
#示例:
docker run --name nginx -v /etc/nginx nginx

3.命名卷:指定数据卷的名称和容器路径的挂载关系,此方式会创建命名数据卷

命名卷

#命名卷将固定的存放在/var/lib/docker/volumes/<卷名>/_data
#注意:如果初始容器中有旧数据,将被复制到宿主机数据卷目录
-v <卷名>:<容器目录路径>
#可以通过以下命令事先创建,如可没有事先创建卷名,docker run时也会自动创建卷
docker volume create <卷名>
#示例:
docker volume create vol1  #也可以事先不创建
docker run -d  -p 80:80 --name nginx01 -v vol1:/usr/share/nginx/html nginx

docker rm 的 -v 选项可以删除容器时,同时删除相关联的匿名卷

关于命名数据卷和匿名数据卷的区别

   按照最佳实践的要求,不应该在容器存储层内进行数据写入操作,所有写入应该使用卷。如果定制镜像的时候,就可以确定某些目录会发生频繁大量的读写操作,那么为了避免在运行时由于用户疏忽而忘记指定卷,导致容器发生存储层写入的问题,就可以在 Dockerfile 中使用 VOLUME 来指定某些目录为匿名卷。这样即使用户忘记了指定卷,也不会产生不良的后果。
命名数据卷:
1.用户可以在容器创建时指定名称
2.可以独立于容器存在。容器被删除是,数据卷仍然可以保留
3.用于需要持久化存储的数据。可以被多个容器共享或者用于备份和恢复数据
匿名数据卷
1.是在容器创建时自动生成的,不需要用户指定名称
2.当容器被删除时,匿名容器卷也会被删除
3,匿名数据卷同城用于临时村春或不需要持久化的数据
匿名数据卷适用于了临时性的数据存储而命名卷是适用于需要持久化的数据存储,并被多个容器共享

查看数据卷的挂载关系

docker inspect --format="{{.Mounts}}" <容器ID>

删除所有数据卷

docker volume rm `docker volume ls -q

  • 绑定挂载(Bind Mount)

这种方式可以将宿主机上的任意文件或目录挂载到容器内。与卷不同,绑定挂载依赖于宿主机的文 件系统结构。 因此,如果你在 Docker CLI 或 Docker API 中使用绑定挂载,你需要知道宿主机上的文件或目录的 具体路径。 另外,由于绑定挂载可以访问宿主机上的任意文件和目录,使用这种方式可能会有一定的安全风 险。

  • tmpfs挂载

tmpfs 挂载不与宿主机上的任何文件或目录相关联,而是将一个临时文件系统挂载到容器的某个目 录下。这种方式的主要优点是它提供了一个高速且安全的挂载方式,因为 tmpfs 挂载通常驻留在宿 主机的内存中,且在容器停止后会被自动删除。

tmpfs 挂载是临时的,只存留在容器宿主机的内存中。当容器停止时,tmpfs 挂载文件路径将被删 除,在那里写入的文件不会被持久化。

[root@ubuntu2204 ~]#docker run -d --tmpfs /data --name test wangxiaochun/podtest:v0.1  

数据卷容器

在dockerfile中创建的时匿名卷,无法直接实现多个容器之间共享数据

数据卷容器主要的功能是可以让数据在多个docker容器之间共享

--volumes-from <数据卷容器>     Mount volumes from the specified container(s)

将提供卷的容器Server 删除,已经运行的容器Client依然可以使用挂载的卷,因为容器是通过挂载访问 数据的,但是无法创建新的卷容器客户端,但是再把卷容器Server创建后即可正常创建卷容器Client, 此方式可以用于线上共享数据目录等环境,因为即使数据卷容器被删除了,其他已经运行的容器依然可 以挂载使用

由此可知, 数据卷容器的功能只是将数据挂载信息传递给了其它使用数据卷容器的容器,而数据卷容器本 身并不提供数据存储功能 数据卷容器可以作为共享的方式为其他容器提供文件共享,类似于NFS共享,可以在生产中启动一个实 例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各容器之间的数据一致性 数据卷容器的 Server 和 Client 可以不使用同一个镜像生成 当创建Client容器时,会复制Server容器的数据卷信息,后续Server容器状态和存在与否,都不会影响Client 容器使用的数据卷 当Server容器删除后,不能再基于Server容器创建新的Client容器,但可以基于已存在的Client容器来创建 新的Client容器 最终实现了多个客户端容器共享相同的持久化宿主机的存储方案

  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值