博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019/07/31 docker容器和镜像(03)镜像部分
阅读量:3923 次
发布时间:2019-05-23

本文共 5737 字,大约阅读时间需要 19 分钟。

docker启动容器完全依靠镜像在这里插入图片描述

分层构建和联合挂载,主要有两层
1.引导文件系统,bootfs,相当于内核,引导用户空间启动的,包括bootloader和kernel,容器启动完
成后会被卸载以节约内存资源;
2.rootfs真正意义上用户空间的根文件系统,位于bootfs之上,表现为docker容器的根文件系统;
传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式;
docker中,镜像是分层构建,rootfs由内核挂载为“只读”模式,而且一直是只读的,而后通过“联合挂载 ”技术额外挂载一个“可写”层;底下的内容始终都不会改变。所以可以被多容器共享,
而且是分层构建
第一层称为引导文件系统,是一个基本的操作系统,base image,基础镜像
第二层可以添加一些功能,比如编辑器,又多了层镜像
第三次添加httpd,三层镜像
上面的都是只读的
最后额外的附加一层是可写层,这种挂载方式叫联合挂载,每一层的下一层都是它的父镜像,基础镜像
在这里插入图片描述
联合挂载用的是Aufs
advanced multi-layered unification filesystem:高级多层联合文件系统/高级多层统一文件系统
用于为Linux文件系统实现“联合挂载”
aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发;
一直依赖没能被收录进内核源码树
Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持;
aufs的竞争产品是overlayfs,后者自从3.18版本开始被合并到Linux内核;
这些称为docker的存储驱动
docker的分层镜像,除了aufs,docker还支持btrfs, devicemapper和vfs等
在Ubuntu系统下,docker默认Ubuntu的 aufs;而在CentOS7上,用的是devicemapper(据说性能很差);
在这里插入图片描述
了解下device mapper(设备映射)即可,真正的硬件设备映射成逻辑设备,
底层的两个磁盘分区联合成一个,lvm就是这样,多个物理卷合成一个卷组,在卷组上分逻辑卷
这个就是把底层的物理设备和逻辑设备建立映射关系,不同的映射要依靠不同的驱动框架上的插件来实现
在这里插入图片描述
linear线性,能把两个加起来组成一个更大的设备,像raid0一样,raid0是一个条带
linear仅仅是吧两个联合成1个空间,没有条带的意思
mirror类似raid1
snapshot快照
multipath多路径,识别这两个设备其实链接的是同一个设备。(一根线容易断掉,就连两根线,但是平时认为两个线是两个设备,这两个设备祸害可以冗余)也可以负载均衡,类似网卡绑定一样
我们之间发分层驱动叫要用到device mapper snapshot来实现
snapshot有两种风格
在这里插入图片描述
假设组两个卷,每个卷10个G,第一个第二都用了5G,各自余下5G,这加起来10G空间只能供对应使用这个卷的一个设备来使用,已经分给它了,用或者不用都是它的,这个是传统解决方案在这里插入图片描述
可以使用thin provisioning,需要给一个应用分配存储空间时,告诉有10G可用,但是用多少给你多少,用的时候再给你分配,
稀疏格式的磁盘镜像,
创建10个虚拟机,每个虚拟机创建100G磁盘,整个磁盘空间才100G,但是这个照样能跑起来,因为并没有真正占用那么多空间,而是用多少给多少,thin provisioning
docker的镜像就是用了device mapper机制来完成所谓的分层构建功能,可以让每一个镜像文件,它所生成的空间都是要稀疏格式,而且映射为真正磁盘上,驱动上的空间即可
在这里插入图片描述
docker仓库所在地,有两种
第一在dockerdaemon所在本地上,需要一个storage driver 来存放文件,远程主机registry也需要这个驱动来存储镜像文件,
对docker registry而言,它自己可以仅提供index,
docker的registry有两部分组成
1.第一部分索引
2.一个又一个仓库,仓库中可以有很多镜像文件
对应的索引记录了哪一个仓库有多少个镜像文件,每个镜像的标签是什么都记录的很清楚,也包含这个镜像在哪个仓库,包括仓库访问路径和驱动,这个仓库是可以远程的
为了延展IO能力,有可能在较大的规模场景,把对应的镜像都放在分布式文件系统上,只需要在索引中指定,存在在分布式文件系统的那个位置即可
在这里插入图片描述
可以使用本地文件系统 和s3(亚马逊的云存储)
swift著名分布式解决方案
所以我们只提供一个索引
在这里插入图片描述启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地
;ɝ The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images.
在这里插入图片描述Registry用于保存docker镜像,包括镜像的层次结构和元数据
v 用户可自建Registry,也可使用官方的Docker Hub
v 分类
ɝ Sponsor Registry:第三方的registry,供客户和Docker社区使用
ɝ Mirror Registry:第三方的registry,只让客户使用,给dockerhub镜像做加速的
ɝ Vendor Registry:由发布Docker镜像的供应商提供的registry
ɝ Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

