docker02:镜像原理、镜像commit、容器数据卷、容器数据共享

联合文件系统
在这里插入图片描述
共用内核,所以速度快
在这里插入图片描述
在这里插入图片描述
docker镜像是一层一层嵌套的,比如说tomcat镜像,需要linux内核,外包centos,jdk’,最后是tomcat,这样就构成了一个linux环境下的精简tomcat

在这里插入图片描述
特点
Docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

自我总结

docker镜像,比如说tomcat镜像,当从仓库拉取后,它会把相关联的镜像都拉取过来,一层套一层,最外层就是tomcat镜像,
tomcat镜像run后就成为容器,只能对最外层的tomcat容器层进行读写操作,
而它所依赖到的内部的其他镜像,是只读的。比如说相关联的拉取了jdk镜像,那么 当再拉取其他依赖jdk的镜像时,将不会再去拉一份jdk镜像,而会直接使用拉取tomcat镜像时拉取到的jdk镜像,实现了共享资源

docker commit

[root@localhost ~]# docker run -it -P tomcat:8.5.32    # -P会随机分配对外暴露的端口
[root@localhost ~]# docker run -it -p 8888:8080 tomcat:8.5.32  # 8080为默认端口,8888是指定的对外暴露端口

实验

故意把tomcat中的docs删除
在这里插入图片描述

[root@localhost ~]# docker exec -it 5b3c2d6e195e /bin/bash
root@5b3c2d6e195e:/usr/local/tomcat# pwd
/usr/local/tomcat
root@5b3c2d6e195e:/usr/local/tomcat# ls
LICENSE  RELEASE-NOTES	bin   include  logs	       temp	work
NOTICE	 RUNNING.txt	conf  lib      native-jni-lib  webapps
root@5b3c2d6e195e:/usr/local/tomcat# cd webapps
root@5b3c2d6e195e:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@5b3c2d6e195e:/usr/local/tomcat/webapps# rm -rf docs
root@5b3c2d6e195e:/usr/local/tomcat/webapps# ls
ROOT  examples	host-manager  manager

在这里插入图片描述
将已经删除了docs文档的tomcat容器克隆一个镜像

[root@localhost ~]# docker commit -a="sjg" -m="tomcat without docs" 容器ID atguigu/mytomcat:1.2

在这里插入图片描述
运行这个镜像

[root@localhost ~]# docker run -it -p 8081:8080 atguigu/mytomcat:1.2

此时浏览器访问tomcat,发现Document没有页面404

所以,我们可以通过commit命令来将容器来生成新的镜像,方便自定义

容器数据卷 -v

解决数据的持久化,数据共享

实验

首先检查centos容器的根目录
在这里插入图片描述
在这里插入图片描述
检查主机的根目录
在这里插入图片描述
执行命令

[root@localhost /]# docker run -it -v /myDataVolume:/dataVolumeContainer centos  # 新开容器,在主机根目录新建/myDataVolume,centos容器中新建了/dataVolumeContainer

可以看到容器和主机上产生新目录
在这里插入图片描述
在这里插入图片描述
这样主机和容器就可以进行数据共享

查看主机配置json
在这里插入图片描述
在这里插入图片描述
在主机上新建host.txt文件
在这里插入图片描述
可以看到容器中也有了该文件
在这里插入图片描述
这样,当容器关闭后再重启,数据得到了持久化,并且在主机上对应文件夹下数据的修改,会同步到容器中

限制操作

[root@localhost /]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos  # 加了:ro, ro表示read only

加了ro之后,在主机上可以读写文件到容器,但是容器内只能读文件,不能进行插入修改文件内容,不能新建文件

使用dockerFile添加数据卷

dockerFile:类比于java文件编译得到class文件,dockerFile是对docker镜像的描述文件

出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

[root@localhost /]# mkdir /mydocker
[root@localhost /]# cd mydocker/
[root@localhost mydocker]# pwd
/mydocker
[root@localhost mydocker]# vim Dockerfile   # 新建dockerfile文件
[root@localhost mydocker]# ll
total 4
-rw-r--r--. 1 root root 134 Jul 17 09:44 Dockerfile
[root@localhost mydocker]# docker build -f /mydocker/Dockerfile -t sjg/centos .

dockerfile文件内容

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

这样就开始构建镜像,构建出的镜像默认就有两个容器卷
在这里插入图片描述
运行这个镜像

[root@localhost mydocker]# docker run -it sjg/centos

发现容器中根目录下有两个容器卷
在这里插入图片描述
我们在卷1中新建一个文件container01.txt

查看宿主机中的配置信息:docker inspect 容器ID
在这里插入图片描述
可以看出,两个容器卷会在宿主机中生成默认的对应数据卷
即/var/lib/docker/volumes/

找到对应的数据卷,会发现也有刚才容器中数据卷新建的文件
在这里插入图片描述

volumes-from 依赖共享

建立父容器dc01
dc02继承自dc01,会发现容器卷中同样有文件 在这里插入图片描述
接着在dc02的卷中添加文件,新建容器dc03继承dc01,可以看到三个容器中数据卷是共享的
在这里插入图片描述
这时如果我们把dc01容器删除,会发现dc02,dc03依然可以进行数据共享
而且虽然dc03是继承自dc01,但是dc02的修改同样会共享到dc03
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值