乐趣区

关于容器:浅述容器和容器镜像的区别

笔者写过的和 Docker 容器技术的一些其余系列文章:

  • Docker 实战教程之从入门到进步 (一)
  • Docker 实战教程之从入门到进步 (二)
  • Docker 实战教程之从入门到进步 (三)
  • Docker 实战教程之从入门到进步 (四)
  • Docker 实战教程之从入门到进步 (五)
  • Docker 实战教程之从入门到进步 (六)
  • Docker 实战教程之从入门到进步 (七)
  • Docker 实战教程之从入门到进步 (八)
  • Docker 技术三大要点:cgroup, namespace 和 unionFS, 从实践到实际

在咱们探讨容器和容器镜像的区别之前,对于容器技术的初学者来说,有必要先去理解,为什么从事云原生开发须要学习容器技术?

随着企业数字化过程的不断深入倒退,云原生技术成为业界一个煊赫一时的话题。所谓云原生,以容器、微服务、DevOps 等技术为根底,提供对利用进行分布式部署和对立治理的平台和体系。云原生是一系列思维和工具的汇合。从其概念定义可看出,容器技术是云原生的基石。在云原生畛域工作的开发人员,如果不理解和把握容器技术,好比试图在浮沙堤上建筑高楼大厦个别。

什么是容器

在介绍为什么咱们须要容器之前,请大家先回顾一下本人的第一个 Hello World 程序的诞生史。在咱们费尽含辛茹苦,解决各种本地开发工具配置 (编译器,环境变量等等) 的问题之后,终于看到了 Hello World 的输入,那份喜悦之情显而易见,但咱们也绝不会遗记在遇到各种各样的环境配置问题时的丧气和无助。
笔者在基于本地部署 (On-Premises) 的企业级管理软件畛域工作十余年,遇到过一些同样版本的应用程序,在开发机和测试机上可能失常运行,部署到生产环境之后呈现故障的辣手问题,最初通过排查,这些问题都是因为运行环境的差别所导致。
而容器技术作为一种轻量级、可移植和自蕴含的软件打包技术,使应用程序能够在简直任何中央以雷同的形式运行。采纳容器技术,开发人员在本人本地开发环境创立并测试好的容器,无需任何批改就可能在生产零碎的虚拟机、物理服务器或私有云主机上运行,从而可能彻底防止软件因为运行环境的差别而可能呈现的各种运行问题。
初学者了解容器技术,能够从容器一词的字面含意动手。设想一下现实生活中的集装箱。咱们要把一批货物从一个中央运输到另一个中央,只须要把货物依照标准规定打包放入集装箱内,集装箱与集装箱之间不会相互影响,集装箱也并不关怀箱内到底装的是水果,衣物还是电子产品,所以这些货物的打包形式都遵循标准化规定。这些集装箱打包好之后,能够用通用的运输工具,比方汽车和货轮等进行运输。到了目的地之后,再用标准化的形式关上集装箱,取出外面的货物即可应用。

很多刚刚接触容器技术的敌人,不容易弄清楚容器,容器镜像和 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 createdocker start 这两个命令合二为一的版本。

总结

本文首先将容器这个对初学者来说比拟生疏的概念,类比成事实世界中的集装箱,让读者对容器概念有一个直观的了解,接着论述了容器和容器镜像的区别。

心愿这篇文章能帮忙大家了解容器和容器镜像的区别。

笔者写过的和 Docker 容器技术的一些其余系列文章:

  • Docker 实战教程之从入门到进步 (一)
  • Docker 实战教程之从入门到进步 (二)
  • Docker 实战教程之从入门到进步 (三)
  • Docker 实战教程之从入门到进步 (四)
  • Docker 实战教程之从入门到进步 (五)
  • Docker 实战教程之从入门到进步 (六)
  • Docker 实战教程之从入门到进步 (七)
  • Docker 实战教程之从入门到进步 (八)
  • Docker 技术三大要点:cgroup, namespace 和 unionFS, 从实践到实际
退出移动版