Docker数据卷/数据卷容器 管理


要解决的问题:

  1. 如何创建数据卷,将宿主主机目录关在到容器中
  2. 怎么使用数据卷,是容器之间进行数据共性,并实现数据的备份和恢复

1. 数据卷

是一个容器内的特殊目录,这个目录和宿主主机的某个目录有特殊的映射关系,类似linux中的mount。

1.1. 数据卷的特性

  1. 可以在容器之间共享或者重用,容器件传递数据更高效和方便
  2. 数据卷内数据的修改会立马生效,无论是容器内还是宿主主机本地操作
  3. 对数据卷的更新不会影响镜像,解耦应用和数据
  4. 数据卷会一直存在,直到没有容器使用它,可以安全卸载。

2. 创建数据卷 docker volumn create

使用命令:
docker volumn create [-d local] test
文件的存储引擎:
Docker创建新卷时采用Linux内置的local 驱动。本地卷只能被所在结点的容器使用。使用-d参数指定不同的驱动。
第三方驱动可以通过插件方式接入,这些驱动提供更高级的存储特性,并为docker继承了外部存储系统。截至到目前,卷插件涵盖了块存储、文件存储、对象存储等。

  1. 块存储: 相对性能更高,适合小块数据的随机访问负载。
  2. 文件存储,包括NFS和SMB,同样在高性能场景下表现优异。
  3. 对象存储:适合较大且长期存储。很少变更的二进制数据存储。通常对象存储根据内容寻址,效率较低。
    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

  1. docker volume prune 删除未装入任何容器或者服务的未具名的(anonymous)所有的数据卷,谨慎使用

  2. docker volume rm volumn_name 删除指定的卷
    两个命令都不能删除正在被容器或服务使用的数据卷

  3. 可以使用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. 补充

  1. 在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
  2. 数据卷建立映射关系
    将文件挂在到容器,使用文件编辑工具(vim),可能会造成inode的改变,可能会导致报错,所以推荐的方式为直接挂在文件所在的目录到容器

6. 数据卷容器 docker run –volumes-from [数据卷容器]

多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂在。
使用数据卷容器步骤:

  1. 创建数据卷容器
    # 创建数据卷容器
    docker run -it -v /dbdata --name dbdata centos:7
    # 挂载
    docker run --volumes-from dbdata -it --name db1 centos:7

6.1. 利用数据卷进行数据备份和迁移

  1. 备份

    docker run --volumes-from dbdata -v $(pwd):/backup --name worker coentos:7 tar cvf /backup/backup.tar /dbdata

    执行顺序解读:

    1. 创建一个centos:7的worker镜像
    2. 使用–valumes-from dbdata 让workder挂在dbdata容器的数据卷(及dbdata的数据卷容器)
    3. 使用 -v $(pwd):/backup将本地当前目录挂载在workder容器的/backup目录
    4. workder启动后,执行 tar cvf /back/backup.tar /dbdata 命令。将/dbdata下内容备份为容器内 /backup/backup.tar,及宿主主机的当前目录下。
  2. 恢复

    docker run --valumes-from dbdata -v $(pwd):/backup centos:7 tar xvf /backup/dbdata.tar -C /
    # dbdata.tar自己带着目录的

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注