Docker简介以及安装
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.什么是容器
1.一种虚拟化方案
与传统的虚拟机不同,传统的虚拟机是通过中间层将一台或多*立的机器虚拟运行在物理硬件之上。而容器则是直接运行在操作系统内核之上的用户空间,因此容器虚拟化也被称作操作系统虚拟化。
2.操作系统级别的虚拟化
由于依赖操作系统的特性,所以容器只能运行在底层操作系统相同或相似的操作系统。Docker使用的容器技术正是依赖于Linux内核的Namespace和Cgroups(Control Group)等特性。所以Docker上只能运行Linux类型的操作系统,而不能运行Windows操作系统。这是Docker技术和虚拟化技术在系统的灵活性上的劣势。
3.对比容器技术和虚拟机
磁盘占用空间小
一个显而易见的区别就是磁盘占用空间更少。使用虚拟机部署应用,不但包括了应用和其依赖的库还需要包含完整的操作系统。原本只需要几十兆(M)的应用却需要几个G的操作系统来支撑。而容器技术只需要包含应用和其所依赖的库,这样资源占用就大大减少。 硬件利用率
另外,虚拟机需要模拟硬件的行为,对内存和CPU的损耗也相当的大,所以同样配置的服务器,使用容器技术要比使用虚拟机能够提供更多的服务能力,服务更多的用户。
4.为什么容器有这么多特点直到docker的出现才被关注起来呢?
容器技术的复杂性:
一个重要的原因就是容器技术的复杂性,容器本身它就比较复杂,它依赖于Linux本身的很多特性。而且它不容易安装也不容易管理而实现自动化。而docker就是为了改变这一切而出现的。所以说Docker的虚拟化技术是容器的一种。
二.什么是Docker
Docker是一个能够把开发的应该程序自动部署到容器的开源引擎。它使用Golang语言编写。在2013年初,由dotCloud公司发布,基于Apache 2.0开源授权协议发行。Docke在虚拟化的容器执行环境中,增加一了一个应用程序部署引擎。该引擎目标就是提供一个轻量快速的环境能够运行开发者程序并方便高效的将程序从开发者环境部署到测试环境,然后再从测试环境部署到生产环境。 GitHub地址:https://github.com/docker/docker
三.Docker的特点
1.提供简单轻量的建模方式
Docker非常容易上手,用户只需要几分钟就可以把自己的程序Docker化,大多数Docker容器只需要不到一秒就可以运行起来。由于去除了管理程度的开销,Docker容器拥有非常高的性能,同时,同一台宿主机中,也可以运行更多的容器,使用户可以尽可能的充分利用系统资源。
2.职责的逻辑分离
使用Docker开发者只需要关系容器中运行的应用程序,而运维人员只需要关系如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用要部署的生产环境的一致性。
3.快速高效的开发生命周期
Docker的目标之一是缩短代码。从开发,测试,到部署上线运行的周期,让你的应用程序具备可移植性。在容器中开发,以容器的形式交互和分发。这样以开发,测试,生产都是用相同的环境,也就避免了额外的调试和部署上的开销。这样就能够有效缩短产品上线的周期。
4.鼓励使用面向服务的架构
Docker推荐单个容器只运行一个应用程序或者进程,这样就形成了一个分布式的应用程序模型。在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展,或者调试应用程序都变得非常简单。这样就能够避免在同一台服务器上部署不同服务时可能带来的服务之间的互相影响。这样在出现问题的时候也比较容易定位问题的所在。
四.Docker的使用场景
1.使用Docker容器开发,测试,部署服务
因为Docker本身非常轻量化,所以本地开发人员可以构建并分享Docker容器。容器可以在开发环境中创建,然后在提交到测试,最终进入生产环境。
2.创建隔离的运行环境
在很多企业应用中,同一服务的不同版本可能服务不同的用户。那么使用Docker可以非常容易的创建不同的生产环境来运行不同的服务。
3.搭建测试环境
由于Docker的轻量化,所以开发者很容易在本地搭建测试环境,来测试程序在不同系统下的兼容性,甚至是搭建集群部署的测试,而学生也可以很容易利用Docker来搭建学习开发的环境。
4.构建多用户平台即服务(PaaS)基础设施
5.提供软件及服务(SaaS)应用程序
6.高性能,超大规模的宿主机部署。
目前,AWS等公有云服务都提供了对Docker技术的支持,使开发者可以借助云平台,利用Docker可以搭建PaaS,SaaS等服务。同时,也有很多开发者在使用OpenStack和Docker结合提供PaaS,SaaS服务。使得Docker在云计算领域有着非常广阔的领域。
五.Docker的基本组成
1.Docker Client(客户端)
2.Docker Daemon(守护进程)
C/S架构
我们先看一下Docker的客户端和守护进程,Docker是C/S架构的程序,Docker的客户端向Docker的服务器端(也就是Docker的守护进程)发起请求,Docker守护进程处理完请求并返回结果。 本地/远程
Docker的客户端访问Docker服务端既可以在本地也可以通过远程来访问。我们通过Docke客户端执行各种命令,然后Docker客户端会将这些命令发送给守护进程,守护进程的执行结果还会传回客户端,使我们可以通过客户端来查看命令运行的结果。 博主推荐阅读:
https://www.cnblogs.com/yinzhengjie/p/10508291.html
3.Docker Image(镜像)
Docker容器的基石
镜像是Docker容器的基石,容器基于镜像启动和运行,镜像就好比容器的源代码,保存了用于启动容器的各种条件。 层叠的只读文件系统
Docker镜像是一个层叠的只读文件系统,它的最底端是一个引导文件系统(即bootfs,这很像典型的Linux引导文件系统),Docker用户几乎永远不会和引导文件系统有交互。实际上,当一个容器启动后,它将会被移到内存中,而Docker的引导文件系统将会被卸载。而Docker文件系统的第二层是rootfs文件系统,它位于引导文件之上,root文件系统可以是一种或是多种的操作系统,比如Ubantu,CentOS等等。在传统的系统引导中,root文件系统会最先以只读的形式加载,当引导结束并完成了完整性的检查后,他才会被切换为读写模式。但是在Docker里,root的文件系统永远只能是只读状态。 联合加载(union mount)
Docker利用联合加载技术,又会在root文件系统之上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统。但是在外面开起来只能看见一个文件系统。联合加载会将各层文件系统叠加在一起,这样最终的文件系统会包含所有的底层文件和目录。
Docker将满足以上三点的文件系统称之为镜像。一个镜像可以放到另一个镜像的底部,对于下面的镜像成为父镜像,可以依次类推,直到镜像占的最底部,最底部的镜像成为基础镜像。
4.Docker Container(容器)
通过镜像启动
Docker容器通过镜像来启动,Docker容器是Docker的执行来源,容器中可以运行客户的一个或多个进程。 启动和执行阶段
如果说镜像是Docker生命周期的构建和打包阶段,那么容器就是启动和执行阶段。当一个容器启动时,Docker会在镜像的最顶层加载一个读写文件系统(也就是一个可写的文件层)。我们在Docker中运行的程序,就是在这个层中进行执行的。 写时复制(copy on write)
当Docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层,该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。这就是Docker种一个重要的技术,写时复制。
每个只读镜像都是只读的,并且以后永远不会变化,当创建一个新容器时,Docker会构建出来一个镜像栈(如上图),在栈的最顶层添加可写层(读写层),这个读写层加上下面的只读镜像层以及一些配置数据就构成了一个容器。容器的这种特点加上镜像的分成框架使我们可以快熟的构建镜像并允许包含我们自己的应用程序和服务的容器。
5.Docker Registry(仓库)
Docker用仓库来保存用户构建的镜像,仓库分为公有和私有两种,Docker公司自己提供了一个公有的私有仓库,叫做“Docker Hub”。我们可以在“Docker Hub”上去注册账号,分享并保存自己的镜像。目前,"Docker Hub"已经有了丰富的Docker镜像。当然,我们可以通过“Docker Hub”来查找我们需要的镜像,为我们节省了很多构建镜像的时间。当然我们也可以架设自己私有的仓库。
六.Docker容器相关技术简介
Docker依赖的Linux内核2个重要特性,一个是Namespaces命名空间,一个是Control groups(cgroups)控制组,接下来我们就来了解一下这2个特性。了解这2个特性能够更好的帮助我们理解Docker的资源分配和管理。
1>.Namespaces命名空间
我们知道很多编程语言都包含了命名空间的概念,我们可以理解命名空间是一种封装的概念,而封装本身是就是实现了代码隔离。那在操作系统中命名空间提供了什么呢?它提供的是系统资源的隔离,系统资源包括了进程,网络,文件系统等等。实际上,Linux内核实现命名空间的主要目的之一就是为了实现轻量级虚拟化服务,也就是我们说的容器。在同一个命名空间下的进程,可以感知彼此的变化,而对其他命名空间的进程而一无所知。这样,就可以让容器中的进程产生一个错觉,保护它自己置身于一个独立的系统环境中,以此来达到独立和隔离的目的。
我们从Docker的公开的文档来看,它使用了5种命名空间:
a>.PID(Process ID) 进程隔离
b>.NET(Network) 管理网络接口
c>.IPC(InterProcess Communication) 管理跨进程通信的访问
d>.MNT(Mount)管理挂载点
e>.UTS(Unix Timesharing System)隔离内核和版本表示
2>.Control groups(cgroups)控制组
用Namespaces命名空间隔离的资源是如何管理起来的呢?这个时候就需要用到Control groups来完成了。Control groups是Linux内核提供的一种可以限制,记录,隔离进程组的所使用物理资源的机制。最初,是由Google工程师来提出的。并且在2007年的时候被”Linux kernel 2.6.24“版本整合进来,可以说cgroups就是为了实现容器技术而生的。没有cgroups就没有容器的今天。
Control groups(cgroups)控制组提供了以下功能:
a>.资源限制(比如,memory子系统可以为进程组设置一个内存资源的使用上限,一旦进程组使用的资源达到了限额,那他在申请资源的时候就会发出资源上限的消息。)
b>.优先级设定(它可以设定哪些进程组可以设定更大的CPU或是磁盘I/O资源)
c>.资源计量(它可以计算出进程组使用了多少进程资源,尤其是在计费系统中,这一点非常重要。)
d>.资源控制(它可以将进程组挂起和恢复。)
3.Docker容器的能力
我们以及了解到了Namespaces和cgroups的特性,这些特性个Docker带来了以下几个能力:
a>.文件系统的隔离:每个容器都有自己的root文件系统;
b>.进程隔离:每个容器都运行在自己的进程环境中;
c>.网络隔离:容器键的虚拟网络接口的IP地址都是分开的;
d>.资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个Dorcker容器;
七.Docker的安装和部署
官方安装文档地址:https://docs.docker.com/engine/installation/
1.在Ubantu服务器上安装Docker
a>.安装ubantu维护的版本
查看docker版本
利用docker容器运行命令
2.在windows操作系统上安装docker
GitHub地址:https://github.com/boot2docker/boot2docker
安装包下载地址:https://github.com/boot2docker/windows-installer/releases
我们从上面的介绍中知道docker是Linux容器技术的一种实现,它提供了操作系统级别的虚拟化,并且依赖于Linux内核的Namespace和Cgroups等特性。所以,从本质上来说,docker只能运行在Linux系统中并且也只能运行Linux系统的容器。那么在windows中我们如何运行docker呢?
实际上是需要通过虚拟机来实现,目前我们通过"Boot2Docker for Windows"的这一整套的运行环境,那么"Boot2Docker for Windows"包含哪些组件呢?分别是:Boot2Docker Linux ISO(正是一个为docker定制的虚拟机镜像,其中包含了docker的运行环境),Virtualbox(提供虚拟机服务的软件),MSYS-git(提供了一个shell 的运行环境),管理工具等四个部分组成。
注意,windows运行docker是必须依赖云虚拟机的,但是在Linux系统上,docker是可以直接运行在宿主机上的哟。从理论上来说,docker目前并不能支持windows应用的部署,但是微软公司依然对docker基于了厚望。目前,在Windows Azure(微软的公有云服务)中,已经通过Linux镜像提供了docker的支持,并且也提供了docker的镜像仓库,同时,微软也声称将在下一代的windows server(2016)中内建对docker的支持。目前我们看到Docker Windows CLI已经提供了源码。开发者可以通过GitHub去下载,在本地进行编译。所以,在未来,docker在windows server中也是一个重要的组成部分。
a>.点击下一步
b>.自定义安装路径(不推荐使用中文路径)
c>.选择所有的组件
d>.确定安装
e>.等待安装完成
f>.如果有弹窗提示,可以勾选信任按钮
g>.安装完毕
h>.查看docker版本
3.在OS X中安装docker
和windows一样,docker也不能直接运行在苹果的操作系统中,也是需要Boot2Docker来实现。那什么是Boot2Docker呢?首先,它包含了一个轻量级的Linux发行版,专门为Docker定制,能够运行docker的守护进程;第二,就是Virtualbox VM,它用来装载守护docker守护进程的Linux系统;第三,是docker的客户端,用来和docker的守护进程进行通信;第四,是一些管理工具。
GitHub地址依然是:https://github.com/boot2docker/boot2docker。
Boot2Docker下载地址是:https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac