Docker背后的想法是创建软件程序可移植的轻量容器,让其可以在任何安装了Docker的机器上运行,而不用关心底层操作系统,类似船舶使用的集装箱,野心勃勃的他们成功了。

Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。Docker能处理的事情包括:

  • 隔离应用依赖
  • 创建应用镜像并进行复制
  • 创建容易分发的即启即用的应用
  • 允许实例简单、快速地扩展
  • 测试应用并随后销毁它们

标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;
节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
方便持续集成,通过与代码进行关联使持续集成非常方便;
可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。

目前大型互联网公司有腾讯、京东、美团、新浪、大众点评等都在使用。比如说腾讯的盖亚,基于docker部署管理,据说已经有万台规模,用于大数据处理。美团主要是用于持续集成,自动构建方面,另外新浪也做了实践。容器化是一个大趋势,以后这方面的公司会越来越多。

Docker提供功能广泛,这里有几个的例子:

  • Images(镜像):Docker可以通过Pull和Push命令构建对象到服务中心

  • Containers(容器):Docker可以通过Start/Stop命令管理容器的生命周期

  • Logging(日志):Docker可以通过stdout,stderro捕获输出所有的容器内部信息

  • Volumes(存储):Docker可以创建和管理容器的相关文件存储

  • Networking(网络):Docker可以创建管理虚拟的接口和内部所有容器之间的网络桥接

  • RPC:Docker服务器提供允许外部程序去控制所有容器的行为的API

镜像管理

镜像是Docker管理最基础的部分,同时也是Docker最大的亮点。镜像管理涉及到镜像的制作、更新、存储、分发、权限等多个方面。

镜像制作方面,应该坚持三个原则,第一是坚持镜像总是从Dockerfile生成。这样做最大的好处是可以通过Dockerfile“阅读”镜像,在后续的协作、升级维护等方面会带来巨大的便利。第二是镜像之间应该避免依赖过深,建议为三层,这三层分别是基础的操作系统镜像、中间件镜像和应用镜像。第三是坚持所有镜像都应该有对应的Git仓库,以方便后续的更新。

镜像的更新需要一个自动化的流程,这可以通过SCM和CI系统自动触发实现。具体的流程如下图所示。开发者首先将代码和Dockerfile提交到Git仓库,然后Git通过webhook方式触发Jenkins的主动获取代码和Dockerfile文件,Jenkins再通过Docker相关的插件生成镜像并推送镜像到私有的Registry。这样,在服务器上就可以通过拉取新的镜像部署容器。

关于Registry,可能会涉及三方面的问题,一个是单点问题,对应的解决方案可以考虑DRBD、分布式存储以及云存储。二是Regitry的性能问题,目前可用的解决方案是通过HTTP反向代理缓存来加速Layer的下载。三是Registry用户权限,Nginx LUA可以提供一个简单快速的实现方案。

发布管理

和传统的发布流程相比,Docker最大的好处是不需要考虑外部依赖,利用容器的自包含的特点,我们可以将发布回滚流程标准化和产品化。而传统的发布和回滚,需要casebycase去针对不同应用做升级回滚的方案。要做到基于Docker的发布,镜像的生成必须坚持自动化,否则会发现升级比传统的方法更麻烦。因此在现实中我们也发现很多企业将代码目录放到主机目录映射到容器内,这样做破坏了Docker的自包含特性,解决的办法是坚持应用镜像更新自动化。

发布管理

和传统的发布流程相比,Docker最大的好处是不需要考虑外部依赖,利用容器的自包含的特点,我们可以将发布回滚流程标准化和产品化。而传统的发布和回滚,需要casebycase去针对不同应用做升级回滚的方案。要做到基于Docker的发布,镜像的生成必须坚持自动化,否则会发现升级比传统的方法更麻烦。因此在现实中我们也发现很多企业将代码目录放到主机目录映射到容器内,这样做破坏了Docker的自包含特性,解决的办法是坚持应用镜像更新自动化。

日志管理

由于容器是无状态的,所以存储在容器内的日志会随着容器的销毁而消失。stdout/stderr类型的日志,可通过logspout转发到syslog中心来收集。打印到文件的支持,比如accesslog,需要将日志存储到外部的Volume,并在Docker主机上使用logstash收集转发。

配置管理

容器里没有CM agent,无法接收CM指令。CM运行到Host上也无法管理容器中的文件,如果手工修改容器内的配置,那新创建的容器仍然是旧的。配置大体上分为两种类型,一种是服务之间的连接信息,这种配置建议考虑使用服务发现系统,也可以使用一些更加传统的方法,比如通过环境变量来协调作开发和生产环境的配置差异。一种是一般的配置文件参数,配置文件和Dockerfile应该一起存储到一个Git仓库,修改后自动build更新镜像。

网络管理

