zoukankan      html  css  js  c++  java
  • 03 docker容器镜像基础

      本章内容

        1、docker镜像基础

        2、docker环境下使用的文件系统

        3、registry(仓库)

        4、获取镜像

        5、制作(生成)并上传镜像

    ---------------------------------------

      镜像是作为docker环境的核心内容,一帮情况下,我们都需要根据工作环境来定制镜像文件,这就对于运维人员提出了很高的要求;

    1、docker镜像基础

      docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器采用分层构建机制,最底层的bootfs,其之为rootfs;

      docker镜像的分层结构,如下:

      首先,我们需要了解bootfs ,它是用于引导文件系统的,包含有bootloader和kernel,容器启动之后就会将其卸载下来;(这里就是为了去加载内核,内核加载完成就可以卸载,以节约资源)

      其次,rootfs 位于bootfs之上,它就是docker容器的根文件件系统,是每个容器的根;

        1、在传统系统模式中,系统启动时,内存挂载在rootfs“只读”模式,完整性自检完成后将其重新挂载为读写模式;(系统启动知识)

        2、docker中,rootfs由内核挂载为“只读”模式,而后通过”联合挂载“技术额外挂载一个”可写”层;

      最后再在rootfs上面去挂载编译环境(编辑器emacs),以及应用程序,而这两层都是“只读”层,如果需要修改,我们再在最上层挂载writable读写层。也就是我们的container;

    【这里我们需要知道,下层是可以多次使用的,可以同时关联于多个writable层上,这样的话,下层可以重复利用】

      

      如上图:

      Apache 运行在一个纯净的 debian上面运行,在系统上使用一个编辑器 - emacs;
      bootfs在内存中挂载后,之后被移除掉;
      debian-emacs-apache 这三层用来启动服务,并且一起挂载--这就叫做联合挂载;这三层是可以多个用户同时共享使用的;
      但是,如果想写入文件,则不能再接写在这三层中,而是再加一层 writable ,专门用来提供给各个用户来进行写入数据;

    2、docker环境下使用的文件系统

      此时,基于docker镜像的工作原理,我们使用原有传统的数据组织方式(文件系统)是不适用的,所以我们使用了新的文件系统来满足docker容器技术;

      其中包括三种技术:aufs  overlayfs  devicemapper(dm)

      其中,devicemapper使用的是dm的模块来实现,而并不是修改了文件系统,在生产环境下,我们建议使用overlayfs的文件系统来实现docker技术;

      Aufs

        用于为Linux文件系统实现“联合挂载”,aufs是之前UnionFS的重新实现,2006年由Junjiro Okajima开发;docker使用之初是用aufs作为文件系统层,它目前仍然作为存储后端之一来支持;

        它的竞争产品overlayfs,后来从3.18版本开始被合并到Linux内核;docker;

        而aufs一直不是内核中自有的文件系统。它因为代码太乱了,3万行太多,没有写入内核;如果需要,则必须打补丁升级;而Ubuntu则是将aufs写入内核了;

      overlayfs

        相对于aufs,overlayfs则要优秀的多,它已经被写入到Linux内核,默认启动docker,只要支持overlayfs,则就回使用这种方式来创建docker环境;

      devicemapper

        在没有使用上面两种文件系统的系统程序中,去启动docker进程,则是使用该方式来实现的;它是借助 dm 模块(和lvm技术是同一个模块)来实现,而不是依靠文件系统;

        所以这种方式非常的不稳定,不建议使用;但是在3.18内核之前的版本,redhat系列的Linux操作系统不支持aufs和overlayfs,就会使用该方式来实现docker环境;

      查看我的docker环境:

    docker info

    3、registry(仓库)

      镜像文件是从registry(仓库)中获取;

      在启动容器时(run),docker daemon会同时从本地获取相关的镜像文件,如果本地没有这个镜像文件,服务器就回直接去对应的公网仓库中去下载;

      仓库的分类:

        sponsor Registry  第三方仓库,供客户和docker社区使用

        mirror Registry  第三方仓库,只让客户使用

        vendor Registry  由发布docker镜像的供应商提供的registry

        private Registry  通过设有防火墙和额外的安全层的私有实体提供的registry

      tag标签:

        对于仓库,可以定义标签tag,每个仓库可以有多个标签,但是,一个标签是不能属于多个仓库的;

      index索引:

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

        相当于为registry(仓库)提供了一个完成用户认证等功能的检索接口;

     

    4、获取镜像

      我们获取镜像,通过 docker 命令的子命令 pull 来实现;

      用法如下:

        docker pull registry[:<port>]/[namespace/]<name>:<tag>

      

      示例:下载一个镜像文件;

      我们通过第三方的仓库来下载我们所需要的镜像文件: https://quay.io

      搜索 flannel ;这是云环境下最常用的一个网络部署系统镜像文件;

      点击“coreos/flannel”进入下载界面: 在右下角可以复制镜像地址,进入镜像下载界面

      这里,我们一定要指定tag,如下图查看tag:

      下载镜像:

    docker pull quay.io/coreos/flannel:v0.11.0-arm

      查看镜像:

    docker images

    5、制作(生成)并上传镜像

      镜像生成途径有两种:1、dockerfile 2、基于容器制作

      其中dockerfile是我们最常用的镜像制作方式,而且是docker容器的核心,我们需要通过dockerfile自己定义镜像,自己定义仓库;

      这里我们先通过容器技术来配置:

        我们通过子命令commit来通过容器制作镜像;

         docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

          -a --author 指定作者

          -c --change  应用dockerfile的指令来创建镜像

          -m --message 添加消息信息

          -p --pause  创建镜像的时候,需要暂停容器

      a首先我们运行一个容器

        我们这里首先通过 pull 命令下载一个busybox的容器,启动这个容器

    docker run --name b1 -it busybox

      b启动busybox的http服务

    / # mkdir -p /data/html
    / # vi /data/html/index.html
    <h1>Busybox httpd server</h1>
    / # busybox httpd server

      查看busybox地址:

      从新开启一个 ssh 远程接口,查看http服务:

    curl 172.17.0.2

      c保存镜像

    docker commit -p b1  //制作新的镜像

    docker images //查看制作的镜像

      我们可以为新的镜像文件添加标签:

        通过子命令 tag 来实现

    docker tag 6l6b37df33a7 test/httpd:v0.1  //添加标签需要指定镜像id

      删除镜像,我们可以通过 images 子命令来实现

    docker images rm test/httpd:v0.1

      我们这里就不删除了

      d我们可以运行这个镜像

      操作如下: 这里,我新添加一个容器--b1.1,使用的就是我们创建的镜像,同时,我们可以 cat /data/html/index.html 文件,这样,我们就能够看到之前编辑的文件;

      e指定默认容器启动的服务

      这里我们启动的容器后,还需要指定启动httpd服务,但是,如果我们默认就需要镜像启动httpd的服务,这里,我们也可以通过commit子命令来实现;

    docker commit -a "test <test@admin.com>" -c 'CMD ["/bin/httpd","-f","-h","data/html"]' -p b1 test/httpd:v0.2

      此时,则创建了一个新的镜像,我们再启动这个镜像:

    docker run --name b1.2 -it test/httpd:v0.2
    docker inspect b1.2 //查看地址

      查看服务:

      查看容器:

        在这里,我们可以看到,我们指定的默认启动命令;

      f上传镜像到公网仓库

      根据上面的内容,我们已经为自己制作了对应的镜像文件;我们可以将自己制作的镜像文件上传到公网仓库,提供给别人下载;

      首先,我们需要去dockerhub.com上面注册账号:

      注册完成以后,登录dockerhub.com网站

      在该界面下,去创建自己的仓库;

        1、指定仓库名称 2、指定仓库描述 3、指定镜像是否公开

      

      最后创建即可:

      有了自己的公有仓库,这时候,我们就可以将自己的镜像文件上传到仓库中:

        pull 子命令为下载镜像,同样的 push 命令就是上传进项;

        在上传之前,我们需要登录到自己的公网仓库,这个操作通过 login 操作来完成;

    docker login -u burnov

        提示登录成功后,我们就可以上传镜像了

       注意:这里有个问题--上传镜像我们一定要让仓库名称,登录名称对应上:

        上图是我们仓库的名称,所以,我们的镜像名称也需要修改过来

    docker tag test/httpd:v0.2 burnov/httpd:v0.2

        这里,burnov/httpd 中 burnov为用户名,而httpd为仓库名;v0.2为tag标记;

      再次上传镜像

    docker push burnov/httpd:v0.2

      这样就能上传镜像到仓库;

      查看仓库:刷新一下即可

      
  • 相关阅读:
    小白专场-堆中的路径-python语言实现
    小白专场-堆中的路径-c语言实现
    集合及运算
    哈弗曼树与哈夫曼编码

    线性结构之习题选讲-ReversingLinkedList
    小白专场-是否同一颗二叉搜索树-python语言实现
    微信公众平台开发教程第1篇-新手解惑(转)
    GIT GUI的使用(转)
    Git操作指南(2) —— Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并(转)
  • 原文地址:https://www.cnblogs.com/BurnovBlog/p/11177818.html
Copyright © 2011-2022 走看看