联合文件系统
共用内核,所以速度快
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