什么是docker镜像

Docker镜像是由文件系统叠加而成。

  • 最底端是一个引导文件系统,即bootfs:

    • 这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导文件系统有什么交互。实际上,当一个容器启动后,它将会被移到内存中,而引导文件系统则会被卸载(unmount),以留出更多的内存供initrd磁盘镜像使用。
  • Docker镜像的第二层是root文件系统rootfs:

    • 它位于引导文件系统之上。rootfs可以是一种或多种操作系统(如Debian或者Ubuntu文件系统)。

在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它才会被切换为读写模式。但是在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载(union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像(parent image),可以一次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像(base image)。最后,当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。我们想在Docker中运行的程序就是在这个读写层中执行。

当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想要修改一个文件,这个文件首先会从该读写层下面的只读层复制到读写层。该文件的只读层版本依然存在,但是已经被读写层中的该文件副本所隐藏。通常这种机制被称为写时复制(copy on write),这也是使Docker如此强大的技术之一。每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。在上一章我们已经知道,容器可以修改,它们有自己的状态,并且是可以启动和停止的。容器的这种特点加上镜像分层框架(image-layering framework),使我们可以快速构建镜像并运行包含我们自己的应用程序和服务的容器。

镜像管理

列出镜像:

通过docker images命令列出docker主机上可用的镜像:

# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest f5bb94a8fac4 2 weeks ago 117.3 MB

在之前我们执行了docker run命令的同时将ubuntu的镜像也下载到了本地,本地镜像都保存在Docker宿主机的/var/lib/docker目录下。镜像从仓库下载下来,而仓库在Registry中。默认的Registry是由Docker公司运营的公共Registry服务,即Docker Hub。https://hub.docker.com/ 

我们可以通过docker pull来拉去我们想要的镜像,比如说Centos:

# docker pull centos
latest: Pulling from centos 5932f74ff0cd: Pull complete
4a7b890637c2: Pull complete
4beff0251382: Pull complete
Digest: sha256:cb2a2bffb199880da9c69e7f647c01c720c6f95b186a86cfbd3ef168b8032074
Status: Downloaded newer image for centos:latest # docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest 4beff0251382 3 days ago 192.5 MB
ubuntu latest f5bb94a8fac4 2 weeks ago 117.3 MB

我们虽然称之为Ubuntu操作系统,但实际上它并不是一个完整的操作系统。它只是一个裁剪版,只包含最低限度的支持系统运行的组件。

为了区分同一个仓库中的不同镜像,Docker提供了一种称为标签(tag)的功能。每个镜像在列出来时都带有一个标签,每个标签对组成特定镜像的一些镜像层标记。这种机制使得在同一个仓库中可以存储多个镜像。我们可以通过在仓库名后面加上一个冒号和标签名来指定该仓库中的某一个镜像。用docker run命令从镜像启动一个容器时,如果该镜像不在本地,Docker会先从Docker Hub下载该镜像。如果没有指定具体的镜像标签,那么Docker会自动下载latest标签的镜像。

查找镜像:

通过docker search命令来查找所有Docker Hub上公共的可用镜像:

# docker search puppet
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
devopsil/puppet Dockerfile for a container with puppet ins... 22 [OK]
camptocamp/puppetserver Puppetlabs's puppetserver 7 [OK]
devopsil/puppet-yum 5 [OK]
vladgh/puppet Ubuntu 16.04 LTS Base image with Puppet 2 [OK]
solict/provisionous-puppet-centos CentOS provisions with Puppet included 2 [OK]
...

这条命令会完成镜像查找工作,返回如下信息:

  • 仓库名;
  • 镜像描述;
  • 用户评论(Stars)——反映出一个镜像的受欢迎程度;
  • 是否官方(Official)——由上游开发者管理的镜像;
  • 自动构建(Automated)——表示这个镜像是由Docker Hub的自动构建(Automated Build)流程创建的。
## 这条命令将会下载devopsil/puppet镜像到本地
# docker pull devopsil/puppet ## 构建容器
# docker run -i -t devopsil/puppet /bin/bash
[root@b87f9dde62b0 /]# facter
architecture => x86_64
augeasversion => 1.0.0 [root@b87f9dde62b0 /]# puppet --version
3.7.4

这里我们以交互的方式启动了该容器,并且在里面运行了Bash shell。在进入容器shell之后,我们运行了Facter(Puppet的主机探测应用),它也是预安装在镜像之内的。最后,在容器里,我们运行了puppet程序以验证Puppet是否安装正常。

docker入门——镜像简介的更多相关文章

  1. docker入门-镜像管理命令篇

    一.下载.上传镜像   1:下载安装centos镜像 语法:docker [参数][镜像名称] [root@host1 ~]# docker pull centos Using default tag ...

  2. Docker入门(一):简介

    这个<Docker入门>系列文档,是我根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家 ...

  3. Docker入门(七):部署app

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  4. Docker入门(六):Stacks

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  5. Docker入门(五):Swarms

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  6. Docker入门(四):服务(Services)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  7. Docker入门(三):容器(Containers)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  8. Docker入门(二):安装/卸载

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  9. Docker入门教程(九)10个镜像相关的API

    Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...

随机推荐

  1. k8s的存储Volume

    1.Volume简介 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可 ...

  2. Python 进阶 之 函数对象

    Python的世界里,万物皆对象,函数当然也是: 首先要定义一个函数: def add(a,b): print a+b 其次定义一个字典来引用该函数: dic = {"add":a ...

  3. Burp Suite的使用介绍

    在网上找了一篇关于Burp Suite的使用介绍,感觉写的基础的,下面就copy了,另外还有一篇<BurpSuite实战指南>的pdf是一位好心的“前辈”共享的https://www.gi ...

  4. 【树上莫队】【带修莫队】【权值分块】bzoj1146 [CTSC2008]网络管理Network

    #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...

  5. 【主席树】bzoj2588 Spoj 10628. Count on a tree

    每个点的主席树的root是从其父转移来的.询问的时候用U+V-LCA-FA(LCA)即可. #include<cstdio> #include<algorithm> using ...

  6. Java多线程——ReentrantLock源码阅读

    上一章<AQS源码阅读>讲了AQS框架,这次讲讲它的应用类(注意不是子类实现,待会细讲). ReentrantLock,顾名思义重入锁,但什么是重入,这个锁到底是怎样的,我们来看看类的注解 ...

  7. 【Python笔记】Python语言基础

    Python是一种解释性(没有编译).交互式.面向对象的语言 1.安装python编译器 版本:Python2.7比较普遍,Python不是向下兼容的软件,因此Python3.x有些东西不好找资料 2 ...

  8. [读书笔记]iOS 7 UI设计 对比度

    好久没写随笔了,最近在读<iOS 7 byTutorials>,很不错,推荐给大家. 每一个好的程序员也都是一个设计师,不懂设计的程序员不是好的CTO.哈哈,开个小玩笑. iOS 7设计的 ...

  9. js创建json对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. JQuery提示$(...).on is not a function解决方法

    版本太低了,引入较高的版本,如jquery-1.8.3.min.js