虚拟机和容器都属于虚拟化技术。
虚拟机是在一套硬件上,虚拟出一个完整的操作系统,在该系统上再运行所需的应用进程。
容器不是虚拟出一个完整的操作系统,而是对进程的隔离。
下面的图片比较了 Docker 和虚拟机的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而虚拟机则是在硬件层面实现。
特性 | 虚拟机 | 容器 |
---|---|---|
量级 | 重量级 | 轻量级 |
性能 | 接近原生 | 弱于原生 |
操作系统 | 每个VM都在自己的OS中运行 | 所有容器共享主机操作系统 |
启动时间 | 以分钟为单位 | 以毫秒为单位 |
硬盘使用 | 一般为 GB | 一般为 MB |
占用资源 | 占用更多的内存和CPU资源 | 占用较少的内存和CPU资源 |
隔离性 | 完全隔离,因此更安全 | 进程级隔离,可能不太安全 |
系统支持量 | 一般几十个 | 支持上千个容器 |
Docker 是开源应用容器引擎,轻量级容器技术。Docker 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
作为一种新兴的虚拟化技术,Docker 跟传统的虚拟机相比具有众多的优势。
不同公司的应用场景不同,常见的应用场景有
其他的应用场景可以参考:8 个 Docker 真实应用场景
Docker 包括三个基本概念
理解了这三个概念,就理解了 Docker 的整个生命周期。
Docker 三个关键动作:Build、Ship、 Run。
以上内容部分引自:《Docker 技术入门与实战》
注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push
命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull
下来就可以了。
注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
docker
底层使用了一些 linux
内核的特性,大概有 namespace
,cgroups
和 ufs
docker
使用 linux namespace
构建隔离的环境,它由以下 namespace
组成
pid
:隔离进程net
:隔离网络ipc
:隔离 IPCmnt
:隔离文件系统挂载uts
:隔离hostnameuser
: 隔离uid/gid也叫 cgroups
,限制资源配额,比如某个容器只能使用 100M
内存
UnionFS
是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加。docker
的镜像与容器就是分层存储,可用的存储引擎有 aufs
,overlay
等。
docker
的镜像和容器都使用了 unionFS
做分层存储,镜像作为只读层是共享的,而容器在镜像之上附加了一层可写层,最大程度地减少了空间的浪费。
关于分层存储的详细内容可以查看官方文档 docker: About storage drivers
Docker 引擎是一个 Client-Server 应用程序,有以下主要组件:
命令行界面使用 API 通过脚本或直接在命令行界面通过命令与 Docker 守护进程交互。
docker
的架构图如下
从图中可以看出几个组成部分
docker client
:即 docker
命令行工具docker host
:宿主机,docker daemon
的运行环境服务器docker daemon
:docker
的守护进程,docker client
通过命令行与 docker daemon
交互container
:最小型的一个操作系统环境,可以对各种服务以及应用容器化image
:镜像,可以理解为一个容器的模板配置,通过一个镜像可以启动多个容器registry
:镜像仓库,存储大量镜像,可以从镜像仓库拉取和推送镜像这里我们说下 Docker 为什么比 VMware 快。