聊聊Docker
为什么是Docker
进入21世纪,继互联网之后,云计算开始大放异彩。云计算是互联网发展后期的必然方向,反过来,云计算也进一步推动了互联网的发展。云计算模式最关键的突破就是资源使用方式的改变。
云计算是一种融合了多项计算机技术的、以数据和处理能力为中心的密集型计算模式,它的主要技术包括虚拟化、分布式资源管理、分布式并发编程模式、信息安全等。其中,虚拟化作为云计算的核心元素,其价值日益体现:一方面,集中部署 IT 资源并抽象化以实现多用户共享,极大程度地提高了资源的利用率,降低了使用成本;另一方面,缓解了复杂的软硬件适配问题。所以, 虚拟化技术是云计算中最关键、最核心的技术原动力。
在早期,主流的虚拟化技术是虚拟机,它实现了极高的隔离度和标准化, 但是这种基于硬件隔离的虚拟化方案也给宿主机资源带来了极大的压力。
为了解决虚拟机的种种问题,获得比虚拟机更快、更少资源的虚拟化方法, 就需要对资源进行比虚拟机更高级别的抽象。通过更细的粒度对资源进行分配和控制,是一种可行的思路。为此,Linux内核添加了新的技术,这便是众所周知的控制组(cgroup) 。通过这一技术来对服务进行运行时隔离,这种被隔离起来的运行时环境,被称为Linux容器(LXC)。
Docker是基于LXC容器技术的封装,Go语言开发实现。Docker与虚拟机的详细对比,可参见阮一峰老师的《Docker入门教程》,这里不再赘述。
在Docker生态环境的不断完善下,Docker技术的最佳实践场景也越来越多,除了基础云服务平台,在CaaS、CI、CD、DevOps、微服务架构等方面也吸引了越来越多的目光。
Docker是什么
Docker作为一种轻量级虚拟化技术,其本质是一个进程以及运行该进程所需要的依赖,而Docker内的所有进程是这个容器进程的子进程。在这种虚拟化模型下,通过资源隔离、资源控制等技术手段,来解决Docker在实现虚拟化目标过程中遇到的种种障碍。
Docker容器间的资源隔离,通过Linux内核的 namespace实现。这里的资源包括:网络空间(net)、文件系统空间(mnt)、用户空间(user)、进程空间(pid)、进程通信空间(ipc)和域名空间(uts)。这些空间的隔离需求都是虚拟化的基本需求,都很好理解,这里只简单讲一下域名空间。通过域名空间的隔离,每个Docker就可以拥有独立的主机名和域名,在网络上可以被视作一个独立的节点,而不再是宿主机上的一个进程。
对 Docker 而言, 一方面要实现各容器的良好隔离, 另一方面还需要对容器使用的资源进行限制和管理。
Docker 依靠 Linux 提供的 cgroup 技术来实现资源控制。cgroup 是由 Linux内核提供的一种对各进程组所使用的物理资源( 包括CPU、Memory、IO等) 进行记录、限制和隔离的技术。cgroup的实现本质上是给任务挂上钩子,当任务运行的过程中使用某种资源时,就会触发钩子上锁附带的子系统进行检测,根据资源类别的不同,使用对应的技术进行资源限制和优先级分配。
换个角度看,Docker也是一个执行环境,一个与宿主机共享内核但与系统中其他进程资源相隔离的执行环境,这就是Docker容器。

