10、数据卷

数据卷入门
在前面的案例中,如果我们需要将数据从宿主机拷贝到容器中,一般都是使用 Docker 的拷贝命令,这样性能上稍微有点差,有什么办法能够达到让这种拷贝达到本地磁盘 I/O 性能呢?

数据卷可以绕过拷贝系统,在多个容器之间、容器和宿主机之间共享目录或者文件(比如说nginx中最核心的目录就是放文件的那个html目录,我们可以让html目录映射到宿主机里面的某个目录上面去,这样就不用网html目录里面拷贝东西了,把东西直接扔进centos里面去,我们的容器就能看到数据了),数据卷绕过了拷贝系统,可以达到本地磁盘 I/O 性能。

本文先通过一个简单的案例向读者展示数据卷的基本用法。

以前面使用的 nginx 镜像为例,在运行该容器时,可以指定一个数据卷,命令如下:

docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 nginx

-v /usr/share/nginx/html/把容器的/usr/share/nginx/html/这个目录映射出来,跟centos中的某个目录共享。那么/usr/share/nginx/html/这个目录具体映射到哪个目录呢?

使用 docker inspect +容器的名字命令查看刚刚创建的容器的具体情况,找到数据卷映射目录:
在这里插入图片描述进入到该文件下

cd /var/lib/docker/volumes/0e86feada014d19ce2ff313b73120199ce0e4d253e6b3da355b561f72ca5108c/_d
ata

修改index.html的内容:
在这里插入图片描述此时容器的内容就变了:
在这里插入图片描述此时发现该目录下的文件内容与容器中 /usr/share/nginx/html/ 目录下的文件内容一致,这是因为挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中(如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉)。

结合宿主机目录
上文中对于数据卷的用法还不是最佳方案,一般来说,我们可能需要明确指定将宿主机中的一个目录挂载到容器中,这种指定方式如下:

docker run -itd --name nginx2 -v /users/sp/docker/:/usr/share/nginx/html/ -p 81:80 nginx
//注意宿主机的路径一定要是绝对路径

我们可以发现映射路径已经改变
在这里插入图片描述
Dockerfile中的数据卷
如果开发者使用了 Dockerfile 去构建镜像,也可以在构建镜像时声明数据卷,例如下面这样:
FROM nginx
MAINTAINER sp "2660458064@qq.com"
RUN echo ‘hello docker’>/usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html/

这样就配置了一个匿名数据卷,运行过程中,将数据写入到 /usr/share/nginx/html/ 目录中,就可以实现容器存储层的无状态变化。
在这里插入图片描述在这里插入图片描述

查看所有数据卷
使用如下命令可以查看所有数据卷:

docker volume ls

在这里插入图片描述
查看数据卷详情
根据 volume name 可以查看数据详情,如下:

docker volume inspect   0e86feada014d19ce2ff313b73120199ce0e4d253e6b3da355b561f72ca5108c

在这里插入图片描述删除数据卷
可以使用 docker volume rm+数据卷id 命令删除一个数据卷,也可以使用 docker volume prune 批量删除数据卷,会弹出yes or no 让你选择是否删除全部数据卷。

数据卷容器
数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用。所谓的数据卷容器,实际上就是一个普通的容器(里面没有其他的功能,只给其他容器提供数据,现在的数据保存在宿主机里面,如果不想保存在宿主机里面,就可以单独搞一个容器存放数据),举例如下:

创建数据卷容器
使用如下方式创建数据卷容器:

docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu

引用容器
使用如下命令引用数据卷容器:

docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx
docker run -itd --volumes-from mydata -p 81:80 --name nginx2 nginx

nginx1 和 nginx2 都挂载了同一个数据卷到 /usr/share/nginx/html/ 目录下,三个容器中,任意一个修改了该目录下的文件,其他两个都能看到变化。
使用 docker inspect 命令查看容器的详情,发现三个容器关于数据卷的描述都是一致的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值