Docker数据卷/数据卷容器 管理
要解决的问题:
- 如何创建数据卷,将宿主主机目录关在到容器中
- 怎么使用数据卷,是容器之间进行数据共性,并实现数据的备份和恢复
1. 数据卷
是一个容器内的特殊目录,这个目录和宿主主机的某个目录有特殊的映射关系,类似linux中的mount。
1.1. 数据卷的特性
- 可以在容器之间共享或者重用,容器件传递数据更高效和方便
- 数据卷内数据的修改会立马生效,无论是容器内还是宿主主机本地操作
- 对数据卷的更新不会影响镜像,解耦应用和数据
- 数据卷会一直存在,直到没有容器使用它,可以安全卸载。
2. 创建数据卷 docker volumn create
使用命令:
docker volumn create [-d local] test
文件的存储引擎:
Docker创建新卷时采用Linux内置的local 驱动。本地卷只能被所在结点的容器使用。使用-d参数指定不同的驱动。
第三方驱动可以通过插件方式接入,这些驱动提供更高级的存储特性,并为docker继承了外部存储系统。截至到目前,卷插件涵盖了块存储、文件存储、对象存储等。
- 块存储: 相对性能更高,适合小块数据的随机访问负载。
- 文件存储,包括NFS和SMB,同样在高性能场景下表现优异。
- 对象存储:适合较大且长期存储。很少变更的二进制数据存储。通常对象存储根据内容寻址,效率较低。
sudo docker volume create -d local test_volume
2.1. 查看数据卷 docker volumn ls
docker volume ls
DRIVER VOLUME NAME
local d8e565193e7eef93c30dc3fd946c3ac5386a1a485bf5a29b809013d642fc0dbd
local test_volume
2.2. 查看数据卷 docker volumn inspect
Driver 、Scope都是local,说明这个数据卷默认local驱动创建,只能用于当前主机上的容器。
MountPoint说明数据卷在宿主主机上的位置
docker volume inspect test_volume
docker volume inspect test_volume
[
{
"CreatedAt": "2023-07-07T16:42:06+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test_volume/_data",
"Name": "test_volume",
"Options": null,
"Scope": "local"
}
]
3. 删除数据卷 docker volume (rm|prune) 或 docker rm -v
-
docker volume prune 删除未装入任何容器或者服务的未具名的(anonymous)所有的数据卷,谨慎使用
-
docker volume rm volumn_name 删除指定的卷
两个命令都不能删除正在被容器或服务使用的数据卷 -
可以使用docker rm -v 随最后一个载入该数据卷的容器一起删除
4. 使用数据卷 docker run –mount|-v挂载
docker run的参数–mount选项来使用数据卷,–mount支持三种类型的数据卷:使用type指定
volume: 普通数据卷(已经创建好的),映射到主机 /var/lib/docker/volumes路径下;
bind: 绑定数据卷,映射到主机指定路径下
tmpfs:临时数据卷,只存在于内存中
# type = volume
sudo docker run -dit --name centos01 --mount type=mount,source=test_vol,destination=/test centos:7
# type = bind
sudo docker run -dit --name centos1 --mount type=bind,source=/home/docker/abcvol,destination=/vol1 centos:7
## 等同于
sudo docker run -dit --name centos2 -v /home/docker/abcvol:/vol1 centos:7
docker volume ls
并不展示bind创建的数据卷
DRIVER VOLUME NAME
bind创建的数据卷并不在 /var/lib/docker/volumes目录下,所以使用docker volume ls是查看不到的
docker run -v命令变形
sudo docker run -dit --name centos3 -v /vol2 centos:7
docker会自动生成一个数据卷,挂在到docker容器的/vol2下
可以使用docker volume ls查看到创建的数据卷,是默认生成的。
4.1. 挂载数据卷权限问题
Docker挂在的数据卷默认权限是读写(rw),用户可以通过ro来指定为只读
sudo docker run -dit --name centos3 -v /test3:ro centos:7
加了ro后, 容器内对挂在的数据卷不能新建和修改。
5. 补充
-
在docker run时会有WARNING: IPv4 forwarding is disabled。Networking will not work.
处于安全考虑,linux系统默认是禁止数据包转发的。转发:当主机拥有多于一块的网卡时,其中一块网卡收到数据包,根据数据包的目的地ip地址将包转发网本机的另一个网卡,该网卡根据路由表继续发送数据包,这通常是由路由器所实现的共呢个。
配置Linux的ip转发功能, 首先要保证硬件联通,然后打开系统的转发功能less /proc/sys/net/ipv4/ip_forward #文件内容为0 表示禁止数据包转发 1 标识允许 # 可以通过一下方式打开 vim /usr/lib/sysctl.d/00_system.conf net.ipv4.ip_forward=1 # 重启网络 systemctl restart network # 重启docker systemctl restart docker
-
数据卷建立映射关系
将文件挂在到容器,使用文件编辑工具(vim),可能会造成inode的改变,可能会导致报错,所以推荐的方式为直接挂在文件所在的目录到容器。
6. 数据卷容器 docker run –volumes-from [数据卷容器]
多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂在。
使用数据卷容器步骤:
- 创建数据卷容器
# 创建数据卷容器 docker run -it -v /dbdata --name dbdata centos:7 # 挂载 docker run --volumes-from dbdata -it --name db1 centos:7
6.1. 利用数据卷进行数据备份和迁移
-
备份
docker run --volumes-from dbdata -v $(pwd):/backup --name worker coentos:7 tar cvf /backup/backup.tar /dbdata
执行顺序解读:
- 创建一个centos:7的worker镜像
- 使用–valumes-from dbdata 让workder挂在dbdata容器的数据卷(及dbdata的数据卷容器)
- 使用 -v $(pwd):/backup将本地当前目录挂载在workder容器的/backup目录
- workder启动后,执行 tar cvf /back/backup.tar /dbdata 命令。将/dbdata下内容备份为容器内 /backup/backup.tar,及宿主主机的当前目录下。
-
恢复
docker run --valumes-from dbdata -v $(pwd):/backup centos:7 tar xvf /backup/dbdata.tar -C / # dbdata.tar自己带着目录的