Docker相关资源简单整理
一、信息概要
Docker是由PaaS提供商dotCloud在2013年创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量、可移植、自包涵的容器引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机器、生产环境、虚拟机和云等。
Docker是一种增加了高级API的LinuX Container(LXC)技术,提供了能够独立运行Unix进程的轻量级虚拟化解决方案。它提供了一种在安全、可重复的环境中自动部署软件的方式。
Docker 使用 Go 语言编写,用 cgroup 、namespacing实现资源隔离,支持写时复制特性的AUFS文件系统。
Docker虽然并不成熟,但是已然获得众多认可,同时这也是未使用虚拟化系统的一大发展趋势,一个非常老道的方法,用户将应用程序从底层系统分离,然后获得很高的灵活性。
一个虚机占用的资源比一个Container占用的资源不止多十倍。在一个物理机上开一百个虚机是很困难的,但要实现100多个,甚至几百个Container是很正常的。
浏览器的沙箱从资源隔离的角度,以及Java的J2EE Container从标准抽象化的角度,其实跟Container的概念是一致的。
二、使用场景
1. 简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
4. 隔离应用
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。
5. 整合服务器
正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
6. 调试能力Docker
提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。
7. 多租户环境
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
8. 快速部署
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。
三、主要特性
文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
如果 Linux kernel 是 3.8 以前的内核,或者内核缺少 aufs 模块需要安装额外的扩展模块:
$ sudo apt-get install linux-image-extra-`uname -r`
安装 lxc-docker:
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:dotcloud/lxc-docker
$ sudo apt-get update
$ sudo apt-get install lxc-docker
运行一个简单系统
运行 docker 就会自动下载一个 ubuntu 镜像(第一次运行才需要下载),并在一个 container(容器)里运行一个 ubuntu 系统(类似虚拟机)和 shell:
$ docker run -i -t ubuntu /bin/bash
Hello World
$ docker run -i -t ubuntu echo hello world
四、相关技术
1.LXC
Linux cgroups是一种进程资源隔离的技术,namespace是进程的网络资源隔离的技术,它们合在一块也就有了lxc项目,所以从理论上讲,lxc会比kvm性能高得多。因为lxc的每个虚机就是host操作系统的每一个隔离后的进程,并且这些进程是由host操作系统调度的,性能和host操作系统相差不会太多。唯一的缺点是lxc的隔离性不会很好,例如host机器用什么操作系统,lxc也是什么操作系统,再如在lxc中,host操作系统上的root用户可以操纵每一个lxc的虚机。当然,对于私有云,隔离性相比性能倒是其次的,是可以一用的。
最近Linux内核对LXC相关改进非常多,其中3.8版对Namespace新增了user,未来的3.11会加入更好的 CRIU支持,使得Container看上去可能更像一个虚拟机。
和虚机相比,LXC的隔离做个并不彻底,而包括热迁移的等高级功能也正在完善中。
2
一种“增量文件系统”,用户所做修改以增量的方式保存,决定了其分层存储特性。
是一个叫岡島的日本人开发的联合文件系统,用来把原本分离的两个文件系统联合在一起。它是Debian Linux一个内核驱动,其它的 Linux 发行版往往是没有 aufs 驱动的。
五、应用介绍
1.docker desktop 已安装firfox以及libreoffice,通过novnc可实现web版的远程桌面
2.DockerUI Web版Docker管理工具
3.dokku 100行BASH的微Heroku。包含了一个PaaS的基本功能shipyard Docker管理界面,提供多Host,创建Container,查看Image等功能
4.CoreOS
CoreOS项目是Google ChromeOS代码的一个fork版本,目前已成为一个超级精简的服务器操作系统,进化速度堪比ChromeOS。
CoreOS的思想是成为一个随时可被替换的操作系统,甚至在这个替换的过程中,应用程序的运行不会被打断。
CoreOS利用linux cgroups技术来无缝的升级。CoreOS有两个root分区,在另一个cgroups上升级好,然后再切换过去。被更新的机器不需要从负载集群中移除。同时,为了保证其它应用程序不被打断,CoreOS会通过Linux cgroups限制更新过程中的硬盘和网络I/O。
在CoreOS中,所有应用程序都被装在一个个“集装箱(Container)”中,这些集装箱就像一个个软件代码的小气泡,通过最简单的接口运行在操作系统之上。这意味着你可以很轻松得将应用程序在操作系统和计算机之间转移,就像是在轮船和火车上搬运箱子一样,同时也意味着可以在不中断应用程序的情况下更新操作系统。
etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。CoreOS RAM Usage 161 MB
CoreOS宣称最小化的定制版linux系统,具有:
Linux内核,Linux运行所需
存在两个ROOT分区,一个被用作启动分区,一个被用作更新分区
更新分区在更新完成后,自动重新启动系统,当前机器不需要从负载集群中移除,为了保证其它应用程序不被打断,会通过Linux cgroup限制更新过程中的磁盘、网络等IO使用。
systemd,作为默认系统和服务管理器,其优秀特性:
①.支持并行化任务;
②.同时采用 socket 式与 D-Bus 总线式激活服务;
③.按需启动守护进程(daemon);
④.利用 Linux 的 cgroups 监视进程;
⑤.支持快照和系统恢复;
⑥.维护挂载点和自动挂载点;
⑦.各服务间基于依赖关系进行精密控制。
⑧.root分区被设计成只读,用以保证数据的一致性和更新可用
CPU、IO等资源隔离,自然要祭出容器(Container)来,CoreOS很明智使用Docker作为容器管理器用以构建、发布应用,从这个层面来看,一个应用其实就是一个容器。
etcd组件负责服务发现和配置共享,采用Raft分布式一致性协议算法,承担起,组件之间服务通信使用。很自然的,容器(Container)之间应用、服务的伸缩,就显得很简单了。其基因层面支持集群特性,当然,你也可以解读为云环境的支持。
5.Google Coder 是Google 团队的一个为 Raspberry Pi 而设的实验程式,目的是将 Raspberry Pi 变成一个简单的个人小型网络伺服器,提供一个网上环境给程式员在 Chrome 中编写一些有关 HTML、CSS 和 Javascript 的东西,其可以搭载一些基本的 web app。不过它有一个更伟大的理念,就是让初学者有一个基础环境去一边学习一边编写程式 demo 密码:Kortide2014
6.相关链接:
Docker:集装箱式“运输”在软件上的实现
超越Google,他企图将整个互联网塞进1台电脑
Docker能够运行任何应用的“PaaS”云
使用 Docker/LXC 迅速启动一个桌面系统
Docker:具备一致性的自动化软件部署
PaaS乱局:Container的新机遇
Linux黑客车库创业:服务器操作系统CoreOS颠覆互联网
服务器操作系统CoreOS初体验
android development environment for ubuntu precise (12.04 lts)
LXC on Android - YouTube
Start using Docker
Docker on Raspberry Pi
resin/rpi-google-coder coder
搭建自己的 Docker 私有仓库服务
dockerbook
where-can-you-use-golang