前言:

这句话应该是开发人员经常挂在嘴边的吧!

“在我的机器上是正常工作的啊,MD,怎么到你这就不行了?”

开发人员就会联想到:

1. 肯定是你环境有问题; 
2. 要么就是你个傻*不会用吧;

带着这句话进入我们这次的主题,什么是容器?它能解决我们什么问题?

一、什么是容器?

容器这个词,当我们第一眼看它或许脑子里是这东西:瓶瓶罐罐、装水、装其他东西的玩意。

不管是什么,总的来说,容器给我们第一印象就是一个字 —— “装”

那么今天我们要说的容器技术是怎么一个概念呢?

其实,我们常说的“容器技术”是英文单词Linux Container(简称LXC)的直译。Container这个单词有集装箱、容器的含义(主要偏集装箱意思),但是在国内人们说“集装箱技术”有些拗口,听起来也不那么高大上,所以国内的人直接把它叫为“容器技术”,这听起来是不是档次更高了。

冷笑话:

比如说:今天你出门学东西,女朋友问:你出去干嘛啊?
结果你说:出去学“集装箱”啊,你女朋友肯定以为你脑子不正常了。

容器的一些特性:

容器就是将软件打包成标准化单元,以用于开发、交付和部署:

  • 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行;
  • 开发人员在自己的电脑上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器及公有云上运行;
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和测试及预发布环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突;

唠叨几句,有对比便于理解(可忽略):

物理机世界:

在还没有虚拟化的时候,我们宿主机上是不是直接装操作系统,里面部署了很多软件也打了补丁,当这台宿主机的硬件无法满足我们业务时怎么办啊?

我们要将操作系统或者业务进行迁移到更高配置的宿主机,这个工作量是非常大,而且很有技术挑战。

即便我们将业务迁移成功了,中间是不是有一段时间业务的中断啊,万一迁移不成功还得有回退方案;在以前做一个生产环境的迁移工作最少要两个星期或者半个月,怎么说呢?

第一:要写业务迁移方案 ——> 第二:在测试环境模拟 ——> 第三:在凌晨进行迁移工作 ——> 第四:如果不成功或者不能按时迁移完成要执行“回退方案”。

 虚拟化世界:

后来有了虚拟化技术就相对来说容易一些,因为虚拟化可以做“在线迁移”,所有的虚拟机是放在一个共享存储上,迁移就比较简单了,但是还是会有问题。

比如说:

在我们公司搭了个环境做好业务后,总不能把整个虚拟机拷到客户上吧?一个操作系统动不动都是几个G、十几G的容量,迁移起来很麻烦,所以说在你的测试环境是好的,到了客户环境又出问题了,这个大家应该很常见吧。

或者说:

在你测试环境是系统是CentOS7,但是客户环境是CentOS6、RedHat6,总不能让客户换操作系统吧?客户原来的业务怎么办呢?这个不现实吧。那你这些软件是不是都有可能出现不兼容问题,迁移的问题已经解决了,但是兼容性问题又出现了。

这些都是我们经常在生成环境遇到的问题,即使你们现在还没遇到这种头痛的问题,当我们在生产环境玩多了就好体会得到了。

 容器技术世界:

有了容器之后,这一切就变得简单了,容器最大的优点就是:既解决了迁移问题,又解决了软件不兼容性的问题。

它有点类似于在测试环境把所有的东西导出一个包(容器),将这个包(容器)导入到客户生产环境上解压就可以正常使用了。我们不需要关心客户是什么操作系统,它只需要跑容器软件就可以了。

本身容器就是个精简的东西,一个操作系统就一百多M,把软件封装在一起也就几百M,打包出来和迁移都是非常容易的,这就是容器的 轻量级 

二、为什么需要容器?

一般我们写程序的,能接触到好几个环境:

  • 自己写代码的环境叫做开发环境。
  • 给测试去跑的环境叫做测试环境。
  • 测试完可以对外使用的叫做生产环境。

 其实我们在学习编程中,很多时间都浪费在“环境”上:

  • 如果我现在重装了系统,我想要跑我的war/jar包,我得去安装一下JDK、Tomcat、MySQL等配置各种的环境变量才能跑起来。
  • 我们跟着网上博主给出的步骤去写Demo,但总是有Bug。
  • 好不容易在测试环境下跑起来了,在生产环境就各种出错!

所以说:容器使软件具备了超强的可移植能力!

举个例子:

在早期运输货物是没有集装箱这个概念的,那时候的货物杂乱无章的堆放着,肯定影响货物完好性和运输效率;

集装箱的发明之后极大的改善了全球物品的流转速度。

假设我们从欧洲进口一些货物回来,比如:跑车、钢琴、石油等,如果把它们都堆在一起运输是不是把货物给破坏了;

或者这些货物堆在一起就像快递,我们从网上购买服务器是不是特别担心,怕回来的时候服务器已经不是服务器了,被挤扁变成“钢板”了。

后来有了“集装箱”的发明,集装箱规格标准化、各式各样的货物都可以装、不同的交通工具都可以运输(吊机、卡车、货轮、火车),使得物流更加的便利;

