容器数据卷

什么是容器数据卷

docker的理念回顾
将应用和环境打包成一个镜像

关于数据,如果数据在容器中,那么将容器删除的时候,数据就会丢失。需求:数据可以持久化

以MySQL为例:希望MySQL数据可存储在本地

实现:容器之间有一个数据共享的技术,Docker容器中产生的数据可以同步到本地

卷技术,目录的挂载,将容器内的目录挂载到虚拟机(或linux)上

总结:为什么要用卷技术?为了容器持久化和同步操作,容器间也是可以数据共享的

使用数据卷(双向绑定)

方式一:直接使用命令挂载 -v

docker run -it -v 主机目录:容器内目录  # ":"前后不能有空格
docker run -it -v /home/ceshi:/home centos /bin/bash
# 在home中存放的内容会自动同步到/home/ceshi下

# 查看是否挂载成功
docker inspect [容器id??]
docker inspect ff174bf554b0# 部分运行日志"Mounts": [{"Type": "bind","Source": "/home/ceshi", # 源地址 (主机地址)"Destination": "/home",   # 目标地址 (docker地址)"Mode": "","RW": true,"Propagation": "rprivate"}],

挂载成功之后,不论是在主机下的/home/ceshi下操作,还是在docker中的/home下操作,另一个目录都会自动同步;但是当把镜像删除之后,挂载的数据卷内容还是存在的

若退出容器,在外面进行操作,容器内也会自动同步(这样就省去了进入容器的麻烦)

1. 停止容器
2. 在宿主机上修改文件
3. 启动容器
4. 容器内的数据依旧是同步的

实战:安装MySQL

思考:MySQL的数据持久化问题

# 获取镜像
docker pull mysql:5.7# 运行容器,需要数据挂载 注意:安装启动mysql的时候需要配置密码
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=000000 --name mysql01 mysql:5.7# 启动成功之后,可以在本地使用sqlyod连接测试
# sqlyod连接到服务器的3310端口,3310和容器内3306映射,这样就可以连上了
# 在本地测试创建一个数据库,查看映射路径是否映射成功

具名和匿名挂载

# 匿名挂载
-v [容器内路径] (不写主机内目录,会自动生成一个目录)
docker run -d -P --name nginx01 -v /etc/nginx nginx# 查看所有volume卷的情况
docker volume ls
# 只写了容器中的路径,而没有写容器外的路径

# 具名挂载
-v [卷名]:[容器内路径]
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# juming-nginx:/etc/nginx nginx 这里指定了卷名# 查看volume
docker volume ls

所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data

进入/var/lib/docker/volumes/xxx/_data目录


我们通过具名挂载可以方便的找到一个卷,大多数情况使用具名挂载

# 如何确定是具名挂载还是匿名挂载:是否指定路径挂载
-v [容器内路径]              # 匿名挂载
-v [卷名]:[容器内路径]        # 具名挂载
-v /[宿主机路径]:[容器内路径]  # 指定路径挂载

扩展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro read-only  # 只读
rw read-write # 可读可写# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx# ro: 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的

初识DockerFile

DockerFile就是用来构建docker镜像的构建文件,命令脚本

通过脚本生成镜像,镜像是一层一层的,所对应的脚本就是一层一层的命令,每个命令都是一层镜像

方式二:

# 自己写的脚本
# 创建一个dockerFile文件,名字可以随便,但是建议是dockerFile
# 文件中的内容  指令(建议大写) 参数
FROM centos      # 指定参数VOLUME ["/home/docker-test-volume/volume01","/home/docker-test-volume/volume02"] # 注意“VOLUME”和中括号之间的空格路径要写绝对路径CMD echo "---end---"
CMD /bin/bash
# 这里每个命令就是镜像的一层# 生成命令
docker build -f dockerfile1 -t lxl_centos:1.0 .

# 启动下自己写的容器
docker run -it [容器id] /bin/bash
# 可能有error

VOLUME ["/home/docker-test-volume/volume01","/home/docker-test-volume/volume02"]写成VOLUME ["volume01","volume02"],会报错,因为不是绝对路径

报错信息:

docker: Error response from daemon: OCI runtime create failed: invalid mount {Destination:volume01 Type:bind Source:/var/lib/docker/volumes/95eb83c4d838517c2c909cbfe53ff0d3a254b271c6395d00820ccb0bc5947af6/_data Options:[rbind]}: mount destination volume01 not absolute: unknown.

再启一次:还是报错

docker: Error response from daemon: OCI runtime create failed: invalid mount {Destination:home/docker-test-volume/volume01 Type:bind Source:/var/lib/docker/volumes/143e5e92fe74b95a072fd5a44c89cdd51b40ddfa0c087e0fc331f452a37f0a66/_data Options:[rbind]}: mount destination home/docker-test-volume/volume01 not absolute: unknown.

正常启动:

查看挂载的信息:

home/docker-test-volume/目录即为生成镜像的时候自动挂载的数据卷目录,此卷目录一定在外部有同步的目录,使用docker inspect 查看元数据后可找到映射的目录

这种方式为匿名挂载

在容器中创建一个文件:

在对应的外部路径下/var/lib/docker/volumes/c7e3fb47f4ea07c52ce61ef187eb7b1f4ce1bd4a66aa7987472da067b2801f0b/_data可找到:

这种方式未来使用较多,因为我们通常会构建自己的镜像

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v [卷名]:[容器内路径]

数据卷容器

如多个MySQL同步数据

# 现在启动两个容器,让它们来同步数据
# 第一个
docker run -it --name lxl01 63ad41b0da3d /bin/bash
# 第二个
# --volumes-from lxl01  相当于继承了lxl01的挂载信息
# 此处的centos01就相当于数据卷容器
docker run -it --name lxl02 --volumes-from lxl01 63ad41b0da3d

