Docker镜像
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
Docker镜像加载原理
UnionFS (联合文件系统)
bootfs:
rootfs
分层理解
特点
Docker的镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常多说的容器层,容器之下的都叫镜像层!
commit镜像
docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[tag]
实战测试
#1、启动一个默认的tomcat
#2、发现这个默认的tomcat,没有webapps应用,镜像的原因
#3、自己拷贝进去了基本的文件
#4、将我们操作过的容器通过commit提交为一个镜像,我们以后就使用我们修改过的镜像即可,这就是我们自己的镜像。
docker commit -a=“kuangshen” -m=“add webapps app” 容器id 镜像名:版本
容器数据卷
什么是容器数据卷
容器之间可以有一个数据共享的技术! docker容器中产生的数据可以 同步到本地
这就是卷技术 目录的挂载,将我们容器内的目录,挂载到Linux上面
容器的持久化和同步操作!容器间也可以数据共享
使用容器数据卷
方式一:直接使用命令来挂载 -v
dockerrun -it -v 主机目录:容器内目录
#测试
ji@ji-VirtualBox:~$ docker run -it -v /home/ji/ceshi:/* centos /bin/bash
保持文件的同步,可以保持双向的同步,以后修改只需要在本地修改即可,容器内会自动同步
具名和匿名挂载
#匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx
-P 表示随机映射端口
#查看所有的volume的情况
docker volume ls
#这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径
#具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
#通过-v 卷名:容器内路径
#查看具体位置
docker volume inspect juming-nginx 根据自己的卷名进行修改
docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
扩展
#通过 -v 容器内路径:ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v juming-ngin:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-ngin:/etc/nginx:rw nginx
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部都是无法操作的
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!通过这个脚本可以生成镜像,镜像是一层层的,脚本是一个个的命令
#创建一个dockerfile文件,名字可以随机 建议dockerfile
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end------"
CMD /bin/bash
数据卷容器
多个mysql同步数据!
docker run -it --name docker01 kuangshen/centos:1.0 #创建容器并运行
docker run -it --name docker02 --volumes-from docker01 kuangshen/centos:1.0 #将docker02挂载与docker01 可以实现数据的同步
多个mysql可以实现数据共享