比如我们是不是可以把石油、汽车、钢琴分别放到不同的“集装箱”里面,它们彼此之间就做到了隔离,同时也可以在一个货轮里面运输,它们彼此之间保证了独立性,同时也就更安全。

这就是容器技术,“集装箱”的优点容器里面都有,所以我们可以说容器技术是借鉴“集装箱”发明的特点。

三、为什么容器技术现在才火?

Linux Container(简称LXC)容器技术的诞生(2008年)就解决了IT世界里“集装箱运输”的问题。那么为什么2013年左右容器才火了起来呢?

是因为Docker的出现。

四、什么是Docker?

  • 我们说“容器”就是Docker吗?这句话不准确吧!

  • 我们“云“就是OpenStack吗?这句话也不准确吧!

  • Docker是实现“容器”的一个解决方案而已!

  • 就像OpenStack也是实现“云计算”的一个解决方案!

Docker是基于GO语言实现的开源容器项目,当时Docker技术诞生之后,并没有引起行业的关注。

正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。

开源后Docker在2013年一炮而红,几乎Docker已经成了容器技术的 代名词 。容器技术早已存在,传统的容器技术没有成为主流的原因是未能提供标准化的应用运行时环境,而基于“容器技术”的Docker从一开始就以提供标准化的运行时环境为目标,真正做到“Build once,Run anywhere”(构建一次,到处运行)理念。

  • Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc. 。
  • Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻量级”。

这是Google对 IT界技术的热度测评,Docker、OpenStack、Hadoop现在并成为IT界最热门的三个技术。在容器技术之前,业界的网红是 虚拟机 。虚拟机技术的代表,是VMWare和OpenStack。

自从Docker火了之后,Docker的热度超过了OpenStack和Hadoop。并不是说Docker热度高于这两个技术,OpenStack和Hadoop就不好了或者说没那么热了,是因为他们的技术相对来说比较成熟了,而Docker是2013才出现的,加上它的一些特性,所以它更加吸引人。

Docker特性:

标准化:

  • 保证一致的运行环境

在我计算机上运行的这个“容器”,我保证这个“容器”迁到你机器上运行的效果是跟我一样的效果。

不会因为你机器上的硬件、软件、操作系统不一样而导致不一样的结果,这个在物理机和虚拟化时代是受影响的,但是在“容器”就不受影响。

  • 弹性伸缩,快速扩容

如果不能满足或者不够了,可以再起几个容器。

  • 方便迁移

方便迁移大家听了前面的介绍应该能体会得出了。

  • 持续集成、持续交付与持续部署

“持续”就是“高可用”的意思,假设我们在一台虚拟机上部署了N个容器,万一这台虚拟机“宕机”了怎么办?

讲到“高可用”,我们就在这里在唠叨几句,便于理解:

虚拟化世界里:

我们会将业务搭建成一个集群模式,如果一台主机“宕”了,那么其他节点会马上接替业务,从而实现一个“高可用”。

容器世界里是怎么实现的呢?

那就是我们常说的“Docker+k8s”,“k8s”全称是“kubernetes”,它就是用来解决类似这样的问题的。

Docker跟kubernetes是什么关系呢?

比如说:

大家听说过“KVM”吧?它就是“云”底下开源虚拟化,但是如果你单纯去跑“KVM”是很麻烦的,所以后面出现了OpenStack接管“KVM”,并且提供一下管理的机制、监控、运维功能、高可用的解决方案,这些都是OpenStack这层去完成的。

那么Docker就相当于KVM,kubernetes(k8s)就相当于OpenStack。所以说kubernetes(k8s)就是提供这些功能,比如说:这个“容器”在这台机器上出现故障了,它会自动的在另外一台机器启动你这个“故障容器”(副本),从而实现“高可用”机制。

 高性能:

  • 不需要进行硬件虚拟以及运行完整的操作系统

轻量级:

  • 快速启动

隔离性:

  • 进程隔离

五、Docker VS VM

Docker是内核级的虚拟化,可以实现更高的性能,同时对系统资源需求 非常低 ,所以 资源利用率就高 

容器减少了“客户机操作系统”这层,直接在“Docker”这层就跑应用了;

而右边这个架构,意味着每个“应用”底层都要有一个“操作系统”,这本身就带来了一定的开销。

这就是容器为什么 轻量级 的原因。

优势:

  • Docker容器很快,启动和停止可以在秒级实现,而传统的虚拟机方式需要数分钟
  • Docker容器对系统资源需要很少,一台主机上可以跑上千个Docker容器(在IBM服务器上就已经实现了同时运行10K量级的容器实例)。

容器和虚拟机共用

将容器和虚拟机配合使用,为应用的部署和管理提供极大的灵活性。

六、Docker架构图

Docker 三大核心概念:

  • 镜像 (Image)
  • 容器 (Container)
  • 仓库 (Repository)

简单步骤如下:

Client 执行 “docker run ....” 这条命令时——> 它会查看本地有没有这个“镜像”(image),如果没有就向“镜像仓库”拉取到本地 ——> 然后将拉取的“镜像”运行起来就叫“容器”。

