第01课:初遇

第01课:初遇 Docker

Docker 是什么?

先来点通俗的解释:

“Docker”这个单词有“码头工人”的意思,码头工人的工作就是把货物装到集装箱里,然后把集装箱搬到货船上面。Docker 就是借鉴了这种做法,想一想,集装箱有什么好处呢?在一艘大货船上,所有货物装成集装箱就可以方便快捷地摆放在一起,并且各种各样的集装箱的规格都被标准化了,不管货物是什么,只要装到集装箱里面,就可以一次性被运走,而不必把不同的货物分开运输。

enter image description here

Docker 就使用了这种思想。Docker 就像一个码头工人,把可以运行的 Linux 系统装载到一个个容器(container)里,这些容器就像一个个“装载了 Linux 系统”的集装箱。就像每个集装箱都有自己的货物一样,每个容器都像一个独立的 Linux 系统一样可以运行指定的程序。比如,一个容器可以作为 Web 服务器,另一个容器作为数据库服务器。

集装箱之间互不影响。同样,容器之间也都是独立的,一个容器不能操作另一个容器的资源,因此可以很好地隔离运行环境。每个容器都像一个独立的操作系统,拥有操作系统运行需要的所有配置和代码。

下面是更官方的解释:

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于2013年3月以 Apache2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。

Docker 使用 Google 公司推出的 Go 语言进行开发和实现,在 Linux 操作系统上提供了一个软件抽象层和操作系统层虚拟化的自动管理机制。Docker 利用了 Linux 的资源分托机制(cgroups 以及命名空间)来创建独立的软件容器。Linux 对命名空间的支持完全隔离工作环境中的应用程序,包括进程树,网络,用户 ID 与挂载文件系统;而 cgroups 则提供了资源隔离,包括 CPU,内存等。Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大简化了容器的创建和维护,使得 Docker 技术比虚拟机技术更为轻便快捷。

enter image description here

图 linux 小企鹅,Go 小熊以及好多朋友参与 Docker 的海上豪华生日 Party。

Docker 可以解决虚拟机能够解决的问题,也可以解决虚拟机由于资源要求过高而无法解决的问题。

  • 隔离应用依赖
  • 创建应用镜像并复制
  • 创建易于分发的即开即用的应用或者应用镜像
  • 允许实例简单快速扩展
  • 易于测试和销毁

Docker 的初衷是创建软件程序可移植的轻量容器,让软件可以在任何安装了 Docker 的主机上运行,而不用关心底层操作系统。

Docker 重要概念

Docker 镜像(Image)

通俗解释: 镜像类似于一个系统安装光盘,你可以使用一个安装光盘为多台电脑安装操作系统,同样,你也可以用同一个镜像构建多个运行的 Docker 实体——容器(容器的概念参见本文3.2小节)。当你使用同一张安装光盘给多台电脑安装系统之后,这些电脑的系统是完全一样的,换句话说,安装光盘的内容是不变的。同理,镜像也是一个静态的概念,从同一个镜像运行的 Docker 容器也都是一样的,镜像的内容在生成之后就不再改变!

专业一点的解释: Docker 镜像是一个特殊的文件系统,类似于 Linux 的 root 文件系统,镜像提供了容器运行时所需的程序、库、资源、配置等文件,还包含了一些为运行时准备的一些配置参数。镜像是一个静态的概念,镜像不包含任何动态数据,其内容在构建之后也不会被改变。

由于镜像包含完整的 Linux root 文件系统,所以它可能会很庞大。因此,Docker 的设计者充分利用 Unions FS 技术,把 Docker 设计为分层存储的结构,什么意思呢?

意思是说,镜像是分层构建的,每一层是上面一层的基础,每一层在构建完成之后都不会再发生变化,这提醒我们,构建镜像的时候我们要保证每一层都只包含我们的应用需要的东西,不要有包含不需要的文件,因为每一层在构建之后不再发生变化,所以即使你在之上的层删除了那些不需要的文件,这些文件也只是被标记为删除,实际上并没有真正删除;如果每一层都包含一些可有可无的文件,就会使得我们的镜像越来越臃肿。通过之前的叙述,我们可以看出,一个镜像实际上并不是一个文件,而是一组分层文件。分层存储还使得不同的镜像可以共享某些层,便于镜像的复用。

备注:更多具体关于命名空间和分层存储的知识会在后面的教程详细说明,所以即使现在不能完全理解也可以放心地继续阅读。

Docker 容器(Container)

你可以从镜像创建容器,就像从快照创建虚拟机一样。容器是一个动态的概念,你的程序都是在容器里运行的。

容器就是一个进程,但是它有自己独立的命名空间,拥有自己独立的文件系统,独立的网络等资源。因此,容器就好像一个完全独立于宿主主机的操作系统一样,完全可以被当做一个独立的操作系统使用。

容器也是分层存储的,当你从一个镜像创建并运行一个容器的时候,是以镜像作为基础层,在此之上创建一个容器的存储层,你对容器的读写都是在这一层完成的。但是当容器消亡的时候,容器的存储层也会随之消失。因此,我们不应该在容器的存储层写入数据,文件的写入操作需要使用其它的方式,这会在之后的教程介绍。

我们现在只需要知道,容器和镜像都是分层存储的,并了解容器和镜像的关系就足够了!随着教程的深入,我们会一步步学习更加具体的内容。

Docker 仓库(Registry)

Docker 仓库是一个集中存储和分发镜像的服务,你可以建立自己的私有仓库,也可以使用共有仓库,比如 Docker Store。你可以从仓库里搜索你需要的镜像,也可以把你自己构建的镜像分享到仓库供别人下载使用。

为什么使用 Docker?

Docker 是一种新兴的虚拟化方式,在第3节我们会把 Docker 和虚拟机类比,但是,Docker 不是虚拟机,传统的虚拟机是先虚拟硬件资源,然后在虚拟的硬件资源之上运行操作系统。而 Docker 容器作为一个进程,直接运行于宿主主机内核,因此 Docker 更加快捷,下图是虚拟机和 Docker 的对比:

enter image description here 图片来自网络

正是由于这些不同,使得 Docker 具有很多优势:

  • 高效利用系统资源(没有虚拟硬件的额外开销)。
  • 更快的启动时间(通常可以在1秒内启动)。
  • 便于部署(镜像包含了应用和相关依赖,可以运行在任何配置了 Docker 的主机上)。
  • 轻松迁移。
  • 分层存储,提高存储效率。

接下来做什么?

现在我们已经对 Docker 有了一个基础的认识,接下来的教程,我们会先介绍(复习)一下 Linux 的基本命令,然后从安装 Docker 开始,一步一步学习 Docker 的基本使用。

说明

本课程写作过程中参考了一些网络资源,参考资源的链接在此一并列出:

上一篇
下一篇
目录