原文地址:http://www.eussi.top/view/19
1、 简介
在计算机的历史中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization, HV)有所不同,管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行与物理硬件之上,而容器直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器可以让多个独立的用户空间运行在同一台宿主机上。
也正是“客居”于操作系统,容器只能运行与底层宿主机相同或相似的操作系统。
相当于彻底隔离的管理程序虚拟化,容器认为是不安全的,但是反对这一点观点的反而认为管理程序虚拟化又虚拟出来一个完整的操作系统,为攻击者增大了攻击的范围。
虽然有局限性,但是容器技术仍然广泛应用于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。
新的容器技术(如OpenVZ、lxc等)的引入各种容器之后,使用这些技术,容器不在是一个单纯的运行环境,在容器自己的权限范围内,容器更像是一个完整的宿主机。对于docker来说,得益于现代linux内核特性,如cgroup、namespace技术,容器与宿主机隔离的更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好的共存。
容器开销有限,经常别人为是精益技术。与传统虚拟化和半虚拟化相比,容器运行不需要模拟层、管理层等,而是直接使用操作系统的系统调用接口,这降低了运行单个容器所需开销,也使得宿主机中可以运行更多的容器。
尽管有以上优点,容器仍未得到广泛的认可,一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而docker就是为改变这一切而生。
1.1 docker简介
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。由Docker公司(www.docker.com,前dotCloud公司,Paas市场中的老牌提供商)的团队编写,基于Apache2.0开源授权协议发行。
Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。 Docker极其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的 Linux内核和二进制文件最小限的宿主机。而
Docker的目标就是要提供以下这些东西。
1.1.1提供一个简单、轻量的建模方式
Docker上手非常快,只需要几分钟,就可以把自己的程序"Docker化"( Dockerize),Docker依赖于“写时复制”( copy-on- write)模型,使修改应用程序也非常迅速。随后,就可以创建容器来运行应用程序了。大多数 Docker容器只需不到1秒钟即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。
1.1.2职责的逻辑分离
使用docker,开发人员只需关系容器中运行的程序,运维人员只需关系如何管理容器。docker加强了开发人员部署应用程序是开发环境与生产环境的一致性。
1.1.3快速、高效的开发生命周期
docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让程序具备可移性,易于构建、并易于协作。
1.1.4鼓励面向服务的架构
docker鼓励面向服务的架构和微服务架构。推荐一个容器只运行一个应用容器和进程,这样就形成了分布式的应用程序模型,不过不必拘泥于这种形式。
1.2 Docker组件
docker核心组件包括:
- Docker客户端和服务端
- Docker镜像
- Registry
- Docker容器
1.2.1Docker客户端和服务端
Docker是一个客户-服务器(C/S)架构的程序。Docker只需向Docker服务器或者守护进程发出请求,服务器或者守护进程会完成所有工作并返回结果。Docker提供了一个命令行工具docker以及一整套RESTFul API。
1.2.2Docker镜像
镜像是构建docker的基石。用户基于镜像来运行自己的容器。镜像也是docker声明周期中的“构建”部分。镜像是基于联合( Union)文件系统的一种层式的结构,由一系列指令一步一步构建出来。例如
- 添加一个文件
- 执行一个命令
- 打开一个端口
也可以把镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。
1.2.3 Registry
Docker用 Registry来保存用户构建的镜像。 Registry分为公共和私有两种。 Docker公司运营的公共 Registry叫做 Docker hub。用户可以在 Docker hub注册账号,分享并保存自己的镜像。
1.2.4容器
Docker可以帮你构建和部署容器,你只需要把自己的应用程序或服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是 Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。
总结起来,docker容器就是:
- 一个镜像格式
- 一系列标准操作
- 一个执行环境
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而 Docker运输软件。
和集装箱一样,Docker在执行上述操作时,并不关心容器中到底塞进了什么,它不管里面是web服务器,还是数据库,或者是应用程序服务器什么的。Docker也不关心你要把容器运到何方,你可以在自己的笔记本中构建容器,上传到
Registry,然后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到 Amazon EC2主机的集群中去。
使用 Docker可以快速构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续集成( continuous integration,CI)测试环境或者任意一种应用程序、服务或工具。可以说, Docker的应用场景相当广泛。
1.3 我们能用 Docker做什么
Docker或容器技术容器可以为各种测试提供很好的沙盒环境。容器本身具有“标准性”的特征,非常适合为服务创建构建块。Docker的一些应用场景如下。
- 加速本地开发和构建流程,使其更加高效、更加轻量化。
- 让独立服务或应用程序在不同的环境中运行,得到相同结果
- 用 Docker创建隔离的环境来进行测试。
- Docker可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是开始就在生产环境部署、测试。
- 构建一个多用户的平台即服务(PaS)基础设施
- 为开发、测试提供一个轻量级的独立沙盒环境,或者将独立的沙盒环境用于技术教学
- 高性能、超大规模的宿主机部署。
1.4 Docker技术组件
Docker可以运行于任何安装了现代 Linux内核的x64主机上。推荐的内核版本是3.8或者更高。 Docker的开销比较低,可以用于服务器、台式机或笔记本。它包括以下几个部分。
一个原生的 Linux容器格式, Docker中称为 libcontainer,或者很流行的容器平台lxc。libcontainer格式现在是 Docker容器的默认格式
Linxu内核的命名空间( namespace),用于隔离文件系统、进程和网络。
- 文件系统隔离:每个容器都有自己的root文件系统。
- 进程隔离:每个容器都运行在自己的进程环境中。
- 网络隔离:容器间的虚拟网络接口和IP地址都是分开的。
- 资源隔离和分组:使用 cgroups(即control group,Linux的内核特性之一)将CPU和内存之类的资源独立分配给每个 Docker容器。
- 写时复制:文件系统都是通过写时复制创建的,这就意味着文件系统是分层的、快速的,而且占用的磁盘空间更小。
- 日志:容器产生的 STDOUT、 STDERR和 STDIN这些IO流都会被收集并记入日志,用来进行日志分析和故障排错。
- 交互式shell:用户可以创建一个伪ty终端,将其连接到STDN,为容器提供一个交互式的shell。
1.7 Docker资源
- Docker 官方主页 (http://www.docker.com/ )
- Docker Hub (http://hub.docker.com )
- Docker 官方博客 (http://blog.docker.com/ )
- Docker 官方文档 (http://docs.docker.com/ )
- Docker 快速入门指南 (http://www.docker.com/tryit/ )
- Docker 的GitHub源代码 (http://github.com/docker/docker )
- Docker Forge (http://github.com/dockerforge ):收集了各种 Docker工具、组件和服务
- Docker 邮件列表 (http://groups.google.com/forum/#!forum/docker-user )
- Docker 的IRC频道 (irc.freenode.net)
- Docker 的Twitter主页 (http://twitter.com/docker )
- Docker 的StackOverflow问答主页 (http://stackoverflow.com/search?q=docker )
- Docker 官网 (http://www.docker.com/ )
参考资料:《第一本Docker书》