目前Docker支持的网络包括Host网络、NAT网络、物理网桥和网络虚拟化。Host网络中容器和主机共享网络命名空间,不同容器需要做好端口规划,防止端口冲突。Nat网络是基于四层代理以及NAT技术,依赖portmap,进出都需要转发,性能低,主机上需要做好端口规划,容易搞混。物理网桥方案,和传统虚拟机的网桥没有区别,适合容器数量有限且相对静止的场景。网络虚拟化是基于隧道的overlay网络,目前开源方案有SocketPlane、Weave、Flannel,适合数量大,动态创建销毁容器的场景。

Docker有什么好处?的更多相关文章

  1. Docker 第一篇 认识Docker 的作用好处

    Docker 第一篇 认识Docker 的作用好处 (1)什么是Docker (2)Docker 优势劣势 Docker是去年开始关注并学习的,因为项目用到了AspnetCore 了解了之后总感觉会用 ...

  2. 玩转Docker之Docker简介(一)

    近几年掀起的docker热潮,可谓席卷全球.什么原因使它这么备受推崇呢?主要是因为它解决了行业痛点.玩linux的都知道,安装个应用时还要先安装所需环境.相关库.解决依赖关系.而docker的出现,很 ...

  3. 程序开发使用docker部署

    我们公司自己研发了一套 grand-line 系统,使用 docker 来部署项目. 我是第一批小白鼠,一开始网络差,build 一次要半个小时,连接进入 web shell 也很慢,部署一个微信项目 ...

  4. Docker个人学习总结

    最近一段时间学习了下Docker,关于Docker的安装,运用什么的在这里我不会过多的说明,我只说我对于Docker的一些理解,附加我用于记录的少量代码. 刚开始学习Docker的时候,找资料在网上看 ...

  5. 如何使用 Docker、ECS、Terraform 重建基础架构?

    早期 Segment 基础架构普遍组合在一起.我们通过 AWS 界面设定实例,使用许多闲散的 AMI,并且采用三种不同的部署方式. 然而随着商业的飞速发展,工程师团队的规模不断扩大,基础架构的复杂度也 ...

  6. Docker学习计划

    刚开始学习Docker的时候,找资料在网上看到最多的是Docker的好处.比如: 1.Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多 2.Docker 对系统资源的利用率很高, ...

  7. 巧用linux版powershell,管理linux下的docker

    大家好,我把用powershell的docker马甲命令的好处,放在了页面下方,从第五章开始. powershell 传教士 原创文章 始于 2017-09-07 允许转载,但必须保留名字和出处,否则 ...

  8. Asp.NetCore轻松学-使用Docker进行容器化托管

    前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...

  9. Docker五大优势:持续集成、版本控制、可移植性、隔离性和安全性

    随着Docker技术的不断成熟,越来越多的企业开始考虑使用Docker.Docker有很多的优势,本文主要讲述了Docker的五个最重要优势,即持续集成.版本控制.可移植性.隔离性和安全性. 对于Do ...

随机推荐

  1. java 流

    http://www.iteye.com/magazines/132-Java-NIO http://liyuanning.blog.163.com/blog/static/4573228620101 ...

  2. Versions 出现 SVN Working Copy xxx locked

    Versions处于选中状态,Finder的导航栏就是Versions的导航栏,如下图,Action - Cleanup...,就可以解锁了

  3. “享受”英语的快乐—我是如何学英语的

    一:扬长避短重新认识英语课本 目前市场上的课本都有弊端,<新概念><走遍美国><疯狂英语>等等,不怪你学不下去,不是你的问题,课本本身就有漏洞的,但我怎么学的呢,我 ...

  4. 利用decorator和descriptor进行数据缓存

    class cached_property(object): def __init__(self, func, name=None, doc=None): self.__name__ = name o ...

  5. Java中删除文件、删除目录及目录下所有文件(转)

    原文链接:Java中删除文件.删除目录及目录下所有文件 知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除,具体代码示例如下: ...

  6. 如何使用MVC编写Winform程序代码

    efwplus开源框架官网:www.efwplus.cn 前提:业务分析设计已完成,界面设计完成   1.代码结构划分 1)界面层:FrmSugeryApplyList.ISugeryApplyLis ...

  7. Could not get BatchedBridge, make sure your bundle is packaged correctly

    react-native 运行android项目的时候运行成功但是模拟器上会提示: Could not get BatchedBridge, make sure your bundle is pack ...

  8. 转:C/C++内存管理详解 堆 栈

    http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...

  9. 实现TabView(页签)效果

    今天花了点时间,设计了一个网页上用的tabview(页签.tabcontrol)效果.个人觉得实现得比较不错,网页元素用得比较少,js代码也比较精练.测试了一下支持IE.FireFox以及chrome ...

  10. 解决Unreal Engine 4.7.6的DerivedDataCache在C盘疯狂膨胀的问题

    打开 YourEngineFolder\Engine\Config\BaseEngine.ini 将 Local=(Type=FileSystem, ReadOnly=, FoldersToClean ...