从上图官网给出Docker架构图可以看出,这个执行环境需要提供这几个基本要素:
- Docker client:Docker客户端;
- Docker deamon:Docker服务端,处理用户(Docker client)请求;
- Docker Registry:Docker镜像仓库。
Docker 中有两个重要概念, 一个是镜像( Image) , 另一个是容器( Container)。可以这么理解,镜像是容器的静态表现形式或物理存储对象,而容器是镜像的动态表现形态或内存存储对象。
之所以抽象出镜像这个概念,是为了解决LXC容器的可移植性问题,即无法通过标准化的镜像/模板实现虚拟容器的制、复制、重建。 因而 Docker 在 LXC 基础上进行了进一步封装,通过文件系统存储技术(如aufs、device mapper、overlayfs)实现镜像的分层、写时复制、联合挂载、内容寻找等关键技术特性,很好地解决了容器的快速移动和更新问题。
这里特别提一下为什么把分层作为镜像的重要特性。镜像中大部分文件都是相同的(如rootfs等),如果不分层,势必存在众多的文件冗余,造成镜像大小沉重。通过分层技术,实现在不同镜像之间共享镜像层,实现轻量级别的镜像配置,提高Docker镜像构建、存储和分发的效率,节省了用户的时间和存储空间。
回到最开始的问题:Docker是什么?这取决于看它的视角。从操作系统的视角来看,它是进程;从用户的角度来看,它是运行环境;从开发的角度来看,它是虚拟化技术。
Docker云是什么
Docker作为云计算虚拟化的一环,打开了云计算的大门。进入云计算的大门后,发现门后的新的生态系统是如此庞大。在分布式的生产使用中,容器相关的网络、存储、集群、高可用性等都是不得不面对的问题。从容器到容器云的进化应运而生。
容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。
Docker只是个单机下的容器管理工具,通过命令行进行手动管理。在企业使用场景中,容器有了跨主机(即分布式)的使用需求,而且可能容器数量庞大,拓扑关系复杂。手动操作方式的低效和不可移植性是个严重的应用障碍。Docker容器的编排和部署工具在这种背景下应运而生,Fig/Compose,Machine,Swarm,Fleet,Kubernetes都属于此类。
编排即依赖关系管理,部署则是在目标机器上按依赖关系进行动作。通过编排和部署工具,可以在一个新的环境上快速重现容器的配置和集群。
- Compose侧重于单机环境的Docker的编排部署,管理对象的基本单位是容器;
- Machine侧重于跨宿主机环境的部署管理,管理对象的基本单位是宿主机;
- Swarm侧重于集群环境的部署管理,管理对象的基本单位是具有相同标签属性的多台宿主机的集群;
- Fleet侧重于集群环境的编排部署,管理对象的基本单位是服务(全局服务单元);
- Kubernetes除了支持集群环境的编排、部署,还支持副本管理、调度管理、存储管理、网络管理、多租户管理等特性,管理对象的基本单位是容器组(pod);
可见它们对管理对象的抽象层次越来越高,对Docker云的运维能力也是越来越强。
(完)
聊聊Docker的更多相关文章
- 聊聊Docker数据卷和数据卷容器
当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...
- 聊聊Docker理论知识(二)
目录 一.什么是Dcoker 二.Docker的三大核心概念 1.镜像(Image) 2.容器(Container) 3.仓库(Repository) 三.Docker架构组成 四.Docker的技术 ...
- 聊聊docker那些端口问题
今天来系统聊一聊docker的端口,常见的有容器内程序端口.容器端口.主机端口.Dockerfile中EXPOSE端口.docker-compose和docker run中的port等. 貌似很多端口 ...
- Spring Boot工程发布到Docker
先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...
- 深入浅出docker
笔者在海外工作多年,所以文中多用英文单词,有些时候是为了更精准的描述,请见谅.希望这篇随笔能帮大家入门docker.由于在海外连博客园有些慢,所以我图片用的比较少,以后再考虑一下如何更好的解决图片上传 ...
- Analyze a docker instance start failure
错误信息:Cannot start container xxxxxxxxxxx | Error getting container xxxxxxxxxxxxxxx from driver dev ...
- 总结对Docker这个东西的想法
记得一开始的时候,还只能在一些网站上看到关于Docker零星的一些消息,之后的不久,有关Docker消息就遍布网络. 是什么因素让Docker火起来的? 或者说什么原因促使大家都对Docker感兴趣并 ...
- 深刻理解Docker镜像大小
都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处 ...
- 有容云:上车 | 听老司机谈Docker安全合规建设
编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...
随机推荐
- POJ - 1321 dfs [kuangbin带你飞]专题一
枚举行和列即可,当前已经放下cnt个棋子,当前已经搜索到第r行,如果 n - r + cnt < k 直接退出,因为后面无法放下剩下的棋子. AC代码 #include<cstdio&g ...
- java遍历的优化
说明:这是在面试中面试官出的题.虽然是常见的优化问题,但这种经验的确很有用.感慨之余,分享出来,以此共勉. 场景:现有List<PersonA>,List<PersonB>,P ...
- Windows10系统故障检测你知道多少-上海IT33
Windows 10作为微软公司最新的一款操作系统,从使用的方便和界面的整洁上来说,固然是很好的,但是其因为隐私问题,致使很多人不惜一切代价想要远离Windows 10这款操作系统.尽管Windows ...
- pc浏览器css和js计算浏览器宽度的差异以及和滚动条的关系
如图: css宽度:1250 不包括滚动条宽度 用控制台箭头选取元素显示的左边的宽度:1250 不包含滚动条宽度 缩放浏览器右上角显示的宽度:1267 包含了滚动条宽度 再看下控制台: 由此可计算浏 ...
- 关于服务器的CPU的几个概念学习总结
物理CPU 物理CPU: 物理CPU是指插在主板上面的CPU芯片.即指在主板上肉眼能看到的CPU的个数.一般而言,个人台式机或笔记本上只会有一个物理CPU芯片.而服务器主板上往往有多个物理CPU. L ...
- 【mysql】phpMyadmin上传文件限制
在使用phpMyadmin导入数据库的时候,因为脚本在上传的时候响应时间过长,导致大于2M的数据偶尔会导入失败.而且大多数默认设置,只能导入2M的数据. 遇到这种情况, 我们可以修改php.ini以及 ...
- HI3531由DMA 发起PCIe 事务
Hi3531 PCIe 控制器内含DMA 控制器,DMA 控制器包含有两个DMA 通道(一个 DMA 读通道和一个DMA 写通道).PCIe 控制器内包含的DMA 控制器用于大数据量 的存储器读写事务 ...
- Caused by: java.lang.ClassNotFoundException: javax.persistence.Entity
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- SDL 在指定窗口中绘图
SDL默认会自动创建绘图窗口,可以通过设置环境变量,让其在指定窗口绘图.代码如下: [cpp] view plaincopyprint? char sdl_var[64]; sprintf(sdl_v ...
- C#连接oracle数据库步骤
1. 确认操作系统类型,操作系统是64位还是32位: 2. 按对应版本安装oralce客户端版本(64位还是32位): 3. 安装oralce管理员模块,同时赋予安装目录权限 4. 注册old ...