Docker系列【2】——容器 镜像 仓库

Docker系列【2】——容器 镜像 仓库

从上图中我们可以看到,Docker的三个基本概念:

  • Image(镜像)
  • Container(容器)
  • Registry(仓库)

镜像是运行容器的前提,仓库是存放镜像的地方。用个比喻来解释,把镜像看成钱,买的东西看成容器,那么必须要有钱才能买各样的东西,即镜像是运行容器的前提;如果钱太多了,放在家里很不方便,这时候我们就会把钱存到银行里去,这里的银行看成是仓库,即仓库是存放镜像的地方。

Image(镜像)

​ Docker镜像可以看成是一个特殊的文件系统提供了运行容器时所需要的程序、库、配置等,镜像不包含任何动态数据,镜像中的内容在构建之后也不会改变,如果要修改镜像中的内容,只能重新生成镜像。

Docker系列【2】——容器 镜像 仓库

​ 根据上图可以看出,多个只读层重叠在一起,镜像就是一层只读层(read-only layer)。统一文件系统技术将这些不同的层整合成一个文件系统,为这些层提供一个统一的视角,在用户的角度看来,就只有一个文件系统。

​ Docker镜像就是一个只读的模板,镜像可以用来创建Docker容器。Docker提供了命令来创建或更新现有的镜像,用户可以从他人那里下载一个做好的镜像来使用。

Container(容器)

​ 容器是从镜像创建的运行实例,它可以被启动、停止、删除,每个容器都是互相隔离。容器 = 镜像 + 读写层,可以把容器看成是一个简易版的Linux环境,Docker利用容器来运行应用。

Registry(仓库)

​ 仓库是存放镜像文件的场所,可以使用docker公司运营的Docker Hub公开仓库,也可以私有搭建个人仓库来使用。一个仓库会包含同一个软件不同版本的镜像,使用标签来区分同个软件的不同版本。

​ 当我们创建了自己的镜像后,就可以使用push命令将它上传到私有或公有仓库,这样在另一台机器要使用镜像时,只需从仓库pull下来即可使用。

P.S.

当笔者刚接触Docker时,对镜像、容器概念不是很理解,就会思考一些问题。

  • 为什么不在同一个容器中使用多个镜像,而是使用一个镜像来创建一个容器呢?现在我明白容器是镜像运行的实例,可以把镜像看成是虚拟机的镜像,容器看成是运行的虚拟机,一个运行的虚拟机只能对应一个虚拟机镜像,比如你使用Ubuntu镜像,那么你就不能同时使用Debian镜像,但是一个虚拟机镜像可以对应着多个虚拟机,你使用Ubuntu的镜像可以用于创建多个Ubuntu虚拟机,镜像与容器也是同理。一个镜像可以用于创建多个容器,但是一个容器只能对应一个镜像。
  • 为什么不在一个镜像文件中把所有的应用程序都放进去,这样的话部署应用程序不是很快吗?事实上确实有人也这样做过,比如下载一个Ubuntu镜像,然后创建一个Ubuntu容器并在容器中安装各种的程序,但这样的做法不符合设计Docker时的理念。Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。所以实际场景还是避免在一个镜像中打包所有的程序,不过对于某些依赖关系强的程序还是可以这样做的。

参考文章:
这可能是最为详细的Docker入门吐血总结
Docker