Docker:集装箱式“运输”在软件上的实现

Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量、可移植、自包涵的容器引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机器,生产环境,虚拟机和云等。

Docker基于Go语言开发,代码托管在 Github上,并遵循Apache 2.0开源协议。近期,这个项目得到了越来越多的用户追捧,Github上的Star数已经9000多,Google的Compute Engine也支持 Docker,而在国内,知名的 百度也把Docker作为其Paas的基础

来自Docker官方博客

Docker容器可以封装任何有效负载,几乎可以在任何服务器之间进行一致性运行。

Docker的常用案例包括:

  • 自动打包和部署应用
  • 创建轻量、私有的PaaS环境
  • 自动化测试和持续集成/部署
  • 部署并扩展Web应用、数据库和后端服务器

背景

十五年前,几乎所有的应用都是采用定义良好的堆栈编写,并且部署到单一的专有服务器上。今天,开发人员可以使用现成的最佳服务组合构建和装配应用程序,并且为这些应用程序进行跨不同硬件环境的多重部署做好了准备,包括公共的、私有的和虚拟化的服务器。

图1 IT演变

这种设置可能会用在:

  • 不同服务和“依赖抵御”之间的相互不良反应
  • 在快速迁移和跨不同硬件之间面临挑战,不可能管理一个跨多个服务并且被部署在不同硬件类型上的矩阵。

图2 多个栈和多种硬件环境所面临的挑战

我们可以看到,这里有大量的组合和排列应用/服务以及随时需要考虑每一个应用程序被写入或改写的硬件环境。这将给编写应用程序的开发人员和试图创建一个稳定、安全、高性能操作环境的人们带来一个困难的局面。

图3 使用动态栈和动态硬件环境创建一个N*N矩阵

那么,该如何解决这种局面呢?让我们举个运输界的例子,在1960年之前,大多数散货通过船进行托运,托运人和承运人很担心不同类型的货物之间会发生些不良反应(例如,一批铁压在一袋香蕉上)。同样,各种不同运输方式之间进行转换也是非常痛苦的,其中一大半的时间都是花在港口对货物进行卸载,然后再装载,并且还要等待同一批货物一起被装到火车、卡车等交通工具上。这样,在多种不同物品和多个不同的运输机制之间就存在一个N*N的矩阵。

图4 1960年之前的海运

幸运地是,标准集装箱的出现解决了以上所面临的难题。任何货物,从开心果到保时捷,都可以通过标准集装箱进行包装。托运人员或承运人可以把集装箱进行密封或者禁止再次打开,直到运输到目的地。在运输过程中,集装箱可以被卸载、装载、堆积、运输并且还可以有效地长距离运输。集装箱颠覆了全球运输方式——一个标准,让货物在火车、汽车、轮船之间畅通无阻。今天,有1800万只集装箱进行着90%的世界贸易。

图5 一个标准容器(集装箱)的出现解决了运输方面的难题

在某种程度上,Docker可以看作是用代码编写出来的国际集装箱。

图6 软件“运输”解决方案也是一个标准的容器系统

Docker可以把任何应用及相关依赖项打包成一个轻量、可移植、自包涵式的容器,该容器拥有标准的操作,从而能够实现自动化。与此同时,所有的应用都可以运行在任何Linux服务上。相同的容器,开发者可以在笔记本上有规模的运行、生产、也可以在虚拟机、逻辑服务器、OpenStack集群、公共实例、或以上所有结合(的方式)上运行。

换句话说,开发者构建的应用只需一次构建即可多平台运行。运营人员只需配置他们的服务,即可运行所有的应用。

Docker的主要功能特征

  物理容器 Docker
内容无关性(Content Agnostic) 相同的集装箱可以容纳几乎任何类型的货物 可以封装任何有效负载及其依赖项
硬件无关性(Hardware Agnostic)
同一标准的容器允许把货物从船上运输到火车、卡车上,直到运输到仓库,整个过程无需整理货物或打开容器


使用操作系统基元(例如:LXC)几乎可以在任何平台上运行——虚拟机、裸机、OpenStack、公共IaaS等,并且无需修改

内容隔离和交互 无需担心铁压在香蕉上,容器可以堆积运输 资源、网络和内容隔离,避免依赖地狱
自动化
标准的接口使其易于实现自动化装卸、搬运等


运行、启动、停止、提交、搜索等都有标准的操作,非常适合devops:CI、CD、自动扩展、混合云

高效 无需打开或修改,可以在起始两地快速地移动/运输 轻量级、几乎没有任何偏向和启动惩罚,可以进行快速移动和操作
职责分离 托运人担心盒子内部、承运人担心盒子外部 开发人员担心代码,运营人员担心基础设施 

更多技术特性:

  • 文件系统隔离:每个进程容器都运行在一个完全独立的根文件系统里;
  • 资源隔离:系统资源,例如CPU、内存等,使用cgroups分配在不同的流程容器里;
  • 网络隔离:每个进程容器携带自身的一个虚拟接口和IP地址运行在自己的网络空间;
  • 即写即拷(Copy-on-write):使用即写即拷方式创建根文件系统,这样部署速度极快、内存和硬盘空间极少;
  • 日志:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索;
  • 变更管理:容器文件系统的变更可以提交到新的映像(image)中,并可重复使用以创建更多的容器。无需使用模板或手动配置;
  • 交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。

