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

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妍妍的宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值