本章内容

    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. fastadmin添加自定义按钮

    问题:关于fastadmin框架列表页面自定义按钮功能 案例:自定义一个同步数据的按钮 <a href="javascript:;" class="btn btn- ...

  2. 整合jUnit4和jUnit5

    整合jUnit4 1.引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...

  3. mysql实训

    MYSQL You have an error in your SQL syntax; check the manual that corresponds to your MySQL server v ...

  4. leetcode 94. 二叉树的中序遍历【时间击败99.19%】 【内存击败39.48%】

    public List<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer>al=new ArrayLis ...

  5. windows 批量杀进程

    1 import psutil 2 from subprocess import Popen, PIPE 3 4 process_name ="bsmr.exe,fxclient.exe,F ...

  6. 2022.3.9内部群每日三题-清辉PMP

    1.项目经理集合在地理上分散的团队,为一家组织实施新的强制性监管要求.若要获得该相关方的承诺,项目经理应该怎么做? A.设置必要的沟通基础设施 B.召开项目启动大会 C.执行相关方分析 D.让团队集中 ...

  7. MSSQL 查看数据库所有的触发器

    SELECT object_name(a.parent_obj) as [表名] ,a.name as [触发器名称] ,(case when b.is_disabled=0 then '启用' el ...

  8. 「SOL」序列 (LOJ/NOI2019)

    准备写新博客的时候发现自己草稿箱里还有一篇咕了十几天的题解 思路挂在了费用流之前-- 题面 > Link LOJ #3158 解析 这道题的本质是一个二分图带权匹配的问题,一个经典的做法是直接做 ...

  9. noi 1.5 28 分离整数的各个数位

    描述 给定一个整数,要求从个位开始分离出它的每一位数字. 输入 输入一个整数,整数在1到100000000之间. 输出 从个位开始按照从低位到高位的顺序依次输出每一位数字.数字之间以一个空格分开. 样 ...

  10. SpringBoot怎么管理封装java包的关系

    首先SpringBoot直接写注解加依赖就可以了,基本上不用写xml,非常方便,在这里我只写了两个核心包 为什么选择jar类型? SpringBoot基本上是个应用程序了,只要用java命令程序去运行 ...