本章内容

    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

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

  查看仓库:刷新一下即可

  

03 docker容器镜像基础的更多相关文章

  1. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  2. docker容器技术基础之联合文件系统OverlayFS

    我们在上篇介绍了容器技术中资源隔离与限制docker容器技术基础之linux cgroup.namespace 这篇小作文我们要尝试学习容器的另外一个重要技术之联合文件系统之OverlayFS,在介绍 ...

  3. 云原生之旅 - 12)使用 Kaniko 在 Kubernetes上构建 Docker 容器镜像

    前言 前一篇文章[云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents]有讲到在 Kubernetes Pod (Jenkins build agent ...

  4. 运行docker容器镜像

    docker容器可以理解为在盒中运行的进程. 这个盒包含了该进程运行所必须的资源,包括文件系统.系统类库.shell 环境等等. 但这个盒默认是不会运行任何程序的. 1.运行镜像之前,可以先查看本地有 ...

  5. Docker容器技术基础

    Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...

  6. 1、docker容器技术基础入门

    Docker和传统虚拟机的区别               参考文章: https://lwn.net/Articles/531114/    操作中的命名空间详解 https://blog.yadu ...

  7. Docker容器镜像瘦身的三个小窍门(转)

    [转自:http://dockone.io/article/8174] 在构建Docker容器时,我们应尽可能减小镜像的大小.使用共享层的镜像尺寸越小,其传输和部署速度越快. 不过在每个RUN语句都会 ...

  8. Docker容器技术-基础命令

    一.基础命令 1.运行一个镜像 [root@bogon ~]# docker run debian echo "Hello World" Unable to find image ...

  9. [Docker]容器镜像

     1.rootfs的基础知识 Mount namespaces 隔离的是文件系统挂接点,它使每个容器能看到不同的文件系统层次结构,即每当创建一个新容器时,希望容器进程看到的文件系统时一个独立的隔离环境 ...

  10. HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线

    HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...

随机推荐

  1. HTML基础知道了解

    第1章 Html介绍 1.Html和CSS的关系 1.1 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1.2 HT ...

  2. 常见的hash数据结构

    遍历 hash表是一种比较简单和直观的数据结构,在查找时也有很好的性能.但是hash表不能提供有序遍历,这个是其特性决定,所以不足为奇.但是,更为实际的一个问题是如果遍历整个hash表中的所有元素? ...

  3. vue _DAY1

    一.VUE概念? Vue.js  (打包工具Webpack) Vue.js 是最流行的前端框架(可以用于手机App开发,借助Weex) Vue.js 和 Angeular.React.js(React ...

  4. vue axios传值到后端报错问题

    原因:axios使用post方法传输数据给后端默认为json格式,会导致跨域问题 原理:qs是查询字符串解析和将对象序列化的库 qs.stringify()   将对象序列化成url的形式,以& ...

  5. Little Girl and Maximum Sum CodeForces - 276C - 差分

    给定一个数列 \(a= { a_1,a_2,...,a_n }\) 以及 \(q\) 次查询. 其中第 \(i\) 次查询如同:\(l_i, r_i\),意指求 \(\sum_{j=l_i}^{r_i ...

  6. VUE学习-编译到浏览器

    vue文件时怎样编译运行到浏览器的 http://www.manongjc.com/article/21832.html 通过vue-loader,解析.vue文件,在webpack解析,拆解vue组 ...

  7. EF特性

    1.EF的 Dbcontext有延迟查询得特性,(用using后就释放了.)在绑定得时候以及失效了.解决办法是toList().toList()是立即查询.但是toList()也有他的问题. 2.释放 ...

  8. C++ 单向链表手动实现(课后作业版)

    单向链表,并实现增删查改等功能 首先定义节点类,类成员包含当前节点的值和下一个节点的地址 /node definition template <typename T> class Node ...

  9. 转L:[JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)

    [JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇) JVM--Java虚拟机详解

  10. How to Check and Repair EXT4 Filesystem in Linux

    The fsck (stands for File System Consistency Check) is used to check and repair one or more Linux fi ...