Docker镜像
一:Docker镜像1.1联合文件系统(UnionFS)1.2Docker镜像加载原理1.3Docker的分层结构1.4 Docker commit命令1.5本地镜像发布到阿里云1.6拉取阿里云的镜像1.7搭建私服仓库1.7.1给原生ubuntu安装ifconfig命令1.7.2.将容器生成镜像文件1.7.3cur验证私服库上有什么镜像1.7.3将镜像设置苏荷私服库的规范1.7.3修改配置文件使之支持http1.7.4上传1.7.5拉取1.8容器卷1.8.1宿主机和容器的数据备份1.8.2 查看容器是否挂载1.8.3 容器挂掉数据是否还能同步1.8.3 容器卷的读写规则1.8.3 容器卷的继承一:Docker镜像
镜像:是一种轻量级的。可独立执行的软件包,他包含某个软件运行的所需所有的内容,我们把应用程序和配置依赖打包形成一个可交付的运行环境(包括代码,运行时所需要的库,环境变量和配置文件等),这个打包好的运行环境就是image镜像文件1.1联合文件系统(UnionFS)
UnionFS(联合文件系统):是一种分层,轻量级并且高性能的文件,他支持对文件系统的修改为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。Union文件系统是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种的具体应用镜像特性:一次性同时加载多个系统文件,但从外面看来,只能加载一个文件系统,联合加载会把各层文件系统叠加,这样最终的文件系统还会包含所有底层的文件和目录1.2Docker镜像加载原理
docker的文件由一层层的文件系统组成,这种顶级的文件系统UnionFSbootfs主要包含bootloader和kenrel,bootloader主要是引导加载kernel,Linux刚启动会加载bootfs文件系统,在docker镜像的最底层是引导文件系统,bootfs。这一层与我们典型的Linux/Unix的系统是一样的,包含boot加载器和内核,当boot加载完完成之后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统会卸载bootsrootfs,在bootfs之上,包含的就是典型的linux系统中的/dev/proc/bin/etc等标准目录和文件,rootfs就是各种不同操作系统的发行版,比如ubuntu,centos等平时我们安装ubuntu要好几个g,在docker只要72.8MB对于精简版,rootfs很小只需要包括最基本的命令,工具和程序就行了,因为底层用host的kernel,自己只需要提供rootfs就行了由此可见对于不同的linux发行版,bootfs基本上是一致的,roootfs会有所差别因此不同的发新版可以共用bootfs总结:用不到的非核心的非必要的统统不会加载,只要最核心的linux内核,vim等等命令都没有
1.3Docker的分层结构
分层结构最大的一个好处就是共享资源,就是为了复用
比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保留一份base镜像
同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享
PS:docker的镜像层是只读的,只有容器层是可写的,当容器启动的时候,一个可写层被加载到镜像的顶部,这一层通常被称"容器层",“容器层之下的都是镜像层”
1.4 Docker commit命令
提交容器副本,使之称为一个新的镜像演示ubuntu安装vim命令1)从hub上下载ubuntu到本地并成功运行2)原始的ubuntu是不带着vim命令的3)安装vim3.1)apt-get update3.2)apt-get -y install vim再开一个窗口
我们想将刚才添加的vim的ubuntu给添加到我们的镜像中
公式: docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]例:docker commit -m="vim cmd add" -a="lxy" 51a153e11f69 lxy/ubuntu:1.5
1.5本地镜像发布到阿里云
阿里云地址
创建命名空间
创建本地仓库
开始推送镜像文件
docker login --username=你的名字 -
2.将要推送的版本号和id设置好docker tag [ImageId] -/lxybj/myubuntu:[镜像版本号]
3.进行push 操作docker push -/lxybj/myubuntu:[镜像版本号]
上传成功
1.6拉取阿里云的镜像
docker pull -/lxybj/myubuntu:[镜像版本号]
拉取成功
1.7搭建私服仓库
docker pull registry 运行私有库Registry相当于本地有个私有的Docker hub运行命令:mkdir /usr/local/dockerdocker run -d -p 5000:5000 -v /usr/local/docker/:/tmp/registry --privileged=true registry大致意思:后台运行,暴露端口5000
默认情况下,仓库被创建在容器的/var/lib/registry的目录下,建议自行用容器卷映射方便联调
1.7.1给原生ubuntu安装ifconfig命令
测试给原生ubuntu安装ifconfig命令
# 打开buntudocker run -it ubuntu /bin/bash#输入ifconfig 发现没有这个命令#更新ubuntu环境apt-get updateapt-get install net-tools
1.7.2.将容器生成镜像文件
#再开一个窗口公式: docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]docker commit -m="ifconfig cmd add" -a="lxy" b447a73d7b8f lxy/ubuntu:1.6
1.7.3cur验证私服库上有什么镜像
curl -XGET http://本机ip:运行私库对外暴露的端口/v2/_catalog例:curl -XGET http://192.168.116.126:5000/v2/_catalog
里面是没有数据的
1.7.3将镜像设置苏荷私服库的规范
docker tag 镜像名字:镜像的TAG 本机ip:暴露端口/名称:版本例:docker tag lxy/ubuntu:1.6 192.168.116.126:5000/lxyububtu:1.6
1.7.3修改配置文件使之支持http
docke默认不允许http的方式推送镜像,通过配置来解决,如果不生效建议重启vim /etc/docker/daemon.json#第一个是使用阿里云加速器#第二个是取消默认不允许http推送#配置自己的主机ip+私库对外暴露的端口{"registry-mirrors": ["https://2enjiwe3."],"insecure-registries":["192.168.116.126:5000"]}
#重启systemctl restart docker # 再次运行docker run -d -p 5000:5000 -v /usr/local/docker/:/tmp/registry --privileged=true registry
1.7.4上传
push数据docker push 192.168.116.126:5000/lxyububtu:1.61.7.5拉取
删除上传之前的数据docker pull 本机host:端口/镜像名字:版本号例:docker pull 192.168.116.126:5000/lxyububtu:1.6
运行,验证,成功
1.8容器卷
Docker挂载主机目录访问,如果出现cannot open directory…permission denid解决办法:在挂载目录后多加一个- - privileged=true参数即可如果是cenos7安全模块会比系统版本加强,不安全的会先禁止,所以目录挂载的情况会被认为不安全的行为,在seLinux里面挂载目录被禁掉了,如果要开启一般使用- - privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限上面启动私有仓库的时候docker run -d -p 5000:5000 -v /usr/local/docker/:/tmp/registry --privileged=true registrydocker后台运行registry通过-p映射出5000的端口, -v是宿主与容器的映射,就是一种数据持久化的方式有点类似于redis里面的aof和rdb文件容器卷设计的目的就是用于数据的持久化,完全独立于容器的生命周期,因此docker不会在容器的删除时,删除其挂载的数据
1.8.1宿主机和容器的数据备份
docker run -it --privileged=true -v/宿主机的绝对路径:/容器目录 镜像名例:docker run -it --privileged=true -v/usr/local/ubuntu:/usr/local/ubuntu --name u1 ubuntu作用:将ubuntu的/usr/local/ubuntu 目录,映射到本机的/usr/local/ubuntu
在ubuntu的文件,成功映射到了主机
在主机创建的文件也同时会映射进ubuntu的容器中
1.8.2 查看容器是否挂载
docker inspect 容器id例:docker inspect 8103e67e0762
1.8.3 容器挂掉数据是否还能同步
#将容器停止# 在/usr/local/ubuntu下新建touch as.txt#此时我们的容器是停止状态,开启容器docker start 8103e67e0762 #进入交互docker exec -it 8103e67e0762 /bin/bashcd /usr/local/ubuntu/
发现数据存在1.主机修改容器同步2.容器修改主机同步3.容器关闭,主机同步
1.8.3 容器卷的读写规则
docker run -it --privileged=true -v/宿主机的绝对路径:/容器目录 镜像名#默认是docker run -it --privileged=true -v/宿主机的绝对路径:/容器目录:rw 镜像名
默认是可读,可写的限制容器实例内部只能读不能写
docker run -it --privileged=true -v/宿主机的绝对路径:/容器目录:ro 镜像名例:docker run -it --privileged=true -v/usr/local/ubuntu:/usr/local/ubuntu:ro --name u1 ubuntu
无法创建文件,但是可以读取主机传递来的文件
1.8.3 容器卷的继承
- 先关联一个ubuntudocker run -it --privileged=true -v/usr/local/ubuntu:/usr/local/ubuntu --name u1 ubuntu# 查看诗句是否成功映射ll /usr/local/ubuntu/#与容器映射docker run -it --privileged=true --volumes-from 父容器名字或id--name u2 ubuntu例:docker run -it --privileged=true --volumes-from 41c4d9ca643a --name u2 ubuntu
u2可以查到u1的数据
在u2创建的文件在u1和主机上都会有 显示