不是很恰当举例,仅供个人参考:

我们JD购买一台服务器称为“镜像”——> JD本地仓库没有该服务器 ——>从JD总部仓库调取打包好的服务器称为“仓库”——> 调取回来到本地仓库的服务器称为:镜像——> 我们收到的包裹里面装着服务器这个包裹叫“容器”。

七、生产环境架构图

这个框架就是大多数IT公司的业务都想往或者说必须往这个框架去发展以及转型。如果一个IT公司的业务从一开始就不上“云”或者不使用“容器”,那么它的业务效率大大的下降,资源浪费也比较大,自然成本也提高。

下一章:安装Docker,开始Docker之旅!

认识容器和Docker(一)的更多相关文章

  1. 容器与Docker简介(三)Docker相关术语——微软微服务电子书翻译系列

    本节列出了在更加深入Docker之前应该熟悉的术语和定义. 有关详细的定义,请参阅Docker提供的术语表. 容器镜像(Container image):具有创建容器所需要的所有依赖和信息的包. 镜像 ...

  2. 容器与Docker简介(二)什么是DOCKER——微软微服务电子书翻译系列

    Docker是一个开源项目,用于将应用程序部署自动化,作为可在云端或本地运行的可移植,自包含的容器. Docker同时也是一家促进和发展这项技术的公司,与云,Linux以及Windows的供应商(包括 ...

  3. 容器化-Docker实战

    导读:本文系统性介绍Docker安装.Docker组件.Docker命令.Dockerfile语法和Docker应用,通过上述介绍使我们已经对docker基本操作有一定了解. 一.前言 本文将系统性的 ...

  4. 容器,Docker, Kubernetes和Kyma,以及Kyma对SAP的意义

    大家好,今天非常高兴能给大家做一个关于Kyma的技术分享.这个session的audience主要是针对使用咱们成都研究院使用Java和nodejs等技术栈做微服务开发的同事们.对于在ABAP net ...

  5. AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

    一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...

  6. AspNetCore容器化(Docker)部署(一) —— 入门

    一.docker注册安装 Windows Docker Desktop https://www.docker.com/products/docker-desktop Linux Docker CE h ...

  7. AspNetCore容器化(Docker)部署(二) —— 多容器通信

    一.前言 着上一篇 AspNetCore容器化(Docker)部署(一) —— 入门,在单个容器helloworld的基础上引入nginx反向代理服务器组成多容器应用. 二.配置反向代理转接 配置转接 ...

  8. AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署

    一.前言 (Jenkins.Docker.Git/Svn组建一套简单的自动化发布流程) 文章中用到的相关服务器角色 角色 环境 功能 开发机 Win10.Docker(Linux OS) 编码.调试 ...

  9. .NETCore 实现容器化Docker与私有镜像仓库管理

    原文:.NETCore 实现容器化Docker与私有镜像仓库管理 一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技 ...

随机推荐

  1. AngularJs 学习笔记(三)依赖注入

    一个对象可以通过三种方式来获取对依赖对象的控制权: 1.在内部创建依赖的对象 2.通过全局变量引用这个依赖对象 3.通过参数进行传递(在这里是通过函数参数) AngularJs通过$injector注 ...

  2. windows下编译安装BOOST

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  3. ruby the diference between gets and gets.chomp()

    ruby the diference between gets and gets.chomp() 二者都是可以获取用户命令行输入的函数,但是 gets获取内容后,后面 附带了 多余的换行符号'\n'; ...

  4. pyCharm安装破解

    补丁破解 下载 http://idea.lanyus.com/jar/JetbrainsCrack-2.7-release-str.jar 并将 JetbrainsCrack-2.7-release- ...

  5. android点击返回键,如何做到不destory当前activity,只是stop。重新返回该activity的 时候可以直接使用,不需要创建新的activity实例

    问题描述,如题目: android点击返回键,顺序执行 pause,stop,destory. 以至于想重新进入这个activity的时候还要重新执行onCreate()方法,那么如何解决不再重新执行 ...

  6. STL-Deque 源码剖析

    G++ ,cygnus\cygwin-b20\include\g++\stl_deque.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Comp ...

  7. Servlet知识点总结

    一, ServletAPI中有4个Java包: 1.javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口 2.javax.servlet.http:其中包含定义 ...

  8. 关于dropout的有趣的进化论解释

    训练神经网络时,使用dropout技术来防止网络的过拟合.我们这里且不谈这个技术的细节,但就这项技术的有趣的生物进化论解释了解下.自然界的高等生物进化出了两性繁殖,其原因可以解释为使得变异的基因能散播 ...

  9. WBS 与 甘特图

    WBS:工作分解结构(Work Breakdown Structure) 创建WBS:创建WBS是把项目 交付成果和项目工作分解成较小的,更易于管理的组成部分的过程. WBS是项目管理重要的专业术语之 ...

  10. EXCEL解析之终极方法WorkbookFactory

    Selenium做自动化测试当然不能避免和Excel打交道. 由于Excel版本的关系,文件扩展名分xls和xlsx, 以往的经验都是使用HSSFWorkbook和XSSFWorkbook来分别处理. ...