欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Docker 数据卷管理及优化

Docker 数据卷管理及优化

2025/9/19 0:02:02 来源:https://blog.csdn.net/weixin_68398469/article/details/141726440  浏览:    关键词:Docker 数据卷管理及优化

目录

1 数据卷实现的目的

2 为什么要用数据卷

3 docker的两种数据卷

3.1 bind mount 数据卷

实践实例:

3.2 docker managed 数据卷

实验实例:

3.3 bind mount 数据卷和docker managed 数据卷的对比

3.3.1 相同点:

3.3.2 不同点:

3.4 数据卷容器(Data Volume Container)

3.5 备份与迁移数据卷


1 数据卷实现的目的

Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机上。

这样可以实现以下几个重要的目的:

  • 数据持久化:即使容器被删除或重新创建,数据卷中的数据仍然存在,不会丢失。
  • 数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。
  • 独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响。

2 为什么要用数据卷

docker分层文件系统

  • 性能差
  • 生命周期与容器相同

docker数据卷

  • mount到主机中,绕开分层文件系统
  • 和主机磁盘性能相同,容器删除后依然保留
  • 仅限本地磁盘,不能随容器迁移

docker提供了两种卷:

  • bind mount
  • docker managed volume

3 docker的两种数据卷

3.1 bind mount 数据卷

Docker的bind mount是一种数据持久化的方式,它允许将主机文件系统的目录或文件直接挂载到容器中。通过这种方式,可以将数据存储在宿主机上,从而避免了数据仅存在于容器内的局限性,这对于需要数据持久化或者跨容器共享数据的场景特别有用。

实践实例:

[root@node-3 ~]# docker run -it --rm --name=test \-v /root/shuyan:/data1:rw \-v /etc/hosts:/data2/hosts:ro \busybox
/ # ls
bin    data2  etc    lib    proc   sys    usr
data1  dev    home   lib64  root   tmp    var/ # ls data1/
shuyanfile1  shuyanfile2  shuyanfile3  shuyanfile4  shuyanfile5
/ # ls data2/
hosts/ # touch data1/shuyanfile{6..10}
/ # ls data1/
shuyanfile1        shuyanfile3        shuyanfile5
shuyanfile2        shuyanfile4        shuyanfile{6..10}# 发现无法删除,因为是只读文件
/ # rm data2/hosts 
rm: remove 'data2/hosts'? y
rm: can't remove 'data2/hosts': Device or resource busy# 查看是否创建新文件
[root@node-3 ~]# ls shuyan/
shuyanfile1  shuyanfile2  shuyanfile3  shuyanfile4  shuyanfile5  shuyanfile{6..10}

3.2 docker managed 数据卷

  • bind mount必须指定host文件系统路径,限制了移植性
  • docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录
  • 默认创建的数据卷目录都在 /var/lib/docker/volumes
  • 如果挂载时指向容器内已有的目录,原有数据会被复制到volume

一般在不建立数据卷的时候再关闭或者说停止容器的时候,数据也是会随着容器关闭删除而删除

清理未使用的 Docker 数据卷

 docker volume prune

1. 在执行 docker volume prune 命令之前,请确保你确实不再需要这些数据卷中的数据,因为

该操作是不可逆的,一旦删除数据将无法恢复。

2. 如果有重要的数据存储在数据卷中,建议先进行备份,或者确保数据已经被妥善保存到其他地

方。

实验实例:

# 创建的逻辑卷默认放在/var/lib/docker/volumes/[root@rockynode-1 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  
[root@rockynode-1 ~]# docker volume create mysqldate
mysqldate[root@rockynode-1 ~]# docker volume ls 
DRIVER    VOLUME NAME
local     mysqldate# 查看逻辑卷存放路径
[root@rockynode-1 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  mysqldate

 ~]# docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=shuyan \
# 将mysqldate挂载到容器内mysql的数据目录
-v mysqldate:/var/lib/mysql mysql:5.7~]# docker ps 
CONTAINER ID   IMAGE       COMMAND                   CREATED          STATUS          PORTS                 NAMES
5c48f5ce89ba   mysql:5.7   "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds   3306/tcp, 33060/tcp   mysql

查看宿主机上磁盘空间

[root@rockynode-1 ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  mysqldate  
[root@rockynode-1 ~]# ls /var/lib/docker/volumes/mysqldate/
_data
[root@rockynode-1 ~]# ls /var/lib/docker/volumes/mysqldate/_data/
auto.cnf    client-cert.pem  ibdata1      ibtmp1      performance_schema  server-cert.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql       private_key.pem     server-key.pem
ca.pem      ib_buffer_pool   ib_logfile1  mysql.sock  public_key.pem      sys

发现都是MySQL数据目录之下的东西 

 ~]# docker inspect mysql | grep -A 6 Mounts"Mounts": [{"Type": "volume","Name": "mysqldate","Source": "/var/lib/docker/volumes/mysqldate/_data","Destination": "/var/lib/mysql","Driver": "local",

 

在删除掉容器之后,数据也还是存在的

