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

[经验分享] Docker第三回(镜像的制作)

[复制链接]

尚未签到

发表于 2019-2-20 11:34:42 | 显示全部楼层 |阅读模式
  一、Docker的基础架构形式
  客户端(docker run |create等)通过httpd或https和一个运行了docker host守护进程的主机(docker daemon)通信。
  docker daemon接收到了客户端的创建或启动容器的命令后,将在本地查找镜像创建或启动容器(在一个docker host上可以启动多个容器)。

  如果本地没有镜像,docker host会连接到配置的远程repository(一般默认repo是docker hub)上下载镜像到本地的一个专用的文件系统,在docker1.18使用的是overlay2,之前使用的是aufs/btrfs/lxc。镜像本身是只读的。
  而后开始根据客户端命令创建或运行容器。
  1.1、docker镜像
  根据上面的架构,docker镜像是docker运行容器的一个重要的组件。docker镜像含有启动容器所需要的文件系统及其内容。因此,镜像的作用就是创建并启动docker容器,其特点是;
  1、采用分层构建机制,最底层为bootfs,其次为rootfs
  bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器系统启动完成会被卸载以节约内存资源
  rootfs:位于bootfs之上,表现为docker容器的根文件系统。每添加一个软件,都是一个独立的层
  在linux传统模式中,系统启动时,内核挂载rootfs时,会首先将其挂载为“只读”模式(为了避免自检遇到错误而删除文件),完整性自检完成后再将其挂载为读写模式
  在docker中,rootfs由内核挂载为“只读模式”,而后通过“联合挂载”技术额外挂载一个“可写层“。

  容器启动时,必须按照层次加载,首先挂载bootfs,系统启动之后,从内存中删除bootfs,挂载rootfs,其次依次挂载上面的image层,每个应用都是一个层,这下面的所有层都是只读的。而后,在最上层挂载一个可写层。(对于一个容器来说,它的写操作都只能在这个可写层来实现)。他们是叠加在一起挂载的,所以称之为联合挂载。

  当一个容器销毁时(执行docker container rm操作)它的可写层也将被删除掉。
  1.2、docker文件系统
  1、docker镜像的分层构建,联合挂载依赖于专有文件系统的支撑才能实现,在早期用到的专有文件系统是aufs(advanced multi-layered unification filesystem):高级多层统一文件系统,aufs是最早被docker用来实现联合挂载的linux文件系统,它是UnionFS的重新实现,2006年由junjiro Okajima开发。由于centos内核对aufs不支持,所以早期使用docker只能使用Ubuntu操作系统。

  2、aufs的竞争产品是overlayfs,从3.18版本开始被合并到linux内核
  3、除了aufs,docker还支持btrfs,devicemapper和vfs等
  在Ubuntu系统下,docker默认使用aufs,而早期在centos7中,用的是devicemapper,现在最新版本的dockercentos用的是overlayfs第二个版本;overlay2(overlay2是一种抽象的二级文件系统,需要借助于本地文件系统;xfs)
  1.3、docker registry
  我们去构建镜像时,镜像做好之后应该有一个统一存储的位置,这个位置叫docker registry


  1、docker registry分类
  Sponsor Registry:第三方的registry,供客户和Docker社区使用
  Mirror Registry:第三方的registry,只让客户使用,比如docker cn加速,阿里云的docker加速器

  Vendor Registry:由发布Docker镜像的供应商提供的registry,比如红帽,只提供给买了服务了客户使用
  Private Registry:私有的docker仓库,指用户自己搭建的docker仓库,只能供内部使用
  public docker registry:公共的docker仓库,一般没有做额外的配置,指的就是docker hub
  由于第三方registry的镜像大部分都不符合我们的使用要求,所以我们都要自建registry
  2、registry的组成
  Registry:

  •   由某特定的docker镜像的所有迭代版本组成的镜像仓库,
  •   一个Registry中可以存在多个Repository
  Repository可分为“顶层仓库”和“用户仓库”
  用户仓库名称格式为“用户名/仓库名”

  •   每个仓库可以包含多个Tag,每个Tag对应一个镜像
  Index:

  •   维护用户账户,镜像的校验以及公共命名空间的信息

  •   相当于为Registry提供了一个完成用户认证等功能的检索接口
  3、registry的拉取
  拉取镜像使用docker pull命令