部署k8s就可以用k8s来部署在这里插入图片描述Repository

ɝ 由某特定的docker镜像的所有迭代版本组成的镜像仓库
ɝ 一个 Registry中可以存在多个Repository
ɰ Repository可分为“顶层仓库”和“用户仓库”
ɰ 用户仓库名称格式为“用户名/仓库名”
ɝ 每个仓库可以包含多个Tag(标签) ,每个标签对应一个镜像,镜像可以对应多个标签
Index索引
ɝ 维护用户帐户、镜像的校验以及公共命名空间的信息
ɝ 相当于为Registry提供了一个完成用户认证等功能的检索接口,(包含了用户认证,搜索等各种功能的统一的应用程序)
在这里插入图片描述
开发人员做成镜像push到私有仓库中,也可以push到公共仓库中,对于生产环境的主机只能从 是有仓库中pull下来,拖下来镜像启动容器在这里插入图片描述Docker Hub is a cloud-based registry service which allows you to link to code repositories, build your images and test them, stores manually pushed images, and links to Docker Cloud so you can deploy images to your hosts.

v It provides a centralized resource for container image discovery, distribution and change management, user and team collaboration, and workflow automation throughout the development pipeline.

使用方式跟github一样

dockerhub有这样几个核心组件
Image Repositories 镜像仓库
Automated Builds 自动构建 (docker的镜像构建方式,是基于基础镜像+dockerfile来构建,dockerfile扔到dockerhub上,就能调用Automated Builds,自动构建请求了)(类似构建rpm包,有spec文件里面定义如何去构建rpm包)
Webhooks web钩子
Organizations 组织
ɝ GitHub and Bitbucket Integration ,可以把github和dockerhub结合起来,dockerfile文本文件追踪依靠github来实现,所以在github上存储dockerfile追踪dockerfile的版本,dockerfile做好了可以推到dockerhub上,触发dockerhub的
Automated Builds来完成真正意义上的镜像构建
构建方式有两种,一种是基于容器,一种是基于dockerfile

在这里插入图片描述在这里插入图片描述

仓库,主机地址,端口默认是5000,/url(namespace名称空间)name是仓库名,tag是镜像名
The is a host that provides the docker-distribution service on
TCP (default: 5000)

ɝ Together, and identify a particular image controlled by at that registry

名称空间上用名称空间+仓库名的方式来控制裸仓库
ɰ Some registries also support raw ; for those, is optional
ɰ When it is included, however, the additional level of hierarchy that
provides is useful to distinguish between images with the same
名称空间的名字可以是组织名,用户名,角色名
这些都可以做名称空间隔离
这就是仓库的名称空间的格式
在这里插入图片描述在这里插入图片描述https://cloud.docker.com/repository/create在这里插入图片描述
镜像文件需要自己推上来,pushhttps://docs.docker.com/engine/reference/commandline/login/在这里插入图片描述
不给server地址就是登陆的官方hub
给某一个镜像加标签名称
原名+别名
https://docs.docker.com/engine/reference/commandline/tag/在这里插入图片描述
实例
在这里插入图片描述在这里插入图片描述把原有的镜像改成我们的名字,引用的时候可以用仓库和tag还可以image id,目标是dockr.oc/magedu用户/bbox仓库中的v0。1。0在这里插入图片描述
这个名称标识我们放在哪个repositry中,推可以用push往服务器推送
在这里插入图片描述
https://docs.docker.com/engine/reference/commandline/push/在这里插入图片描述在这里插入图片描述
不能推ID,ID无法理解,在这里插入图片描述在这里插入图片描述
想要在其他主机上使用这个镜像,就用pull

换一个主机试试pull在这里插入图片描述在这里插入图片描述