测试是否同步

  1. 在lxl01的volume01中新建文件

  2. 在lxl02查看是否同步

  3. 在lxl02的volume01中新建文件

  4. 在lxl01查看是否同步

  5. 结果都是可以同步的

  6. 新创建一个容器lxl03,可看到在volume01中也是同步了lxl01和lxl02的信息

  7. 查看本地是否存在挂载的信息

  8. 同理可测试volume02的同步情况(注:volume01和volume02的挂载目录不同)

–volumes-from 可实现容器间的数据共享,上面的例子中lxl01、lxl02、lxl03这三个容器都是数据共享的

下面再来测试,停掉或删除容器之后数据是否存在

  1. 停掉lxl01(未删除容器)

  2. 在lxl02中查看,lxl01_1.txt仍存在

  3. 现删除容器lxl01

  4. 查看信息是否仍存在:仍存在lxl01_1.txt

现在在lxl02和lxl03上操作,看看是否会继续同步

  1. 在lxl02的volume01中新建文件lxl02_2.txt

  2. 在lxl03查看是否仍然同步

  3. 仍然同步

数据卷机制,拷贝,删掉一个不会影响别的

数据卷应用

​ 多个MySQL实现数据共享

docker run -d - p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 再起一个 【注意端口号】
docker run -d - p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦持久化到了本地,本地的数据是不会删除的

【Docker】05 容器数据卷相关推荐

  1. docker之容器数据卷

    目录 1.使用volume添加数据卷 2.dockerFile添加数据卷 3.数据卷容器 4.dockerFile解析 4.1dockerfile解析过程 4.2 dockerfile保留关键字 介绍 ...

  2. Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化

    容器数据卷:可以实现宿主机与容器进行共享.容器数据持久化,容器与容器共享数据.可以在run镜像时使用-v参数指定宿主机与容器进行挂载的目录,也可以使用dockerfile的volume指定容器中容器数 ...

  3. docker容器数据卷基本操作

    在实际运用中,如果使用docker部署应用的时候,有这么一种情况,需要有个位置可以同步docker容器上的数据到服务器上,更通俗点讲,我们需要在服务器上开启一个位置,这个位置可以连接docker容器中 ...

  4. Docker容器数据卷讲解

    概述 为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会 ...

  5. docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]

    docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...

  6. 【Docker 系列】我们来看看容器数据卷到底是个啥

    什么是容器数据卷 思考一个问题,我们为什么要使用 Docker? 主要是为了可以将应用和环境进行打包成镜像,一键部署. 再思考一个问题,容器之间是相互隔离的,如果我们在容器中部署类似 mysql 这样 ...

  7. Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏

    L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...

  8. docker 数据卷 mysql_Docker容器数据卷原理及使用方法解析

    什么是容器数据卷 如果数据都在容器中,一旦容器删除,数据就会丢失! eg : mysql容器删了,就是我们常说的删库跑路. 需求:数据可以持久化,即时删掉容器,我们的数据还在 容器直接可以有一个数据共 ...

  9. Docker镜像、容器数据卷和Dockerfile

    Docker镜像 概述 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. UnionFS ...

  10. Docker系列 五.Docker容器数据卷

    五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...

最新文章

  1. 中国书法的造型元素与原理 刘彦湖
  2. Oracle导入csv数据字符集,用SQLLDR把.CSV文件导入到数据库时,出现无法定位字符集句柄以用于字符集标识(0)...
  3. matlab中imfilter是什么意思,matlab中imfilter的用法
  4. 什么笔记本电脑好_买个什么价格的笔记本电脑好,如何选购笔记本电脑
  5. 苏州大学计算机考研复试经验,苏州大学计算机考研复试经验总结.docx
  6. 复旦大学长跑协会财务制度(初稿)
  7. 解析底层原理!月薪20k+的Android面试都问些什么?深夜思考
  8. mysql 密码修改时间_Mysql修改密码的方法
  9. 【linux】16进制格式查看命令hexdump
  10. 离散数学知识点及错题集合 第七章
  11. 联想服务器rd640性能,联想RD640服务器产品规格
  12. 生成对抗网络,从DCGAN到StyleGAN、pixel2pixel,人脸生成和图像翻译。
  13. 嘿,程序猿,你该学点经济学了!
  14. 自定义android控件EditText边框背景
  15. Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册
  16. 关于初次使用CentOS8无法切换成拼音输入的问题
  17. 电脑连WIFI网速慢,手机却很快
  18. 技术负责人如何搞定老板之我所见
  19. 【机器学习课程】第一章机器学习概述 2.机器学习
  20. 数据外泄保护与国土安全部

热门文章

  1. 云栖回顾|龙蜥论坛圆桌环节都有哪些精彩观点?
  2. 六问阿里云计算安全,全面解析阿里云ECS服务器的计算安全进化之路
  3. 重磅!解读国内唯一入选全球顶会SIGCOMM的阿里云网络论文
  4. 回顾 2018: 革新的一年
  5. 【扩频通信】基于matlab扩频通信Gold序列特性仿真【含Matlab源码 1522期】
  6. 【三维路径规划】基于matlab无人机三维路径规划【含Matlab源码 1262期】
  7. 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
  8. ai疾病风险因素识别_克服AI的“蠕动因素”
  9. laydate 在vue中使用_Vue中使用ArcGIS JS API 4.14开发
  10. 软件项目验收汇报ppt_扔掉你收藏的PPT吧,设计院专用项目汇报模板来袭(68GB)!...