Docker简介以及安装
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
Docker简介以及安装的更多相关文章
- Docker 简介及安装
Docker简介: 什么是Docker?将应用程序自动部署到容器 go语言开源引擎 Github地址:https://github.com/docker/docker 2013年初 dotCloud ...
- Docker简介与安装配置
目录 Docker简介 什么是Docker 为啥要用容器 Docker Engine Docker架构说明 Docker安装 Docker版本介绍 Ubuntu安装docker-ce CentOS7安 ...
- Docker简介和安装(一)
Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...
- Docker简介与安装
简介与安装 简介 Docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的 ...
- docker简介及安装(1)
Docker简介 软件开发中最为麻烦的事情可能就是配置环境了.由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且 ...
- Docker从入门到放弃(1) Docker简介与安装
目录 一.Docker简介 1.Docker是什么: 2.为什么有docke的出现: 3.docker与传统容器的区别: 4.docker基本组成 5.docker工作原理: 二.Docker安装 ...
- Docker简介与安装(一)
Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...
- Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装
Container技术: 传统的虚拟化技术: 通过对硬件层模拟,从而实现了能够在一套硬件上面运行多个操作系统,因为通过硬件虚拟化,使得操作系统认为在它之下就是硬件层 但是实际情况是这样的:虚拟机中的O ...
- docker简介及安装
Docker : 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
随机推荐
- <<浪潮之巅>>阅读笔记二
好的文章总是慢慢吸引着你去阅读,这本书的作者是吴军博士,让我很钦佩的是他还是一个很著名的程序员.其实我感觉理科生在写作方面的能力是很欠缺的,我们经常做到了有观点,但是做不到和别人表达清楚你的观点想法, ...
- Python学习笔记 --第二章
Python语法基础 "#"号为注释符,建议缩进四个空格,Python大小写敏感. 数据类型 整数 0,2等等,以0x开头的为十六进制数 浮点数 1.58e9 字符串 用'或"括起来的任意文 ...
- HDU 2096 小明A+B
http://acm.hdu.edu.cn/showproblem.php?pid=2096 Problem Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能 ...
- 产品激活 比如Windows激活 , office激活 等激活的原理是什么? KMS等激活工具安全吗?
什么是密钥管理服务 (KMS)? 密钥管理服务 (KMS) 允许在本地网络上激活产品.这样,单台计算机不必连接至 Microsoft 便可激活产品.需要将一台计算机配置为 KMS 主机.管理员必须为 ...
- App WebView实例化
a,高级设置里的环境变量 jdk的配置 b,下载Google的sdk,里面直接包含eclipse 1,新建一个项目 2,起个名字 3,设么走不做,next 4,只操作选择显示的三种方式 5,next什 ...
- Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析
Hashtable 是一个很常见的数据结构类型,前段时间阿里的面试官说只要搞懂了HashTable,hashMap,HashSet,treeMap,treeSet这几个数据结构,阿里的数据结构面试没问 ...
- oracle小知识点
一 . procedure和function: procedure和function在语法上几乎完全一样,使用上却有小小的差别, procedure可以单独的调用 在命令行直接exec pro_xxx ...
- BZOJ3526[Poi2014]Card——线段树合并
题目描述 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].现在,有m个熊孩子来破坏你的卡片了!第i个熊孩子会交换c[i]和d[i]两个位置上的卡片. ...
- lambda 分类抽取N条
从每个分类中,按照比例抽取 lista中percent是比例,按照这个比例抽取. static List<A> lista = new List<A>() { new A(){ ...
- day9 笔记
集合 去重 无序 元素不可变类型 可hash 命令 set() 创建可变集合 frozenset() 创建不可变集合 .add() 添加元素,只能放单个值 .update() 添加元素,可以更新多个值 ...