@chendushuai
2018-12-23T08:58:25.000000Z
字数 4622
阅读 526
Docker 容器
在云时代,主要依靠虚拟化技术所构建的集群处理能力。开始是以Xen、KVM代表的虚拟机虚拟化,再到现在以Docker为代表的容器技术。
容器充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。将容器称为“新一代的虚拟化”技术,将基于容器打造的云平台称为“容器云”。
Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发行者是dotCloud公司,目前已有多个开源项目,形成了围绕Docker容器的生态体系。
主流的Linux操作系统都已经支持Docker。
Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装、到处运行”的目的。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以使一套数据库平台服务,甚至是一个操作系统或集群。
IBM对于容器技术的描述为:“容器有效的将由单个操作系统管理的资源规划分到孤立的组中,以更好的在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化和系统调用替换中的复杂性。”。
Linux容器技术LXC
在LXC的基础上,Docker进一步优化了容器的使用体验,让它进入了寻常百姓家。
首先,Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以更简单明了的管理和使用容器;其次,Docker通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地提升了用户体验。用户操作Docker容器就像操作应用自身一样简单。
早期的Docker代码实现是直接基于LXC的。自0.9版本开始,Docker开发了li'b'con'ta项目,替换掉了LXC的实现。目前,Docker还积极推动成立了runC标准项目,试图让容器支持不再局限于Linux操作系统,而是更安全,更具扩展性。
可以将Docker容器理解为一种轻量级的沙盒(sandBox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止都十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当做应用本身也没有任何问题。
Docker通过容器来打包应用,解耦应用和运行平台,意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将节约大量的宝贵时间,并降低部署过程中出现的问题。
Docker在开发和运维过程中,具有如下几个方面的优势
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 较弱 |
| 内存代价 | 很小 | 较多 |
| 硬盘使用 | 一般为MB | 一般为GB |
| 运行密度 | 单机支持上千个容器 | 一般几十个 |
| 隔离性 | 安全隔离 | 完全隔离 |
| 迁移性 | 优秀 | 一般 |
虚拟化(Virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化,或者通常说的服务器虚拟化。维基百科中定义如下:虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。
虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同事运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。
从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中真正意义上的基于硬件虚拟化技术不多见。
基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。其中,前者一般指的是一些模拟设备或软件,后者又可以细分为下面几类:
Docker的大部分操作都围绕着他的三大核心概念——镜像、容器和仓库而展开。
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了一个Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一个十分简单的机制来创建和更新现有的镜像。
类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。企业注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像文件,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。
根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(public)和私有仓库(Private)两种形式。Docker支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。
可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似,实际上在理念设计上借鉴了Git的很多优秀思想。
Docker安装完成后,可以验证Docker安装是否正确,打开终端控制器或其他系统命令行。执行如下命令,确认Docker启动,docker、docker-compose和docker-machine的版本是最新的,并且与Docker.app兼容。如果使用的是不同的版本,输出的内容不同。
$ docker --versionDocker version 1.12.3, build 6b644ec$ docker-compose --versiondocker-compose version 1.8.1, build 878cff1$ docker-machine --versiondocker-machine version 0.8.2, build e18a919
$ docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldd1725b59e92d: Pull completeDigest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788Status: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:……
hello-world映像类似,如果在本地找不到映像,Docker将从Docker Hub中提取
$ docker run -d -p 80:80 --name webserver nginx
打开浏览器,使用网址http://localhost/访问Nginx的主页,由于使用的是默认的80端口,所以无需在网址后面附加端口号。
当你的web服务器在运行的时候,你可以查看容器明细(使用docker container ls或者docker ps):
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2027665dca2d nginx "nginx -g 'daemon off" 21 hours ago Up 10 minutes 0.0.0.0:80->80/tcp webserver