Docker 近两年很火啦,经常听到哪家互联网大公司将服务迁移到 Docker 上,怎么怎么的,巴拉巴拉的一大堆分享。那么 Docker 是个什么东西,又有什么用呢?我要怎么才能快速简单得了解 Docker 呢? 本文尝试以一个初学者的视角来介绍一下 Docker。

首先,Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。

其实,我觉得以虚拟机的方式理解比较方便,但是机制不同,我们想象一下,加入你现在用着 Windows,你想敲敲 Linux 命令,玩玩 Linux 机器,怎么办?方法有很多,其中有一个方法就是在 Windows 安装一个虚拟机软件(VMWare/VirtualBox),然后创建一个虚拟机,从网络上下载一个 ubuntu.iso(centos.iso...) 文件,然后就安装好了一个 Linux 环境虚拟机。但是,这还是需要你自己安装啊,对吧?所以你想偷懒一下,刚好发现你同事的 Windows 上已经有了一个 Ubuntu 的 VirtualBox Linux 虚拟机了,于是乎你就偷懒拿了个 U盘(比较古老的方式啦) 将他的虚拟机拷了过来,然后直接加载进自己的 VirtualBox 中,于是,你没有安装就有了一个 Linux 虚拟机环境。

其实,Docker 的原理差不多,只不过它更简单,更高效。Docker 本身就是一个类似于 VirtualBox 的软件,只不过他和所在的操作系统关联更深,做的事少一些,所以更高效,然后也不用官方的 iso 镜像了,在原有的 Linux 镜像修改成符合 Docker 方式的镜像,就成了 Docker镜像,然后加载进 Docker 就成了容器。而一个集中存放很多镜像的地方就叫做仓库了。所以:

Docker 包括三个基本概念

理解了这三个概念,就理解了 Docker 的整个生命周期。

Docker 镜像

Docker 镜像就是一个只读的模板。

例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

镜像可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

Docker 容器

Docker 利用容器来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内也有一个还算出名的仓库 Docker Pool,不过镜像实在是少,然而也满足普通需求了,常见的也都有,速度嘛,不敢恭维,但至少能用。

当然,用户也可以在本地网络内创建一个私有仓库。

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

注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。