Docker有哪些基本功能?

Docker让开发和运维变的简单。下面这幅图会让你对Docker基本功能有个很好的认识,Docker会将网络,存储这些事情都配好。下载应用并安装。并配置一些参数,打包上传Image。此外,Container既可以手动创建,也可以自动创建,如果源码库里面包涵DockerFile文件,那么将会自动创建,容器里不仅包涵应用,还包括应用的所有依赖项。

开发人员可以使用Docker Search命令在Docker Registry(无论是公有还是私有的)里搜索Containers,并且还可以使用Docker Pull命令从注册表里推送Container,使用Docker Run命令执行启动、运行、停止等操作。值得注意的是,Run命令的对象可能是你自己的服务器、公共实例或者是两者的组合。

图7 Docker的基本功能

关于Docker的完整功能列表,大家可以访问: http://docs.docker.io/en/latest/commandline/

Docker的三种运行方式:作为守护进程,在Linux主机上管理LXC容器;作为一个CLI,与守护进程的REST API进行对话(docker run ...);作为仓库的客户端,分享你所构建的内容(docker pull, docker commit)。

Containers是如何工作的?与VMs有何不同?

一个Container通常包含应用及应用依赖项,Container用来隔离进程,这些进程主要运行在主机操作系统上的隔离区和用户空间。

这个是明显不同于传统的VMs。传统的硬件虚拟化(例如VMWare、KVM、Xen、EC2)旨在创造一个完整虚拟机。每个虚拟化应用不仅包含应用的二进制文件,还需运行该应用程序所需的库、一个完整的Guest操作系统。

图8  Containers vs. 传统VMs

由于所有的容器共享同一个操作系统(以及二进制文件和库),所以,他们明显要比VM小的多,这样,就完全可以在一个物理主机上托管100个VMs(一般VM数量会受到严格限制)。此外,因为它们使用主机操作系统,重启一个VM并不意味着要重启操作系统,因此,容器更加轻便、高效。

Docker中的容器效率会更高。因为一个传统的VM、应用、每个应用副本以及每个应用微小的变更都需要重新创建一个完整的VM。

如上图所示,一个新的应用在主机上仅仅包含应用及其二进制文件/库,这样就无需创建一个新的客户机操作系统。

如果你想在主机上运行该应用的几个副本,你甚至无需复制共享的二进制文件。

最后,即使你对应用进行了变更,你也无需拷贝变更内容。

图9 Mechanism让Docker容器更轻量

这不仅让存储和容器运行变得更高效,还让应用程序更新变得极其简便。正如下图所示,更新一个容器只需应用差异的地方。

图10 修改和更新Container

下面分享一些比较酷的Docker用例

实例 实例描述 链接
构建自己的PaaS Dokku——Docker实现的mini-Heroku。你所见过最小的PaaS实现 http://bit.ly/191Tgsx
基于指令环境的Web JiffyLab——基于指令环境的Web,使用更轻量、Python和UNIX shell http://bit.ly/12oaj2K
应用部署简便
使用Docker部署Java应用

在Docker上运行Drupal

在Docker上安装Redis

http://bit.ly/11BCvvu
http://bit.ly/15MJS6B
http://bit.ly/16EWOKh
创建安全沙盒 Docker让安全沙盒的创建更简单 http://bit.ly/13mZGJH
创建自己的SaaS 把Memcached作为服务 http://bit.ly/11nL8vh
应用程序自动化部署 使用Docker的Push-button部署 http://bit.ly/1bTKZTo
持续集成部署 dotCloud的Docker和Strider的下一代持续集成&部署 http://bit.ly/ZwTfoy
轻量级桌面虚拟化 Docker桌面:通过SSH运行一个内部Docker容器 http://bit.ly/14RYL6x

相关资料:

推荐阅读:

俄罗斯搜索霸主Yandex推出基于Docker的开源PaaS服务Cocaine

超越Google,他企图将整个互联网塞进1台电脑

PaaS乱局:Container的新机遇

时间: 2024-10-30 02:23:34

Docker:集装箱式“运输”在软件上的实现的相关文章

利用SSH软件上传、下载(使用sz与rz命令)

1.简述 通常,利用SSH管理远程Linux服务器时,经常需要与本地交互文件.当然,我们可以利用FTP方式,比如通过Filezilla客户端软件.不过直接使用SSH软件(SecureCRT.Xshell)自带的上传和下载功能无疑使最方便快捷的.通常SSH软件支持的文件传输协议主要有ASCII.Xmodem.Zmodem等. rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 首先,你的Linux端(CentOS, Ubuntu)需要安装rz.sz. 其次,

如何在VMware软件上安装Red hat(红帽)Linux6.9操作系统

