设为首页 收藏本站
查看: 1534|回复: 0

[经验分享] Docker 之 基于容器的镜像制作

[复制链接]

尚未签到

发表于 2019-2-21 09:00:48 | 显示全部楼层 |阅读模式
  1  概述

镜像包含启动容器所需的文件系统和内容,可以理解为打包的文件,用于创建并启动docker容器。
镜像的生成途径有三个:
1.基于dockerfile实现,镜像制作的程序文件
2.基于容器实现,启动容器后,将新的操作制作为新镜像
3.docker hub automated builds
镜像文件采用分层构建机制,最底层为bootfs,上面为rootfsrootfs上还可以有多层。位于最下层的镜像文件为父镜像(parent image,最底层为基础镜像(base imagerootfs为这一层,这一层必须存在).最上层为“可读写”层,其下的均为“只读”层
如下截图
DSC0000.jpg

其中:
bootfs:用于系统引导的文件系统,包含bootloaderkernel,容器启动完成后会被卸载以节约内存资源,可以理解为容器引擎,不是宿主机操作系统
rootfs:位于bootfs之上,表现为docker容器的根文件系统;
传统模式中,系统启动时,内核挂载rootfs时会首先将其挂载为只读模式,完整性自检完成后将其重新挂载为读写模式
docker中,rootfs由内核挂载为只读模式,而后通过“联合挂载”技术额外挂载一个“可写”层。联合挂载,需要文件系统支持,目前支持最好的文件系统为Aufs(advanced multi-layered unification filesystem),高级多层统一文件系统,用于为linux文件系统实现”联合挂载“,docker 最初使用aufs作为容器文件系统层,目前还作为存储后端之一来支持,目前没有基层到linux内核,需要对内核打补丁才能使用aufsdocker的分层镜像,除了aufs,还支持btrfs,devicemappervfs。在ubuntu系统下,docker默认支持ubuntuaufs,这也是为什么很多底层镜像都是ubuntu的原因,因为ubuntu更好的支持aufs.centos7用的是devicemapper.但是,devicemapper在性能上有问题。linux 在3.18版本后把overlayfs整合到内核里,docker-ce目前在centos7上支持的文件系统为overlay,使用overlay作为docker的后端存储机制,如果是按照extras源里的docker包,版本1.12,后端的存储为devicemapper文件系统
2  Regeistry介绍
Registry用于保存docker镜像,包括镜像的层次结构和元数据,RegistryRepositoryIndex两个组件组成
启动镜像时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,将从registry中下载该镜像并保存到本地。
registry是一个无状态,高可扩展的服务端应用程序,可以用于存储和分发docker 镜像。docker registry里,index是一个重要组件,让用户可以查询搜索到相关的镜像,同时index支持认证功能。
registry分为两种:
公共的registry,如docker hub,
私有化docker registry,自己搭建的registry。
通过应用程序包docker-distribution.x86_64 来实现私有registry搭建,在extras仓库中。这个软件没有web页面,也不支持认证。可以通过nginx配置反代,在nginx上实现认证
或者通过harbor这个软件才实现私有化仓库搭建,这个软件有vmware公司维护,企业级的容器registry,是在docker-distribution基础上添加功能实现的。建议用harbor创建私有registry(仓库)
3  Repository介绍
Repository是指由某特定的docker镜像的所有迭代版本组成的镜像仓库,一个Registry内部有多个Repository.其中,Repository可风味“顶层仓库”和“用户仓库”,用户仓库名称格式为“用户名/仓库名”。
每个仓库可以包含多个Tag(标签),每个标签对象对应一个镜像,可以手动打标签,如果和官方有冲突,以本标签地为准,统一镜像可以有多个标签,tag不一样,但是image id一样,便签配置命令如下,把busybox的镜像latest版本,再打一个标签为sunny01,则busybox同时有两个标签,image id一样
docker tag busybox:latest busybox:sunny014  Index介绍
用于维护用户账号,镜像的校验以及公共名称空间的信息
相当于为registry提供了一个可以完成用户认证等功能的检索接口
5  docker hub功能介绍
docker hub支持如下组件
image repositories:镜像仓库
automated builds:当修改原码仓库时自动构建镜像,只需要上传dockerfile就会构建镜像
webhooks:自动构建的属性之一,当成功推送一个文件到仓库后webhooks触发一个动作
organizations:工作组
github and bitbucket integration:和github整合起来,在github上开发,定义webhooks,当监控到github有新的推送后,自动执行构建镜像,完成镜像构建。
使用docker hub之外的第三方仓库,推送镜像,需要指定如下信息
向那个仓库的那个端口,哪个名称空间推送镜像,镜像名称和标签是什么,其中port默认为5000,命令如下
docker pull  [:]/[/]:6  基于容器制作镜像
制作镜像三个方法
1.基于容器制作
2.基于dockerfile实现,镜像制作的程序文件
3.Docker Hub Automated Builds
这里仅介绍基于容器制作镜像
1.基于容器实现
启动容器后,将新的操作制作为新镜像
例子
启动干净的镜像文件busybox,然后再容器内创建httpd的根目录和index.html文件,然后制作成行的镜像
启动容器,名称为sunny01img
docker run -it --name sunny01img busybox:sunny01
#在容器内进行修改
/ # mkdir -p /web/html
/ # cd /web/html
/web/html # vi index.html
this is sunny docker image,it is a nice day!在另一个终端,执行如下命令
docker commit -a "sunny" -p -m "for test commit image"  sunny01img用命令查看新生成的镜像

docker images
查看到有tag为none的新生成的镜像
将镜像推送到阿里云镜像仓库中
登录https://dev.aliyun.com,选择产品和服务--》容器镜像服务--》镜像仓库,创建一个本地仓库,名称为sunnytest
首先给本地镜像打标签
docker tag 3498bc48a842 registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb这里的镜像名称为新建的仓库名

将打了标签的镜像推送到阿里云,要先登录仓库


docker login registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest这里registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest 为新建的仓库名,输入账号为开发者平台的账号,密码为Registry登录密码,不是登录开发者平台密码

登录成功后,将镜像推送到阿里云仓库sunnytest上,把镜像推送到远程仓库,用push实现


docker push registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb这里的registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb是镜像名:tag

使用新的镜像来启动容器
新建一个标签
docker tag  3498bc48a842 websrv:sunnyweb01
将新的镜像websrv:sunnyweb01 运行为守护模式(-d,即后台),然后指定进程为httpd,前端运行模式(-f),指定家目录为/web/html
docker run --name sunnyweb01 -d websrv:sunnyweb01 httpd -f -h /web/html
查看
docker ps
查看到websrv:sunnyweb01镜像运行为容器sunnyweb01.
查看进程信息
docker top sunnyweb01查看详细容器信息

docker inspect sunnyweb01查看到当前的容器ip为172.17.0.3

测试httpd的服务
curl 172.17.0.3
改变容器的默认启动命令
在第一版新建镜像websrv:sunnyweb01的基础上创建第二版的镜像,
在另一个终端上,不执行默认的cmd,而是默认启动httpd服务
首先,先启动镜像,进入cmd,执行相关命令
docker run --name sunnyweb02 -it websrv:sunnyweb01
打开另一个shell终端,执行如下命令,生成一个新的镜像
docker commit -a "sunny " -p -m "web server" -c 'CMD  ["/bin/httpd","-f","-h","/web/html"]' sunnyweb02
注意,-c,修改运行中的命令,后接一个字典,所有的字段都要分别传递,用引号引用,逗号隔开,否则参数传递失败,导致镜像不能启动。
sunnyweb02是指当前要作为镜像的模板容器名称,如这里以sunnyweb02这个容器作为模板来创建新镜像
给新生成的镜像打标签
docker tag 990ff989b8fb registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb2.0经新生成的镜像推送到阿里云仓库

docker push registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb2.0启动镜像,容器名称为web2.0,并且运行在后台(-d)

docker run --name web2.0 -d registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb2.0测试

查看容器是否正常运行
docker ps查看容器的ip

docker inspect web2.0这里查看到ip 为 172.17.0.6

测试httpd服务


curl 172.17.0.6这个例子说明,制作镜像是可以-c改变默认的命令,而不是默认的sh命令,可以让容器基于新建镜像启动时运行指定的命令。

7  分发镜像文件
docker允许把镜像导入和导出,包括镜像的源属性信息和所有层存储为tar格式的打包文件,并在其他服务器导入该镜像,并运行
导出镜像
默认情况下,会把导出文件打印在屏幕,因此需要用参数-o来指定输入的镜像文件
命令如下


docker save -o /root/testsave.tar sunnytest3:1.0/root/testsave.tar 的镜像打包文件传到运行docker服务的10.10.10.73的服务器上



scp testsave.tar 10.10.10.73:/root 10.10.10.73上导入镜像

注意,确保 10.10.10.73安装docker,且运行docker服务,-i选项是指从tar备份文件输入,而不是从标准输入来输入数据
docker load -i testsave.tar
10.10.10.73运行导入的镜像sunnytest3:1.0,后台运行(-d)
docker run --name testload -d sunnytest3:1.0测试

容器启动成功后,运行一个httpd服务,因此用curl进行测试

curl 172.17.0.2以上用于分发需求较少的情况下使用,只能在数量不多,分发需求较少的环境实现。注意12版和17版命令有区别,17 docker image save / load

命令docker image --help来查看更多选项的介绍
用docker image history 查看镜像的操作历史

docker image history sunnytest3:1.0命令stats用来统计容器的数据,查看容器的资源利用状态,动态刷新,如容器的CPU,内存,网络等信息,如下命令,统计容器testload的信息

docker stats testload



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675133-1-1.html 上篇帖子: Docker 之 docker命令介绍 下篇帖子: docker 之 卷的概念
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表