Docker数据卷操作实战

什么是数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和享用
  • 数据卷 的修改立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即时容器被删除

为什么使用数据卷

  • 当创建一个容器的时候,容器运行,数据能不能持久化
  • 如果能够持久化,数据存储在哪?由于 docker 是隔离的,数据能不能存储在容器外
  • 如果部署很多容器,每次都需要进入容器中进行配置嘛?能不能外部进行配置

docker 数据卷呈现给 docker 容器的一个形式就是目录,该目录支持多个容器间共享,修改不会影响到镜像。使用 Docker 的数据卷,类似在系统中使用 mount 挂载一个文件系统。

数据卷挂载操作

三种挂载数据卷格式

  • 具体目录挂载:docker run [options] -v <宿主机绝对路径:容器内的路径[:ro | rw]> <镜像名>
  • 默认目录挂载:docker run [options] -v <任意别名:容器内的路径[:ro | rw]> <镜像名>
  • 匿名目录挂载:docker run [options] -v <容器内的路径[:ro | rw]> <镜像名>

默认目录挂载和匿名目录挂载的目录默认在 /var/lib/docker/volumes/ 目录下。

具体目录挂载

格式:docker run [options] -v <宿主机绝对路径 | 任意别名:容器内的路径[:ro | rw]> <镜像名>

ro:代表 read-only,容器的路径只允许读,不允许写。不影响宿主机的路径可读可写

rw:默认值,代表可读可写

具名挂载

bash 复制代码
[root@k8s-master ~]# docker run -d -p 8081:8080 --name tomcat02 -v /opt/aa:/usr/local/tomcat/webapps tomcat:8.5.73

测试容器和宿主机之间数据共享

bash 复制代码
#进入tomcat02容器
#进入容器挂载目录
#创建text.txt文件
[root@k8s-master ~]# docker exec -it tomcat02 bash
root@83751adb2f16:/usr/local/tomcat# cd webapps/
root@83751adb2f16:/usr/local/tomcat/webapps# touch text.txt
root@83751adb2f16:/usr/local/tomcat/webapps# ls
text.txt

#在宿主机查看文件
[root@k8s-master ~]# cd /opt/aa/
[root@k8s-master aa]# ls 
text.txt

#在宿主机添加test2.txt
[root@k8s-master aa]# touch test2.txt
[root@k8s-master aa]# ls
test2.txt  text.txt
root@83751adb2f16:/usr/local/tomcat/webapps# ls
test2.txt  text.txt

删除容器

bash 复制代码
[root@k8s-master ~]# docker rm -f 83751adb2f16
[root@k8s-master aa]# ls
test2.txt  text.txt

默认目录挂载

格式:docker run [options] -v <任意别名:容器内的路径[:ro | rw]> <镜像名>

ro:代表 read-only,容器的路径只允许读,不允许写。不影响宿主机的路径可读可写

rw:默认值,代表可读可写

bash 复制代码
[root@k8s-master ~]# docker run -d -p 8080:8081 --name tomcat -v aa:/usr/local/tomcat/webapps tomcat:8.5.27
[root@k8s-master ~]# find / -name aa
/var/lib/docker/overlay2/6bd69f1cc95f446236c6a944a059082b3a79f9d8ea76bdf41e30fc7a61f4ff14/diff/usr/lib/.build-id/aa
/var/lib/docker/overlay2/53bde18c658b564d75ec2e18ff485eca8cb8056ae625613e4cecc11a8695dd5d/merged/usr/lib/.build-id/aa
/var/lib/docker/volumes/aa
/usr/share/locale/aa
/opt/aa
#在宿主机中查看
 [root@k8s-master aa]# cd /var/lib/docker/volumes/aa/_data/
[root@k8s-master _data]# ls
docs  examples  host-manager  manager  ROOT
#aa 代表一个数据卷名字,可以是任意,这相当于相对路径,它会在 /var/lib/docker/volumes 下创建 aa 目录作为数据卷。

匿名目录挂载

没指定名字的挂载都是匿名挂载,-v 只写了容器内路径,并没写宿主机路径。

匿名目录挂载的目录是:/var/lib/docker/volumes/,它会在这个目录生成匿名数据卷目录。

格式:docker run [options] -v <容器内的路径[:ro | rw]> <镜像名>

bash 复制代码
[root@k8s-master ~]# docker run -d -p 8080:8081 --name tomcat03 -v /usr/local/tomcat/webapps tomcat:8.5.27
#没有指定宿主机,docker会自动在/var/lib/docker/volumes生成很长的字符串
[root@k8s-master volumes]# ll
total 24
drwx-----x. 3 root root     19 Feb 26 08:03 57228ed1d063b3c66afa84f968018311f3ab5c2e3272d9c7197463981a76df25
#查看数据卷
[root@k8s-master volumes]# docker volume ls
DRIVER    VOLUME NAME
local     57228ed1d063b3c66afa84f968018311f3ab5c2e3272d9c7197463981a76df25

读写权限

启动 tomcat04 容器,挂载到 kele 数据卷里,并赋予只读权限

bash 复制代码
[root@k8s-master ~]# docker run -d -P --name tomcat04 -v frx:/usr/local/tomcat/webapps:ro tomcat:8.5.27
74dbfe31c4a5f47f66c3f2b807d5944d7eefc711d2b576a82fa6485ac8079d69
[root@k8s-master ~]# docker volume ls
DRIVER    VOLUME NAME
local     frx

 #到宿主机目录下查看,并新建文本文件
[root@k8s-master ~]# cd /var/lib/docker/volumes/frx/_data/
[root@k8s-master _data]# touch test1.txt
[root@k8s-master _data]# ls
docs  examples  host-manager  manager  ROOT  test1.txt
#进入容器查看是否可读,不允许写
[root@k8s-master ~]# docker  exec -it tomcat04 /bin/bash
root@74dbfe31c4a5:/usr/local/tomcat# cd webapps/
root@74dbfe31c4a5:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager  test1.txt
root@74dbfe31c4a5:/usr/local/tomcat/webapps# touch test2.txt
touch: cannot touch 'test2.txt': Read-only file system

数据卷操作命令

bash 复制代码
#数据卷查看
docker volume ls 
#查看frx数据卷的具体信息
[root@k8s-master ~]# docker volume inspect frx

#数据卷创建
docker volume create Myvolume

#数据卷删除
docker  volume rm -f Myvolume
相关推荐
---学无止境---5 分钟前
Linux中slab缓存初始化kmem_cache_init函数和定时回收函数的实现
linux
草莓熊Lotso10 分钟前
Linux 进阶指令实操指南:文件查看、时间管理、搜索压缩全场景覆盖(附高频案例)
linux·运维·服务器
Cx330❀11 分钟前
《Linux进阶指令实操指南》:文件查看、时间管理、搜索压缩全覆盖(附高频案例)
linux·运维·服务器
努力努力再努力wz31 分钟前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
Small___ming41 分钟前
【Linux基础学习】Linux Ubuntu 权限管理:从入门到精通
linux·学习·ubuntu
喵叔哟43 分钟前
63.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--预算告警
运维·微服务·.net
tan77º1 小时前
【项目】基于多设计模式下的同步&异步日志系统 - 项目介绍与前置知识
linux·c++·设计模式
Akshsjsjenjd1 小时前
Docker资源限制详解
运维·docker·容器
yalipf1 小时前
忘记密码更改ubuntu18.08的密码--前提是要知道用户名work
linux·运维·ubuntu
xrkhy1 小时前
微服务之OpenFeign 服务调用
微服务·云原生·架构