本文介绍如何在VMware软件上安装Redhat(红帽)Linux6.9操作系统 首先需要准备 VMware软件和Redhat-Linux6.9操作系统的ISO系统镜像文件包(这里以linux6.9为例) 第一步: 打开VMware软件,在主页中点击创建新的虚拟机,也可以点击左上角文件,在列表中点击新建虚拟机,如图标记处: 第二步: 点击新建虚拟机后,会弹出个向导窗口,新手建议选择典型配置(较为简单),有一定经验的可以选择自定义(高级)配置.(这里以自定义模式为例)选择好后点击下一步 第三步:

如何在VirtualBox虚拟机软件上安装Win7虚拟系统

在Windows系统中安装VirtualBox 双击从官网上下载的VirtualBox-4.3.12-93733-Win.exe安装程序,默认下一步,下一步完成基础安装. 在VirtualBox虚拟机软件上安装win7虚拟机的系统 打开VirtualBox程序,选择“控制”——“新建”选择新建虚拟机的模板类型,这里以“Windows7 (64bit)”为例: 设置虚拟机内存大小,这里设置为1G(1024MB)为例: 创建虚拟机硬盘: 创建虚拟硬盘: 设置为动态分配(其模式下虚拟机硬盘按实际占有来

****使用ftp软件上传下载php文件时换行符丢失bug

在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件无法正常运行. 这个时候,再次通过ftp软件把刚才上传的php文件下载到本地windows,用notepad++编辑器打开后,发现php源代码变成了一行,换行丢失. 发生这种情况的原因是什么呢?飘易就以一句话概括下:    由于linux下换行是\n,而windows下换行是\r\n,当ftp软件在

在条码打印软件上如何制作固定资产标签

固定资产是指为企业生产产品.提供劳务,出租或者经营管理而持有的.使用时间超过12个月,价值达到一定标准的非货币性资产,包括房屋.建筑物.机器等与其他生产经营活动有关的设备.器具.工具等.固定资产是企业的劳动手段,也是企业赖以生存的主要资产.那么固定资产标签在条码标签打印软件上是如何制作的呢,今天就来给大家讲解一下1.打开条码标签打印软件,新建纸张,设置纸张和标签的尺寸2.点击左侧的圆角矩形框,在画布上绘制矩形框,然后点击左侧的线段,在矩形框里面绘制线条,制作表格3.表格绘制好之后,点击上方的数据

在条码标签打印软件上绘制条形码并自动生成序列号

在做条码标签的时候,输入序列号很简单,如果只有五六个,手工输入就可以的,可是如果有100个,1000个,甚至10000个序列号的时候,我们该怎么办呢?今天就来分享下在条码标签打印软件上制作条形码序列号的方法,具体操作步骤如下:1.打开条码标签打印软件,新建纸张,在文档设置里面设置需要的纸张,这里咱们以A4纸为列,设置下标签的行数和列数以及标签尺寸,这个都是根据自己的要求设计的2.在我们新建的纸张上,点击左侧绘制一维条码按钮,在画布上绘制一个条形码,右击属性,出来一个图形属性对话框,在数据源里,点

在条码打印软件上如何添加背景图并批量打印可变数据

在条码标签打印软件上我们制作产品标签或者防伪标签的时候,一般导入图片都是通过位图或者矢量图来实现的,那么除了这两种,还有没有其他方法呢?今天就来给大家介绍另外一种方法,那就是通过添加背景图片的方式来导入图片,这种方法使用起来也是比较方便的,操作也比较简单,具体操作方法如下所示:1. 首先打开条码标签打印软件,新建纸张,设置纸张和标签的尺寸2. 点击上方的文档设置,弹出文档设置对话框,在文档设置画布对话框中我们勾选背景图片及打印背景,并根据提示点浏览,选择我们需要的图片打开,然后点确定,就可以看到

在条码标签打印软件上如何制作电器保修卡

在购买电器.电子设备的时候,附带的都有保修卡,服务人员也会让我们填写保修卡.可能当时我们被产品的外观.性能所吸引,就忽视了保修卡的功能.众所周知,保修卡是产品质量的保证,也是产品的"×××",更是商品售后保障的重要凭证,因为保修卡上一般会标明用户姓名.产品名称.用户电话.产品型号.购买商品.购买日期.购买地址等信息.每个电器有一个编号,电器和保修卡是一一对应的.一旦在使用中出了不良的问题,通过以上信息,我们可以拿到对应的地方进行维修.那么保修卡是如何制作的呢?今天就一起来了解一下有关在

docker~aspnetcore2.0镜像安装软件的加速器

一般对于安装软件加速时,我们大多数会选择阿里云,而对于aspnetcore2.0这个进项来说,由于使用的是Debian操作系统,所有我们要找到它对应的mirror列表,下面是我整理的一个sources.list加速列表,我们把它放在和Dockerfile相同的位置,在Dockerfile生成镜像时把它复制到里面去,替换之前的apt-update地址源即可. source.list内容 deb http://mirrors.aliyun.com/debian wheezy main contrib