目录
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 mount | docker 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