zoukankan      html  css  js  c++  java
  • 容器和容器镜像的区别,您真的了解吗

    很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和Docker这几个词的区别和联系。

    我们首先来看容器和容器镜像。举个例子,执行命令行docker search nginx,搜索结果的一条条记录就是一个个容器镜像。

    所谓镜像,就是一个静态概念,一个镜像由若干只读层(read-only layer)构成。

    上图左边是Docker镜像的内部实现细节,我们能看到多个只读层叠加在一起,层与层之间通过指针关联,这些层能够在运行Docker的宿主机的文件系统上访问到。

    Linux的统一文件系统(union file system)技术将这些叠加的只读层合并成一个文件系统,该系统为这些只读层提供了一个统一的视角,从而为Docker的用户隐藏了多层的存在。

    从Docker用户的视角出发,一个Docker镜像只存在一个文件系统,即上图右边所示。

    这些文件系统的设计是Docker实现细节,一般情况下我们不用去深究。但如果您足够好奇,使用命令sudo tree浏览目录 /var/lib/docker即可:

    比如我用命令docker images浏览下载到本地的docker镜像:

    其中一个叫jerry-nginx的镜像,是一个web应用,它的所有内容能在/var/lib/docker目录下的这个目录查到:

    讲完了容器镜像,我们再来看容器。

    容器和容器镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,如上图绿色图例所示。

    初学者可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层

    我们如果用命令docker ps --all查看本机所有容器列表,会发现有的容器处于运行状态,有的处于退出状态。

    因此,一个处于运行状态的容器(running container)包含一个可读写的文件系统加上隔离的进程空间。

    容器里的进程可以对这个可读写文件系统内的文件进行修改、删除、创建等操作。

    镜像里每一层其实都能在docker文件夹的containers子目录下找到:

    上图每一个红色文件夹代表镜像里的一层,蓝色文件包含了该层运行时的日志文件,或者网络相关配置等。

    做个实验:

    ubuntu这个容器执行结束后,使用find / -name i042416.txt文件,这说明docker运行时能对宿主机的文件系统进行写操作。

    下面分析几个常用的易混淆的命令。

    docker create

    先看它的帮助文档:

    试着执行以下:

    产生一个输出id:

    7ee10851c3f1e53bbd35e5f196f34de560afa1a20d9bf1ced587630dbcda877b

    create创建的容器,状态变为created:

    docker create命令给通过命令行传入的容器镜像创建了一个新的可读可写层,从而生成了一个新的容器实例:

    然后再执行docker start,输入docker create创建的容器实例ID,就可以启动这个容器实例了。

    而docker run其实就是docker create和docker start这两个命令合二为一的版本。

    希望这篇文章能帮助大家理解容器和容器镜像的区别。
    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/10156590.html
Copyright © 2011-2022 走看看