把仓库改成publichttps://docs.docker.com/engine/reference/commandline/push/在这里插入图片描述在这里插入图片描述在这里插入图片描述
Docker Hub:
docker login
docker logout
docker push 推送镜像
docker pull 拉取镜像
在这里插入图片描述

如何制作镜像在这里插入图片描述

镜像制作:有两种
基于容器制作
在容器中完成操作后制作;
基于镜像制作
编辑一个Dockerfile,而后根据此文件制作;

基于容器制作:

docker commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
–author, -a
–pause, -p
–message, -m
–change, -c

基于bbox运行起来一个容器后, 名字b1 -it 镜像地址 启动httpd服务,一定要跑在前台,-H指明网页文件的存放位置,-

p监听端口和IP,默认是本地所有地址,80
创建一个页面文件
在这里插入图片描述在这里插入图片描述
手动跑一下是否可以访问在这里插入图片描述
访问一下在这里插入图片描述
把进程kill掉在这里插入图片描述
接下来打算做一个镜像,这个镜像能够运行httpd,可以基于此容器来直接制作镜像
基于容器来制作镜像的命令是docker commit
https://docs.docker.com/engine/reference/commandline/commit/在这里插入图片描述
选项有作者名称,change应用一个dockerfile中的指令,改变某些默认特性
message提交时的注释
pause 创建容器的过程中先暂停容器
在这里插入图片描述
示例在这里插入图片描述
可以基于b1来创建在这里插入图片描述
-p创建过程暂停,-a作者,-c修改默认运行的命令 v0.1.1httpd就做好了
内容改了所以id就和原来的id不一样
在这里插入图片描述
现在可以推上去了 httpd -f是运行的程序在这里插入图片描述
rm代表没启动起来就删除了在这里插入图片描述
已经运行起来了在这里插入图片描述
但是没指明网页目录,先kill掉在这里插入图片描述
-h加上目录在这里插入图片描述
inspect可以查看对应容器的详细信息在这里插入图片描述在这里插入图片描述在这里插入图片描述
docker可以直接让容器以守护方式运行https://docs.docker.com/engine/reference/commandline/run/在这里插入图片描述在这里插入图片描述在这里插入图片描述
可以显示ip地址在这里插入图片描述
成功访问在这里插入图片描述在这里插入图片描述**基于容器制作:
docker commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
–author, -a
–pause, -p
–message, -m
–change, -c cmd指明要运行的命令是什么 ,传递给命令的选项]json格式的列表 **在这里插入图片描述
任何一个空白字符隔开的都需要用.逗号,当列表元素,基于b1来创建,打了标签docker。io/xxx/bbox:v0.1.2在这里插入图片描述
新版本的镜像在这里插入图片描述
没有进入bin/bash就默认运行了一个程序
附加查看运行的程序
exec在一个运行的容器中执行另外一个命令
在这里插入图片描述在这里插入图片描述
可以看到地址在这里插入图片描述

转载地址:http://tckgn.baihongyu.com/

你可能感兴趣的文章
JVM中的一个小知识点:深堆和浅堆的概念
查看>>
HashMap的负载因子初始值为什么是0.75?这篇文章以最通俗的方式告诉你答案
查看>>
详解java中一个面试常问的知识点-阻塞队列
查看>>
除了Thread和Runnable,你还知道第三种创建线程的方式Callable吗
查看>>
java线程面试题集锦(第一版本)
查看>>
记一次java中三元表达式的坑(避免踩坑)
查看>>
面试官:如何实现一个乐观锁(小白都能看得懂的代码)
查看>>
CopyOnWriteArrayList,一个面试中经常问到的冷门容器
查看>>
设计模式之桥接模式
查看>>
设计模式之组合模式
查看>>
java网络编程(1)基础知识点总结
查看>>
java网络编程(2)Socket编程案例(TCP和UDP两种)
查看>>
设计模式之享元模式
查看>>
深入分析java中的多态原理(jvm角度分析)
查看>>
SpringBoot系列(1)基础入门和案例
查看>>
设计模式之命令模式
查看>>
springBoot系列(2)整合MongoDB实现增删改查(完整版)
查看>>
java关键字(6)void
查看>>
面试必问:java中String对象为什么要设计成不可变的呢?
查看>>
深入分析java中的反射机制
查看>>