docker pull [:]/[/]:  其中registry、port、namespace可省略
  registry:是一个仓库的web地址,如果不使用默认的docker hub仓库,需要指明仓库地址
  port:是仓库web地址的端口号,默认使用443
  namespace:代表是哪个用户的仓库,如果镜像是顶级仓库,namespace就是可省略的,namespace分为三类

  name:仓库的名字,和tag一起标识了一个唯一的镜像
  tag:镜像的标签,没有就代表是一个镜像的最新版

  其中,nginx为顶层仓库,jwilder/nginx-proxy为用户的仓库
  例如:
docker pull nginx:1.14        # 没有指仓库地址默认从docker hub上下载nginx1.14版本到本地
docker  pull  quay.io/coreos/flannel:v0.10.0-amd64        #  从quay上拉取镜像,coreos是namespace,flannel是仓库名,v0.10.0-amd64是tag  4、镜像的制作
  镜像的生成途径有三种


  •   Dockerfile
  •   基于容器制作
  •   Docker Hub automated builds
  4.1、基于容器制作镜像(在一个centos镜像中安装httpd并设置启动容器执行httpd命令)
  首先要启动一个容器,我去docker hub下载一个centos的镜像
  1、下载centos镜像并运行
[root@localhost ~]# docker image pull centos:6.6
6.6: Pulling from library/centos
f9f73d801f05: Pull complete
Digest: sha256:74727b849f5169d0de21848f8da9d47ea241757d6f89434f312813f723451ebd
Status: Downloaded newer image for centos:6.6
[root@localhost ~]#
[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               stable              ecc98fc2f376        2 weeks ago         109MB
centos              6.6                 4e1ad2ce7f78        3 weeks ago         203MB
redis               4-alpine            05097a3a0549        4 weeks ago         30MB
[root@localhost ~]# docker container run -p 5000:5000 --name centos1 -it centos:6.6 /bin/sh
sh-4.1#
sh-4.1#  2、在容器中安装httpd
sh-4.1# yum install httpd
...
...
...
Installed:
  httpd.x86_64 0:2.2.15-69.el6.centos                                                                                                                                                
Dependency Installed:
  apr.x86_64 0:1.3.9-5.el6_9.1        apr-util.x86_64 0:1.3.9-3.el6_0.1                 apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1       httpd-tools.x86_64 0:2.2.15-69.el6.centos      
  mailcap.noarch 0:2.1.31-2.el6       redhat-logos.noarch 0:60.0.14-12.el6.centos      
Complete!
sh-4.1#  3、编辑httpd主页文件并启动httpd
sh-4.1# echo "Welcom To My Httpd" >/var/www/html/index.html
sh-4.1# /usr/sbin/apachectl -D FOREGROUND
sh-4.1# curl 127.0.0.1
Welcom To My Httpd  4、修改容器启动执行的命令并制作镜像
[root@bogon ~]# docker commit -p -c 'CMD ["/usr/sbin/apachectl"," -D","FOREGROUND"]' centos1 httpd:1.1
sha256:bbffcf779dd42e070d52a4661dcd3eaba2bed898bed8bbfe41768506f063ad32
[root@bogon ~]#
[root@bogon ~]#
[root@bogon ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               1.1                 bbffcf779dd4        6 seconds ago       264MB                        # 这是刚才制作的httpd镜像
nginx               stable              ecc98fc2f376        2 weeks ago         109MB
centos              6.6                 4e1ad2ce7f78        3 weeks ago         203MB
redis               4-alpine            05097a3a0549        4 weeks ago         30MB5、直接启动刚才制作的镜像并验证httpd是否可以访问
[root@localhost ~]# docker container run --name centos2 -d httpd:1.1
868410465faaa3c3b89d84890e2fa8f76fe4d645075b6796299a24ccfb80be48
[root@bogon ~]# curl 172.17.0.2
Welcom To My Httpd

  6、查看运行的centos2的容器的详细信息
[root@localhost ~]# docker container inspect centos2
[
...
...
...
            "Cmd": [
                "/usr/sbin/apachectl",
                " -D",
                "FOREGROUND"
            ],
            "ArgsEscaped": true,
            "Image": "httpd:1.1",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
...
...
...
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "bb55b61b005b7191dd2c5dc67f58dbf5be6cd7d2b29b01fc9cee56fc97166920",
                    "EndpointID": "c4e1d785b5c463d9c99bf323ec07508fef364ff4be91f148e6f0ed7a9f96c4d6",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]  可以看到,CMD已经从运行/bin/sh变成了我改的运行httpd服务了。至此,基于容器的镜像已经构建成功
  5、镜像的导入和导出
  如果我们制作的镜像无法push到registry,那么可以使用镜像的导入和导出共享给其他人
  5.1、打包镜像
  docker save命令可以将你的镜像打包成压缩文件,由此共享给其他人
[root@localhost ~]# docker image ls                                                                        # 打包之前的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               1.1                 bbffcf779dd4        19 minutes ago      264MB
nginx               stable              ecc98fc2f376        2 weeks ago         109MB
centos              6.6                 4e1ad2ce7f78        3 weeks ago         203MB
redis               4-alpine            05097a3a0549        4 weeks ago         30MB
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker save -o myimages.gz httpd:1.1 nginx:stable centos:6.6 redis:4-alpine
[root@localhost ~]# ls myimages.gz
myimages.gz  5.2、删除现有的镜像
[root@localhost ~]# docker image rm httpd:1.1 nginx:stable centos:6.6 redis:4-alpine
Untagged: httpd:1.1
Deleted: sha256:bbffcf779dd42e070d52a4661dcd3eaba2bed898bed8bbfe41768506f063ad32
Deleted: sha256:dd73969752ff69c74c52136379013cff46f6cc2055e0bf46f64be5d336270dfd
Untagged: nginx:stable
Untagged: nginx@sha256:8b600a4d029481cc5b459f1380b30ff6cb98e27544fc02370de836e397e34030
Deleted: sha256:ecc98fc2f376d6560311b66d6958e4350a5a485ee07aa2d1235842d0bce440da
Deleted: sha256:1113e327b1235b943bc1e68ae9afa1fb663b4eb7527759ed28af36e0d2c2943e
Deleted: sha256:639da82d77d23ee8dedd6291b14f715af416d9cbf311b6f3ad982d7ce5a37c07
Deleted: sha256:237472299760d6726d376385edd9e79c310fe91d794bc9870d038417d448c2d5
Untagged: centos:6.6
Untagged: centos@sha256:74727b849f5169d0de21848f8da9d47ea241757d6f89434f312813f723451ebd
Deleted: sha256:4e1ad2ce7f78a77d914f18887130acd55778fbdd1bd3288f026ebd29181ec365
Deleted: sha256:da6517724f67fd4133a5bf508f7c79e20d8e2741c5b3264790d49db5e97c0e2e
[root@localhost ~]#
[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
[root@localhost ~]#  5.3、重新load回刚才的镜像
[root@localhost ~]# docker load -i myimages.gz
da6517724f67: Loading layer [==================================================>]  213.2MB/213.2MB
ddcb568d3d1e: Loading layer [==================================================>]  61.56MB/61.56MB
Loaded image: httpd:1.1
237472299760: Loading layer [==================================================>]  58.44MB/58.44MB
f4a5f8f59caa: Loading layer [==================================================>]   54.2MB/54.2MB
19c605f267f4: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: nginx:stable
Loaded image: centos:6.6
df64d3292fd6: Loading layer [==================================================>]  4.672MB/4.672MB
04c8ef03e935: Loading layer [==================================================>]  11.78kB/11.78kB
169a281fff0f: Loading layer [==================================================>]  2.192MB/2.192MB
742e4d74cbf8: Loading layer [==================================================>]  24.32MB/24.32MB
9e8211b509e6: Loading layer [==================================================>]  1.536kB/1.536kB
c51fc5b2384b: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: redis:4-alpine
[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               1.1                 bbffcf779dd4        28 minutes ago      264MB
nginx               stable              ecc98fc2f376        2 weeks ago         109MB
centos              6.6                 4e1ad2ce7f78        3 weeks ago         203MB
redis               4-alpine            05097a3a0549        4 weeks ago         30MB  5.4、重新运行镜像验证是否可以启动容器
[root@localhost ~]# docker container run  --name myhttpd -d httpd:1.1
ae29e544fbe614bca3109b94ec77afd55a29bd637280c88e703191edd80751fc
[root@localhost ~]#
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ae29e544fbe6        httpd:1.1           "/usr/sbin/apachectl??   8 seconds ago       Up 7 seconds        5000/tcp            myhttpd
[root@localhost ~]# curl 172.17.0.2
Welcom To My Httpd  镜像的上传到registry操作后续补上




运维网声明 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-674846-1-1.html 上篇帖子: docker之基础 下篇帖子: 『中级篇』docker之java容器运行外置springboot
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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