六、容器数据卷

6.1什么是数据卷?

1.docker理念回顾
将应用和环境打包成一个镜像!
数据应该在哪?如果数据都放在容器中,那么我们容器删除,数据就会丢失!
需求:数据可以持久化
【例如】:MySQL,容器删了,删库跑路!
需求:MySQL的数据可以存储在本地!
所以就需要,容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地,这就是卷技术!说白了,就是目录的挂载,将我们容器的目录挂载到Linux上面!

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

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

[root@kikistudy /]# docker run -it -p   主机端口:容器内端口 映射[root@kikistudy /]# docker run -it -v  主机目录地址:容器内目录

测试

docker run -it -v    主机目录:容器内目录
# 测试
[root@kikistudy home]# docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动起来时候我们可以通过docker inspect 容器id
[root@fb2ce0871f3f /]#

[root@kikistudy /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
fb2ce0871f3f   centos    "/bin/bash"   About a minute ago   Up About a minute             sad_franklin
[root@kikistudy /]# docker inspect fb2ce0871f3f
[{"Id": "fb2ce0871f3f913a3f26bc34e9f038f17e73756fa2b2cca9d7721f4d89e4af75","Created": "2020-12-31T07:26:32.109756264Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 31692,"ExitCode": 0,"Error": "","StartedAt": "2020-12-31T07:26:32.949832598Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55","ResolvConfPath": "/var/lib/docker/containers/fb2ce0871f3f913a3f26bc34e9f038f17e73756fa2b2cca9d7721f4d89e4af75/resolv.conf","HostnamePath": "/var/lib/docker/containers/fb2ce0871f3f913a3f26bc34e9f038f17e73756fa2b2cca9d7721f4d89e4af75/hostname","HostsPath": "/var/lib/docker/containers/fb2ce0871f3f913a3f26bc34e9f038f17e73756fa2b2cca9d7721f4d89e4af75/hosts","LogPath": "/var/lib/docker/containers/fb2ce0871f3f913a3f26bc34e9f038f17e73756fa2b2cca9d7721f4d89e4af75/fb2ce0871f3f913a3f26bc34e9f038f17e73756fa2b2cca9d7721f4d89e4af75-json.log","Name": "/sad_franklin","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": ["/home/ceshi:/home"],"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"Capabilities": null,"Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/66214b19402922b6df320c755c0408f5eb0e06b4b3af0a9efc3edf2bdcc7a7b0-init/diff:/var/lib/docker/overlay2/a197712d50b7a67a39b70e7ddda9d1dd07a21af6693750747175b501bf7e7466/diff","MergedDir": "/var/lib/docker/overlay2/66214b19402922b6df320c755c0408f5eb0e06b4b3af0a9efc3edf2bdcc7a7b0/merged","UpperDir": "/var/lib/docker/overlay2/66214b19402922b6df320c755c0408f5eb0e06b4b3af0a9efc3edf2bdcc7a7b0/diff","WorkDir": "/var/lib/docker/overlay2/66214b19402922b6df320c755c0408f5eb0e06b4b3af0a9efc3edf2bdcc7a7b0/work"},"Name": "overlay2"},"Mounts": [{"Type": "bind","Source": "/home/ceshi","Destination": "/home","Mode": "","RW": true,"Propagation": "rprivate"}],"Config": {"Hostname": "fb2ce0871f3f","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20201204","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "c5d709e6728405e250c9897439ec9f4f69ee571d689f706919b8840ad621208c","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/c5d709e67284","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "fafa2f601295119afeeec9f0f3c1092526e46fe7df34f54961a250e4c384aa41","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "b17bb849524a9addbf0eebc6576046d7e26e1f2dd1f900da5a3b88bcc006e277","EndpointID": "fafa2f601295119afeeec9f0f3c1092526e46fe7df34f54961a250e4c384aa41","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]

在容器下的home目录创建test.java,发现在本机的/home/ceshi/下也有该文件
测试说明,容器内添加了,会帮我们同步到外边

再来测试:
1.先停止这个容器
2.在宿主机修改文件
3.再次启动容器
4.容器中的数据依旧是同步的


好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

6.2实战:安装MySQL

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

[root@kikistudy home]# docker search mysql
# 获取镜像
[root@kikistudy home]# docker pull mysql:5.7
# 运行容器:需要做数据挂载!安装启动时,需要配置密码,这是注意点!
# 官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 命令解读
# -d 后台运行
# -p 端口映射
# -v 数据卷挂载
# -e 环境配置
# --name 容器名字
[root@kikistudy home]# 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=123456 --name mysql01 mysql:5.7# 启动我们的mysql
[root@kikistudy home]# 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=123456 --name mysql01 mysql:5.7
c76b6a616238e4b9a44c263ebb2770777f96ced5fa245d0568cd30be70f92515
[root@kikistudy home]# # 启动成功之后,我们在本地使用navicat测试连接,正常运行


回顾它是如何连接上去的:

# navicat 账号、密码、主机   连接到服务器的3310,和容器内的3306映射,这个时候我们就可以连接上了# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok# 假设我们将容器删除,发现挂载到本地的数据卷依旧没有丢失,这就实现了,数据持久化功能。
[root@kikistudy home]# docker rm -rf mysql01   #删除容器

6.2具名挂载和匿名挂载

6.2.1匿名挂载

# 匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx     # 这里只指定了容器内的名字,并没有指定容器外的名字,而下列的VOLUME NAME 就是匿名挂载[root@kikistudy data]# docker run -d -P --name nginx02 -v /etc/nginx nginx
d2d6e17945f4b9bf8676927e50ef7d12410140a1a958746d191ad48fc113ad47# 查看所有的卷的情况
[root@kikistudy data]# docker volume ls
DRIVER    VOLUME NAME
local     a16d50c40ac3ec32c2768737a222f16bad832b18f080dac7c08f258b65b0d2e6
local     ebee35b178c8815d828b96735c1b20ae314f451f6198b347f289f5d96cd7b81d# 这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径,并没有写容器外的路径!#具名挂载
[root@kikistudy data]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
9a34191d0710d585485ccf7c19f4f69d2c39e4468de1bec0e47b9ed3cc093b20
[root@kikistudy data]# docker volume ls
DRIVER    VOLUME NAME
local     a16d50c40ac3ec32c2768737a222f16bad832b18f080dac7c08f258b65b0d2e6
local     ebee35b178c8815d828b96735c1b20ae314f451f6198b347f289f5d96cd7b81d
local     juming-nginx
[root@kikistudy data]# # 通过 -v 卷名:容器内路径
# 查看一下这个卷
[root@kikistudy data]# docker volume inspect juming-nginx
[{"CreatedAt": "2020-12-31T17:04:45+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
[root@kikistudy data]# 


所有的docker容器内的卷,没有指定目录的情况下,都是在/var/lib/docker/volumes/卷名/_data
我们通过我们的具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载

# 如何区分是具名挂载还是匿名挂载,还是指定路径挂载

-v   容器内路径        #匿名挂载
-v  卷名:容器内路径  #具名挂载
-v  /宿主机路径:容器内路径    #指定路径挂载

拓展:

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

6.2.2初始DockerFile

DockerFile就是用来构建Docker镜像的构建文件!就是一段命令脚本!先体验一下!

方式二:

Java高级开发必备--Docker进阶(一篇详细教程,进阶Docker)相关推荐

  1. 网易云课堂微专业--Java高级开发工程师

    获取方式:公众号:文若课堂 ​ 5.微专业-java |    |──大纲.jpg          910.32KB |    |──阶段1:高性能编程专题 |    |    |──1.1.1 J ...

  2. 高级java开发_我最喜欢的Java高级开发人员书籍

    高级java开发 我上一篇博客文章 (我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的"面向高级Java开发人员的十大网站"的启发. Wa ...

  3. 我最喜欢的Java高级开发人员书籍

    我上一篇博客文章 (我对高级Java开发人员的十个最喜欢的在线资源)的想法是由Xiaoran Wang发表的针对高级Java开发人员的十大网站的启发. Wang还写了一篇名为<面向Java高级开 ...

  4. 近期Java高级开发岗面试总结

    原文出处:公众号:编程大道 作者:walking 近期Java高级开发岗面试总结 哈喽大家好,我是walking,这是我的公众号:编程大道. 很久没和大家见面了,文章更新的速度略有延后.这个公众号断断 ...

  5. 大牛分享,献出这份年薪68W的蚂蚁金服Java高级开发封神宝典!

    超级大牛经验分享,献出这份年薪68W的蚂蚁金服Java高级开发封神宝典! 干货奉上,不喜勿喷: 一.源码阅读 1.常用设计模式 2.Spring 5 源码 3.MyBatis源码 二.分布式架构总纲 ...

  6. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  7. Java高级开发工程师面试笔记

    最近在复习面试相关的知识点,然后做笔记,后期(大概在2018.02.01)会分享给大家,尽自己最大的努力做到最好,还希望到时候大家能给予建议和补充 ----------------2018.03.05 ...

  8. 你以为熬个3年工作经验就是Java高级开发了?

    到了年底了,很多公司又开始新一轮的招人了,很多人也在为年后的跳槽做准备. 如果把各大互联网公司的招聘信息拉出来看的话,基本都要求3年以上工作经验,Title也基本都是Java高级开发. 所以很多人就会 ...

  9. Java高级开发工程师面试考纲

    转自: http://buluo.qq.com/p/detail.html?bid=11148&pid=1064765-1470643028 如果要应聘高级开发工程师职务,仅仅懂得Java的基 ...

最新文章

  1. 未来2年,程序员如何吊打高学历工程师?服气!
  2. [学习笔记]树上莫队
  3. php伪静态框架,Nginx之php框架常见伪静态rewrite配置
  4. Sublime Text 3 配置python交互运行环境的快捷键
  5. python软件设置代码字体的大小_Pycharm4.5设置字体大小以及背景颜色的方法
  6. 每日学习小记 11/02
  7. mongodb 字符串转bson_MongoDB之bson的介绍
  8. protocol buffer java_Protocol Buffer Java实例
  9. TextBox多行输入时,屏蔽回车键
  10. 简单易懂实例说明如何设计子网掩码
  11. 【Android学习笔记】【Android学习资源】GitHub上史上最全的Android开源项目分类汇总
  12. MySQL源码调试入门
  13. BIM+智慧工地管理平台
  14. 黑客常见攻击方法与防护方法
  15. C语言程序设计现代方法-第二版-第10章练习题
  16. vue实现网络监控摄像头直播拍照功能
  17. 《分解因数》:质因数分解
  18. eplan 电箱布局_EPLAN电气图实例--控制柜(1)
  19. Maven Repository下载开源软件jar包
  20. dxf素材和dxf、plt、dst看图软件

热门文章

  1. 详解动态规划算法(Python实现动态规划算法典型例题)
  2. Java 轮询(重发)机制
  3. struts的框架介绍
  4. SpringBoot使用Logbook记录HTTP请求响应日志
  5. 解决找不到gpedit.msc文件方法
  6. 【报错】arXiv上传文章出现XXX.sty not found
  7. Wap与Net之争!!
  8. 论文投稿指南——中文核心期刊推荐(自然科学总论)
  9. ChatGPT如何提问?30句ChatGPT提问公式,快收藏
  10. UVa 12195 - Jingle Composing