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

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

  查看仓库:刷新一下即可

  
原文地址:https://www.cnblogs.com/BurnovBlog/p/11177818.html