【Docker】05 容器数据卷
容器数据卷
什么是容器数据卷
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
测试是否同步
在lxl01的volume01中新建文件
在lxl02查看是否同步
在lxl02的volume01中新建文件
在lxl01查看是否同步
结果都是可以同步的
新创建一个容器lxl03,可看到在volume01中也是同步了lxl01和lxl02的信息
查看本地是否存在挂载的信息
同理可测试volume02的同步情况(注:volume01和volume02的挂载目录不同)
–volumes-from 可实现容器间的数据共享,上面的例子中lxl01、lxl02、lxl03这三个容器都是数据共享的
下面再来测试,停掉或删除容器之后数据是否存在
停掉lxl01(未删除容器)
在lxl02中查看,lxl01_1.txt仍存在
现删除容器lxl01
查看信息是否仍存在:仍存在lxl01_1.txt
现在在lxl02和lxl03上操作,看看是否会继续同步
在lxl02的volume01中新建文件lxl02_2.txt
在lxl03查看是否仍然同步
仍然同步
数据卷机制,拷贝,删掉一个不会影响别的
数据卷应用
多个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 容器数据卷相关推荐
- docker之容器数据卷
目录 1.使用volume添加数据卷 2.dockerFile添加数据卷 3.数据卷容器 4.dockerFile解析 4.1dockerfile解析过程 4.2 dockerfile保留关键字 介绍 ...
- Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化
容器数据卷:可以实现宿主机与容器进行共享.容器数据持久化,容器与容器共享数据.可以在run镜像时使用-v参数指定宿主机与容器进行挂载的目录,也可以使用dockerfile的volume指定容器中容器数 ...
- docker容器数据卷基本操作
在实际运用中,如果使用docker部署应用的时候,有这么一种情况,需要有个位置可以同步docker容器上的数据到服务器上,更通俗点讲,我们需要在服务器上开启一个位置,这个位置可以连接docker容器中 ...
- Docker容器数据卷讲解
概述 为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会 ...
- docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]
docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...
- 【Docker 系列】我们来看看容器数据卷到底是个啥
什么是容器数据卷 思考一个问题,我们为什么要使用 Docker? 主要是为了可以将应用和环境进行打包成镜像,一键部署. 再思考一个问题,容器之间是相互隔离的,如果我们在容器中部署类似 mysql 这样 ...
- Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏
L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...
- docker 数据卷 mysql_Docker容器数据卷原理及使用方法解析
什么是容器数据卷 如果数据都在容器中,一旦容器删除,数据就会丢失! eg : mysql容器删了,就是我们常说的删库跑路. 需求:数据可以持久化,即时删掉容器,我们的数据还在 容器直接可以有一个数据共 ...
- Docker镜像、容器数据卷和Dockerfile
Docker镜像 概述 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. UnionFS ...
- Docker系列 五.Docker容器数据卷
五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...
最新文章
- 中国书法的造型元素与原理 刘彦湖
- Oracle导入csv数据字符集,用SQLLDR把.CSV文件导入到数据库时,出现无法定位字符集句柄以用于字符集标识(0)...
- matlab中imfilter是什么意思,matlab中imfilter的用法
- 什么笔记本电脑好_买个什么价格的笔记本电脑好,如何选购笔记本电脑
- 苏州大学计算机考研复试经验,苏州大学计算机考研复试经验总结.docx
- 复旦大学长跑协会财务制度(初稿)
- 解析底层原理!月薪20k+的Android面试都问些什么?深夜思考
- mysql 密码修改时间_Mysql修改密码的方法
- 【linux】16进制格式查看命令hexdump
- 离散数学知识点及错题集合 第七章
- 联想服务器rd640性能,联想RD640服务器产品规格
- 生成对抗网络,从DCGAN到StyleGAN、pixel2pixel,人脸生成和图像翻译。
- 嘿,程序猿,你该学点经济学了!
- 自定义android控件EditText边框背景
- Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册
- 关于初次使用CentOS8无法切换成拼音输入的问题
- 电脑连WIFI网速慢,手机却很快
- 技术负责人如何搞定老板之我所见
- 【机器学习课程】第一章机器学习概述 2.机器学习
- 数据外泄保护与国土安全部
热门文章
- 云栖回顾|龙蜥论坛圆桌环节都有哪些精彩观点?
- 六问阿里云计算安全,全面解析阿里云ECS服务器的计算安全进化之路
- 重磅!解读国内唯一入选全球顶会SIGCOMM的阿里云网络论文
- 回顾 2018: 革新的一年
- 【扩频通信】基于matlab扩频通信Gold序列特性仿真【含Matlab源码 1522期】
- 【三维路径规划】基于matlab无人机三维路径规划【含Matlab源码 1262期】
- 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
- ai疾病风险因素识别_克服AI的“蠕动因素”
- laydate 在vue中使用_Vue中使用ArcGIS JS API 4.14开发
- 软件项目验收汇报ppt_扔掉你收藏的PPT吧,设计院专用项目汇报模板来袭(68GB)!...