3.3 bind mount 数据卷和docker managed 数据卷的对

3.3.1 相同点:

两者都是 host 文件系统中的某个路径

3.3.2 不同点:

特性/功能bind mountdocker managed volume
volume 位置可任意指定/var/lib/docker/volumes/...
对已有mount point 影响隐藏并替换为 volume原有数据复制到 volume
是否支持单个文件支持不支持,只能是目录
权限控制可设置为只读,默认为读写权限无控制,均为读写权限
移植性移植性弱,与 host path 绑定移植性强,无需指定 host 目录
 ~]# docker run -it --rm --name=test -v datavolume:/etc:rw busybox
/ # ls
bin    dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # cd etc/
/etc # ls
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow

多开一个ssh会话

[root@rockynode-1 _data]# cd /var/lib/docker/volumes/datavolume/_data/
[root@rockynode-1 _data]# ls
group  hostname  hosts  localtime  mtab  network  nsswitch.conf  passwd  resolv.conf  shadow
[root@rockynode-1 _data]# touch shuyanfile

回到容器的会话发现多了一个文件

退出容器删除,在数据卷中数据是有保存的
/etc # [root@rockynode-1 ~]# 
[root@rockynode-1 ~]# 
[root@rockynode-1 ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
58e9f5c2cd7d   busybox   "sh"      4 minutes ago   Up 4 minutes             test
[root@rockynode-1 ~]# docker rm -f test 
test[root@rockynode-1 _data]# cd /var/lib/docker/volumes/datavolume/_data/
[root@rockynode-1 _data]# ls
group     hosts      mtab     nsswitch.conf  resolv.conf  shuyanfile
hostname  localtime  network  passwd         shadow

再等我们去创建这个数据卷的时候,他不会替换掉目录下的内容,而是对逻辑卷进行一个复制,相当于做了一个融合

[root@rockynode-1 _data]# cd /var/lib/docker/volumes/datavolume/_data/
[root@rockynode-1 _data]# ls
group     hosts      mtab     nsswitch.conf  resolv.conf  shuyanfile
hostname  localtime  network  passwd         shadow_data]# docker run --rm -it --name=test -v datavolume:/etc:ro busybox
/ # cd etc/
/etc # ls
group          hosts          mtab           nsswitch.conf  resolv.conf    shuyanfile
hostname       localtime      network        passwd         shadow

3.4 数据卷容器(Data Volume Container

数据卷容器(Data Volume Container)是 Docker 中一种特殊的容器,主要用于方便地在多个容器之间 共享数据卷。

[root@rockynode-1 ~]# docker run --rm -it --name=test \
-v datavolumes:/data:rw busybox/ # [root@rockynode-1 ~]# # 使用--volumes-from引用test容器的数据卷
[root@rockynode-1 ~]# docker run --rm -it --name=new_test \
--volumes-from test  busybox/ # ls 
bin    data   dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # ls data/
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow

3.5 备份与迁移数据卷

备份数据卷

[root@rockynode-1 ~]# docker run --rm -it --name=test -v datavolumes:/data:rw busybox
/ # ls 
bin    data   dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # ls data/
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow
/ # [root@rockynode-1 ~]# # 使用--volumes-from参数引用 test 容器的数据卷
# 再使用 pwd 将当前工作目录进行挂载,来接收在容器内打包数据的操作
# 其实开启new_test 容器就是作为一个备份的媒介 为将 test容器内的data数据进行备份
# 打包之后放在容器内的挂载点,实现与宿主机的数据共享
[root@rockynode-1 ~]# docker run --rm -it --name=new_test 
--volumes-from test -v `pwd`:/mount busybox/ # ls
bin    dev    home   lib64  proc   sys    usr
data   etc    lib    mount  root   tmp    var
/ # ls mount/
anaconda-ks.cfg      dockerfile           script               ??
auth                 harbor               ??                   ??
certs                images.tar.gz        ??                   ??
certsshuyan.crt      nginx-latest.tar.gz  ??                   ??
certsshuyan.key      registry.tag.gz      ??
/ # ls data/
group          hosts          mtab           nsswitch.conf  resolv.conf
hostname       localtime      network        passwd         shadow# 将镜像进行打包
/ # tar czf /mount/data.tar.gz /data/*
tar: removing leading '/' from member names# ctrl + pq 退出容器
/ # [root@rockynode-1 ~]# 

查看被挂载的目录从容器内共享的 打包的tar包

[root@rockynode-1 ~]# ls
公共  文档  anaconda-ks.cfg  certsshuyan.key  images.tar.gz
模板  下载  auth             data.tar.gz      nginx-latest.tar.gz
视频  音乐  certs            dockerfile       registry.tag.gz
图片  桌面  certsshuyan.crt  harbor           script

解压测试是否实现

[root@rockynode-1 ~]# tar xzf data.tar.gz 
[root@rockynode-1 ~]# ls data
group  hostname  hosts  localtime  mtab  network  
nsswitch.conf  passwd  resolv.conf  shadow

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词