容器数据卷

什么是容器数据卷

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. 重磅!库克官宣苹果放弃英特尔,全面采用自研芯片,MAC迎来历史转折点
  2. Scrapy:Python的爬虫框架----原理介绍
  3. python 基本类型,运算,循环
  4. NVIDIA ECCV18论文:超像素采样网络助力语义分割与光流估计(代码将开源)
  5. Modularity(模块化-ES6)
  6. 适合初学者的PASCAL VOC2012数据集的下载及简单讲解
  7. 2022年深圳市集成电路专项资助计划项目申报条件及材料,补贴3000万
  8. GPU架构和Compute Shader线程规划
  9. Codeforces 1194D
  10. 僵尸网络(botnet) DDoS
  11. Java - Js 谷歌浏览器(Chrome)调用Ie浏览器
  12. 最新三维立体画·换个角度看世界
  13. 大数据时代:架构师该具备什么?
  14. BILIBILI 高并发实时弹幕系统那些事(项目开源、架构演变)
  15. 「UG/NX」BlockUI 字符串String
  16. yolov5增加一层小目标检测层
  17. LR1110接入腾讯云
  18. 在线安装K3S集群-外部数据库
  19. 新浪微博被约谈下架“热搜榜”事件舆情监测报告
  20. 添加vcsa7.0证书密钥记录

热门文章

  1. Julia :元编程、宏
  2. LightTable:更改Julia代码字体和console中字体
  3. Julia: save 和load的用法 和与Matlab的效率比较
  4. 我对 SRE 的理解
  5. 【图像隐写】基于matlab GUI DWT+DCT+SVD数字水印嵌入提取攻击(带面板)【含Matlab源码 1664期】
  6. 【水果识别】基于matlab GUI形态学水果识别【含Matlab源码 1364期】
  7. 【数据分析】基于matlab GUI图书管理系统【含Matlab源码 603期】
  8. autocoder自动代码生成器_Spring Boot 集成MyBatis Plus代码生成器
  9. python:TypeError: ‘dict_keys‘ object does not support indexing
  10. 例2.11 FatMouse' Trade - 九度教程第21题(贪心算法)