容器和容器镜像的区别,您真的了解吗

21次阅读

共计 1301 个字符,预计需要花费 4 分钟才能阅读完成。

很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和 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 <image-id>
先看它的帮助文档:

试着执行以下:

产生一个输出 id:
7ee10851c3f1e53bbd35e5f196f34de560afa1a20d9bf1ced587630dbcda877b
create 创建的容器,状态变为 created:

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

然后再执行 docker start,输入 docker create 创建的容器实例 ID,就可以启动这个容器实例了。
而 docker run 其实就是 docker create 和 docker start 这两个命令合二为一的版本。
希望这篇文章能帮助大家理解容器和容器镜像的区别。要获取更多 Jerry 的原创文章,请关注公众号 ” 汪子熙 ”:

正文完
 0