标签 容器 下的文章

我告诉你一个秘密:DevOps 云计算之类的东西可以把我的程序运行在世界上任何一个地方,这对我来说仍然有一点神秘。但随着时间流逝,我意识到理解大规模的机器增减和应用程序部署的来龙去脉对一个开发者来说是非常重要的知识。这类似于成为一个专业的音乐家,当然你肯定需要知道如何使用你的乐器,但是,如果你不知道一个录音棚是如何工作的,或者如何适应一个交响乐团,那么你在这样的环境中工作会变得非常困难。

在软件开发的世界里,使你的代码进入我们的更大的世界如同把它编写出来一样重要。DevOps 重要,而且是很重要。

因此,为了弥合 开发 Dev 部署 Ops 之间的空隙,我会从头开始介绍容器技术。为什么是容器?因为有强力的证据表明,容器是机器抽象的下一步:使计算机成为场所而不再是一个东西。理解容器是我们共同的旅程。

在这篇文章中,我会介绍 容器化 containerization 背后的概念。包括容器和虚拟机的区别,以及容器构建背后的逻辑以及它是如何适应应用程序架构的。我会探讨轻量级的 Linux 操作系统是如何适应容器生态系统。我还会讨论使用镜像创建可重用的容器。最后我会介绍容器集群如何使你的应用程序可以快速扩展。

在后面的文章中,我会一步一步向你介绍容器化一个示例应用程序的过程,以及如何为你的应用程序容器创建一个托管集群。同时,我会向你展示如何使用 Deis 将你的示例应用程序部署到你本地系统以及多种云供应商的虚拟机上。

让我们开始吧。

虚拟机的好处

为了理解容器如何适应事物发展,你首先要了解容器的前任:虚拟机。

虚拟机 virtual machine(VM) 是运行在物理宿主机上的软件抽象。配置一个虚拟机就像是购买一台计算机:你需要定义你想要的 CPU 数目、RAM 和磁盘存储容量。配置好了机器后,你为它加载操作系统,以及你想让虚拟机支持的任何服务器或者应用程序。

虚拟机允许你在一台硬件主机上运行多个模拟计算机。这是一个简单的示意图:

虚拟机可以让你能充分利用你的硬件资源。你可以购买一台巨大的、轰隆作响的机器,然后在上面运行多个虚拟机。你可以有一个数据库虚拟机以及很多运行相同版本的定制应用程序的虚拟机所构成的集群。你可以在有限的硬件资源获得很多的扩展能力。如果你觉得你需要更多的虚拟机而且你的宿主硬件还有容量,你可以添加任何你需要的虚拟机。或者,如果你不再需要一个虚拟机,你可以关闭该虚拟机并删除虚拟机镜像。

虚拟机的局限

但是,虚拟机确实有局限。

如上面所示,假如你在一个主机上创建了三个虚拟机。主机有 12 个 CPU,48 GB 内存和 3TB 的存储空间。每个虚拟机配置为有 4 个 CPU,16 GB 内存和 1TB 存储空间。到现在为止,一切都还好。主机有这个容量。

但这里有个缺陷。所有分配给一个虚拟机的资源,无论是什么,都是专有的。每台机器都分配了 16 GB 的内存。但是,如果第一个虚拟机永不会使用超过 1GB 分配的内存,剩余的 15 GB 就会被浪费在那里。如果第三个虚拟机只使用分配的 1TB 存储空间中的 100GB,其余的 900GB 就成为浪费空间。

这里没有资源的流动。每台虚拟机拥有分配给它的所有资源。因此,在某种方式上我们又回到了虚拟机之前,把大部分金钱花费在未使用的资源上。

虚拟机还有另一个缺陷。让它们跑起来需要很长时间。如果你处于基础设施需要快速增长的情形,即使增加虚拟机是自动的,你仍然会发现你的很多时间都浪费在等待机器上线。

来到:容器

概念上来说,容器是一个 Linux 进程,Linux 认为它只是一个运行中的进程。该进程只知道它被告知的东西。另外,在容器化方面,该容器进程也分配了它自己的 IP 地址。这点很重要,重要的事情讲三遍,这是第二遍。在容器化方面,容器进程有它自己的 IP 地址。一旦给予了一个 IP 地址,该进程就是宿主网络中可识别的资源。然后,你可以在容器管理器上运行命令,使容器 IP 映射到主机中能访问公网的 IP 地址。建立了该映射,无论出于什么意图和目的,容器就是网络上一个可访问的独立机器,从概念上类似于虚拟机。

这是第三遍,容器是拥有不同 IP 地址从而使其成为网络上可识别的独立 Linux 进程。下面是一个示意图:

容器/进程以动态、合作的方式共享主机上的资源。如果容器只需要 1GB 内存,它就只会使用 1GB。如果它需要 4GB,就会使用 4GB。CPU 和存储空间利用也是如此。CPU、内存和存储空间的分配是动态的,和典型虚拟机的静态方式不同。所有这些资源的共享都由容器管理器来管理。

最后,容器能非常快速地启动。

因此,容器的好处是:你获得了虚拟机独立和封装的好处,而抛弃了静态资源专有的缺陷。另外,由于容器能快速加载到内存,在扩展到多个容器时你能获得更好的性能。

容器托管、配置和管理

托管容器的计算机运行着被剥离的只剩下主要部分的某个 Linux 版本。现在,宿主计算机流行的底层操作系统是之前提到的 CoreOS。当然还有其它,例如 Red Hat Atomic HostUbuntu Snappy

该 Linux 操作系统被所有容器所共享,减少了容器足迹的重复和冗余。每个容器只包括该容器特有的部分。下面是一个示意图:

你可以用它所需的组件来配置容器。一个容器组件被称为 layer 。层是一个容器镜像,(你会在后面的部分看到更多关于容器镜像的介绍)。你从一个基本层开始,这通常是你想在容器中使用的操作系统。(容器管理器只提供你所要的操作系统在宿主操作系统中不存在的部分。)当你构建你的容器配置时,你需要添加层,例如你想要添加网络服务器时这个层就是 Apache,如果容器要运行脚本,则需要添加 PHP 或 Python 运行时环境。

分层非常灵活。如果应用程序或者服务容器需要 PHP 5.2 版本,你相应地配置该容器即可。如果你有另一个应用程序或者服务需要 PHP 5.6 版本,没问题,你可以使用 PHP 5.6 配置该容器。不像虚拟机,更改一个版本的运行时依赖时你需要经过大量的配置和安装过程;对于容器你只需要在容器配置文件中重新定义层。

所有上面描述的容器的各种功能都由一个称为 容器管理器 container manager 的软件控制。现在,最流行的容器管理器是 DockerRocket。上面的示意图展示了容器管理器是 Docker,宿主操作系统是 CentOS 的主机情景。

容器由镜像构成

当你需要将我们的应用程序构建到容器时,你就要编译镜像。镜像代表了你的容器需要完成其工作的容器模板。(容器里可以在容器里面,如下图)。镜像存储在 注册库 registry 中,注册库通过网络访问。

从概念上讲,注册库类似于一个使用 Java 的人眼中的 Maven 仓库、使用 .NET 的人眼中的 NuGet 服务器。你会创建一个列出了你应用程序所需镜像的容器配置文件。然后你使用容器管理器创建一个包括了你的应用程序代码以及从容器注册库中下载的部分资源。例如,如果你的应用程序包括了一些 PHP 文件,你的容器配置文件会声明你会从注册库中获取 PHP 运行时环境。另外,你还要使用容器配置文件声明需要复制到容器文件系统中的 .php 文件。容器管理器会封装你应用程序的所有东西为一个独立容器,该容器将会在容器管理器的管理下运行在宿主计算机上。

这是一个容器创建背后概念的示意图:

让我们仔细看看这个示意图。

(1)代表一个定义了你容器所需东西以及你容器如何构建的容器配置文件。当你在主机上运行容器时,容器管理器会读取该配置文件,从云上的注册库中获取你需要的容器镜像,(2)将镜像作为层添加到你的容器中。

另外,如果组成镜像需要其它镜像,容器管理器也会获取这些镜像并把它们作为层添加进来。(3)容器管理器会将需要的文件复制到容器中。

如果你使用了 配置 provisioning 服务,例如 Deis,你刚刚创建的应用程序容器做成镜像,(4)配置服务会将它部署到你选择的云供应商上,比如类似 AWS 和 Rackspace 云供应商。

集群中的容器

好了。这里有一个很好的例子说明了容器比虚拟机提供了更好的配置灵活性和资源利用率。但是,这并不是全部。

容器真正的灵活是在集群中。记住,每个容器有一个独立的 IP 地址。因此,能把它放到负载均衡器后面。将容器放到负载均衡器后面,这就上升了一个层面。

你可以在一个负载均衡容器后运行容器集群以获得更高的性能和高可用计算。这是一个例子:

假如你开发了一个资源密集型的应用程序,例如图片处理。使用类似 Deis 的容器配置技术,你可以创建一个包括了你图片处理程序以及你图片处理程序需要的所有资源的容器镜像。然后,你可以部署一个或多个容器镜像到主机上的负载均衡器下。一旦创建了容器镜像,你可以随时使用它。当系统繁忙时可以添加更多的容器实例来满足手中的工作。

这里还有更多好消息。每次添加实例到环境中时,你不需要手动配置负载均衡器以便接受你的容器镜像。你可以使用服务发现技术让容器告知均衡器它可用。然后,一旦获知,均衡器就会将流量分发到新的结点。

全部放在一起

容器技术完善了虚拟机缺失的部分。类似 CoreOS、RHEL Atomic、和 Ubuntu 的 Snappy 宿主操作系统,和类似 Docker 和 Rocket 的容器管理技术结合起来,使得容器变得日益流行。

尽管容器变得更加越来越普遍,掌握它们还是需要一段时间。但是,一旦你懂得了它们的窍门,你可以使用类似 Deis 这样的配置技术使容器创建和部署变得更加简单。

从概念上理解容器和进一步实际使用它们完成工作一样重要。但我认为不实际动手把想法付诸实践,概念也难以理解。因此,我们该系列的下一阶段就是:创建一些容器。


via: https://deis.com/blog/2015/developer-journey-linux-containers

作者:Bob Reselman 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Docker Container Talk

这是 Docker 开发者在 Containercon 上的演讲,谈论将来的容器在安全和实时迁移方面的创新

来自西雅图的消息。当前 IT 界最热的词汇是“容器”,美国有两大研讨会:Linuxcon USA 和 Containercon,后者就是为容器而生的。

Docker 公司是开源 Docker 项目的商业赞助商,本次研讨会这家公司有 3 位高管带来主题演讲,但公司创始人 Solomon Hykes 没上场演讲。

Hykes 曾在 2014 年的 Linuxcon 上进行过一次主题演讲,但今年的 Containeron 他只坐在观众席上。而工程部高级副总裁 Marianna Tessel、Docker 首席安全官 Diogo Monica 和核心维护员 Michael Crosby 为我们演讲 Docker 新增的功能和将来会有的功能。

Tessel 强调 Docker 现在已经被很多世界上大型组织用在生产环境中,包括美国政府。Docker 也被用在小环境中,比如树莓派,一块树莓派上可以跑 2300 个容器。

“Docker 的功能正在变得越来越强大,而部署方法变得越来越简单。”Tessel 在会上说道。

Tessel 把 Docker 形容成一艘游轮,内部由强大而复杂的机器驱动,外部为乘客提供平稳航行的体验。

Docker 试图解决的领域是简化安全配置。Tessel 认为对于大多数用户和组织来说,避免网络漏洞所涉及的安全问题是一个乏味而且复杂的过程。

于是 Docker Content Trust 就出现在 Docker 1.8 release 版本中了。安全项目领导 Diogo Mónica 中加入了 Tessel 的台上讨论,说安全是一个难题,而 Docker Content Trust 就是为解决这个难道而存在的。

Docker Content Trust 提供一种方法来验证一个 Docker 应用是否可信,以及多种方法来限制欺骗和病毒注入。

为了证明他的观点,Monica 做了个现场示范,演示 Content Trust 的效果。在一个实验中,一个网站在更新过程中其 Web App 被人为攻破,而当 Content Trust 启动后,这个黑客行为再也无法得逞。

“不要被这个表面上简单的演示欺骗了,”Tessel 说道,“你们看的是最安全的可行方案。”

Docker 以前没有实现的领域是实时迁移,这个技术在 VMware 虚拟机中叫做 vMotion,而现在,Docker 也实现了这个功能。

Docker 首席维护员 Micheal Crosby 在台上做了个实时迁移的演示,Crosby 把这个过程称为快照和恢复:首先从运行中的容器拿到一个快照,之后将这个快照移到另一个地方恢复。

一个容器也可以克隆到另一个地方,Crosby 将他的克隆容器称为“多利”,就是世界上第一只被克隆出来的羊的名字。

Tessel 也花了点时间聊了下 RunC 组件,这是个正在被 Open Container Initiative 作为多方开发的项目,目的是让它可以从 Linux 扩展到包括 Windows 和 Solaris 在内的多种操作系统。

Tessel 总结说她不知道 Docker 的未来是什么样,但对此抱非常乐观的态度。

“我不确定未来是什么样的,但我很确定 Docker 会在这个世界中脱颖而出”,Tessel 说的。

Sean Michael Kerner 是 eWEEK 和 InternetNews.com 网站的高级编辑,可通过推特 @TechJournalist 关注他。


via: http://www.eweek.com/virtualization/docker-working-on-security-components-live-container-migration.html

作者:Sean Michael Kerner 译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

西雅图报道。容器迟早要改变世界,以及改变操作系统的角色。这是 Wim Coekaerts 带来的 LinuxCon 演讲主题,Coekaerts 是 Oracle 公司 Linux 与虚拟化工程的高级副总裁。

Coekaerts 在开始演讲的时候拿出一张关于“桌面之年”的幻灯片,引发了现场观众的一片笑声。之后他说 2015 年很明显是容器之年,更是应用之年,应用才是容器的关键。

“你需要操作系统做什么事情?”,Coekaerts 回答现场观众:“只需一件事:运行一个应用。操作系统负责管理硬件和资源,来让你的应用运行起来。”

Coakaerts 补充说,在 Docker 容器的帮助下,我们的注意力再次集中在应用上,而在 Oracle,我们将注意力放在如何让应用更好地运行在操作系统上。

“许多人过去常常需要繁琐地安装应用,而现在的年轻人只需要按一个按钮就能让应用在他们的移动设备上运行起来”。

人们对安装企业版的软件需要这么复杂的步骤而感到惊讶,而 Docker 帮助他们脱离了这片苦海。

“操作系统的角色已经变了。” Coekaerts 说。

Docker 的出现不代表虚拟机的淘汰,容器化过程需要经过很长时间才能变得成熟,然后才能在世界范围内得到应用。

在这段时间内,容器会与虚拟机共存,并且我们需要一些工具,将应用在容器和虚拟机之间进行转换迁移。Coekaerts 举例说 Oracle 的 VirtualBox 就可以用来帮助用户运行 Docker,而它原来是被广泛用在桌面系统上的一项开源技术。现在 Docker 的 Kitematic 项目将在 Mac 上使用 VirtualBox 运行 Docker。

容器的开放计算计划和一次写随处部署

一个能让容器成功的关键是“一次写,随处部署”的概念。而在容器之间的互操作领域,Linux 基金会的开放计算计划(OCI)扮演一个非常关键的角色。

“使用 OCI,应用编译一次后就可以很方便地在多地运行,所以你可以将你的应用部署在任何地方”。

Coekaerts 总结说虽然在迁移到容器模型过程中会发生很多好玩的事情,但容器还没真正做好准备,他强调 Oracle 现在正在验证将产品运行在容器内的可行性,但这是一个非常艰难的过程。

“运行数据库很简单,难的是要搞定数据库所需的环境”,Coekaerts 说:“容器与虚拟机不一样,一些需要依赖底层系统配置的应用无法从主机迁移到容器中。”

另外,Coekaerts 指出在容器内调试问题与在虚拟机内调试问题也是不一样的,现在还没有成熟的工具来进行容器应用的调试。

Coekaerts 强调当容器足够成熟时,有一点很重要:不要抛弃现有的技术。组织和企业不能抛弃现有的部署好的应用,而完全投入新技术的怀抱。

“部署新技术是很困难的事情,你需要缓慢地迁移过去,能让你顺利迁移的技术才是成功的技术。”Coekaerts 说。


via: http://www.serverwatch.com/server-news/linuxcon-the-changing-role-of-the-server-os.html

作者:Sean Michael Kerner 译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

ubuntu打开的正确方式(笑)

在这个快节奏的时代。能够使用最快速度最低代价完成任务具有非常重要的意义,对于现代开发者来说,Linux是生活中必不可少且不可替代的工具,如果我们在开发少或学习中少一些遇到环境的坑,会节省很多时间,潜伏在各种Linux群中数年,发现大家都有手贱(操作失误,笑),因此在本文中给出终极解决方案: 直接使用Ubuntu Live CD 来完成系统的启动。

那么最快的Linux安装办法又是什么呢?其实经过严谨的思考之后我个人觉得是不安装。我们可以准备从grub启动ubuntu操作系统把系统放到内存中,再预制出各种情况的环境包,也就是环境模块化,因为系统是在整个内存中所以速度非常非常快,需要模块化的内容并不多,比如说ssh vim tmux 为一组工具,开机后一个命令就可以激活工具包,不到几秒钟的时间即可完成,其他的如Chrome浏览器一类的都可以快速完成在内存上的安装。通过这种方式让环境更加灵活更加快速准备好开发环境。

这是一个思路上的变化,从我需要什么就安装什么一起都准备好给你用->变成了只启动基础的系统然后我需要什么我就后加载什么。

最后的准备在于容器,Docker 以及RKT与RunC的准备,在团队内可以秒级推送运行的环境。

本文依然有它的缺点: 主要体现在两个方面

  1. 如果默认驱动不好使会造成很多麻烦。
  2. 对于内存小的开发机器还是做快照比较好。最少4G内存,我们推荐内存在8G以上最好是16G或者32G内存的机器上采用此方案。

因为本方案整个操作系统都是加载到内存中的,硬盘速度即为内存的速度,我这里实测可以达到4.5Gb/s,所以你准备好屌丝逆袭(买不起SSD)秒杀高富帅了吗?

ubuntu

对于它的简单介绍可以参考这里。当然对于我本人而言选择Ubuntu主要原因仅仅是对他比较熟悉。并不限制使用什么发行版本。如果您要是选本方案搭建环境,并且选择其他发行版本请选择LiveCD尽量小一点的,如果能自己裁剪LiveCD就更好了,另外尽量选择64位架构。当然自己越熟悉越好。

虽然Ubuntu有一点不自由,但是我个人觉得包的质量管理还是非常好的,的确适合开发者使用。

Docker

官方:https://www.docker.com/

它对于我来说,几乎就像是水,如果没有他就没有今天的丰富多彩的运行方式,它可以让程序连同环境一起打包运行,使得部署备份等等非常方便,对于本次环境构建而言我们可以在个人的registry上备份自己的环境,只需要一小段时间就可以克隆回来。再加上现在各种永久免费的国内加速服务这种环境部署就是程序员天堂。更多细节请关注这里

在本文中我们使用单文件版本的Docker文件,方便可控。无任何累赘。本人不喜脚本安装。

RunC && RKT

这两种产品是libcontainer的代表。相对于Docker来说,它是一个容器只需要一个进程,对于Docker来说,他需要一个守护进程。在本文中(本博主)不评价任何产品的好坏,只说什么时候适合用什么。当然在我们这里利用了它启动方便,挂载方便的特性让我们的工作更方便更方便更方便!

由于现在RunC还没有发布1.0版本文档几乎没有,因此我这里会给出我的详细研究结果。至于RKT还是大家自己摸索,文档已经很全了。

CoreOS

作为专门运行容器的操作系统,稳定性可不属性都是前所未有,当然我们的容器可以跑在这个上面本文中会提及两个系统的兼容性方案。

  1. Ubuntu适合程序开发的情况。启动速度可能在1分钟左右(有点慢)。但是有图形界面,有定制基础环境的方案。
  2. CoreOS适合跑程序,启动速度在10秒以下适合释放更多内存来跑临时业务,做测试的时候实用此方案。

从Grub开始

什么是Grub

它可以装在硬盘上帮助你启动操作系统,几乎所有操作系统都可以,当然也包含本次的方案内容。安装方式有很多种。而且必须得根据自己的情况来安装。因为每个人电脑上的操作系统情况都不一样,有的已经有系统了。有的不想给自己装引导。可能先放到u盘上引导都有可能。因此这里不做安装方法上的更多描述可以自己根据情况到搜索引擎上搜索。

Grub 的安装

我之前是安装了windows,所以我直接安装了EasyBCD然后安装NeoGRUB来实现的。具体操作步骤如下:

  1. 下载安装EasyBCD
  2. 如图所示
  3. 安装重启电脑之后选择Grub启动项可以进入一个类似输入命令的界面即可确定完成安装。

Ubuntu 启动配置

启动准备

如果想要准备启动Ubuntu那么有三个关键要素,

  1. ubuntu-14.04.2-desktop-amd64.iso
  2. image中casper/vmlinuz.efi
  3. image中casper/initrd.lz

这三个文件作为启动的必要文件请放到分区中容易找到的地方。推荐做法:给自己的硬盘上开个EXT4 分区,然后把三个文件丢到里面去。

启动参数调试

工作中我们讲求流程,当然我们也需要一定的路程,我们不可能一次调整就成功把ISO启动起来。因此我们先加一个调试流程。

root (hd0,1)
kernel (hd0,1)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.2-desktop-amd64.iso ro quiet splash locate=en_US.UTF-8
initrd (hd0,1)/casper/initrd.lz
  1. 你需要看清楚把文件放到了第几块硬盘上,第几块分区上。组成参数为(hd0,1)(我的是0号硬盘第二个分区)。如果你实在分不清可以参考这里
  2. root (hd0,1) 设置GRUB的root设备
  3. kernel 命令套格式,变化参数 vmlinuz.efi 和 ubuntu-14.04.2-desktop-amd64.iso 要与你放到硬盘上的位置对应,可以使用Tab自动补全非常实用。
  4. initrd 依然是套格式找到对应硬盘傻姑娘的initrd.lz的位置。
  5. 如果出现错误了按会出现刚才的命令,多加修改直到成功启动。

启动参数放到硬盘中

如果是NeoGrub配置文件路径C:\NST\menu.lst,其他的请参考说明文档,一般都会有的。

配置文件写法:

timeout 3
default 0

title Ubuntu
root (hd0,1)
kernel (hd0,1)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.2-desktop-amd64.iso ro quiet splash locate=en_US.UTF-8
initrd (hd0,1)/casper/initrd.lz

3秒等待自动选择第一项,名称ubuntu 别的剩下的就是刚才调试内容的命令了。

完成刚需配置

刚醒需求配置是指在容器之外的刚醒需求配置,比如说编辑器,SSH等等工具箱。配置方法: APT

  1. 修改安装源:sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && apt-get update
  2. 安装你需要的软件包:apt-get install -y vim screen tmux ssh-server等等
  3. 调试你的环境看看是否好使,然后复制文件夹/var/cache/apt/archives中所有deb文件即为您刚才所有的安装包。复制到一个可以持久化的文件夹中等待使用。
  4. 回调环境: 每当您重新启动之后这些安装包即消失,想恢复,进入到上一步中复制到的文件夹中执行如下命令dpkg -i *即可安装预先准备好的软件
  5. 灵活使用,此步骤为发挥组合拳威力的一步。当您反复定制凝练您的安装包之后,会根据个人情况选择不同的目录来初始化您的环境,其结果是,又小又轻,非常可靠。再也不怕手贱导致环境崩坏,再加上外部的git服务保证工作内容的安全性基本上可以肯定的说:我们的环境与硬件与工作耦合度降低不少.
  6. 对于APT无法安装的内容,比如说JDK 与定制版本的Eclipse您可以通过下载完之后持久化保存到硬盘中,写一个脚本解压后放到硬盘中至于环境直接写入到profile中即可。
  7. 使用此方法之后假如您使用IDE真的会有一个非常非常大的速度提升,我打开Eclipse C/C++ 5秒钟即可。

容器安装配置

一般情况下我们安装Docker都是通过网上下载脚本安装,但是这种情况下我们推荐使用直接下载单文件版本的来完成安装安装脚本如下:

curl -sSL -O https://get.daocloud.io/docker/builds/Linux/x86_64/docker-latest
chmod +x docker-latest
mv docker-latest /usr/bin/docker
docker -d & 

在第三行中复制docker程序到任何Path下的文件夹内备用。在配置上,还是要吧/var/lib/docker放到可持久化的软连接下面。比如说按照下面的操作:

rm -rf /var/lib/docker
ln -s /isodevice/docker /var/lib/docekr 

按照这种方法操作可以让docker image 持久化保存在硬盘中。重启也能找回来。这里注意,如果您之前就实践了CoreOS 171.3 版本上的Docker它使用的是1.6版本他的存储文件格式与1.7的不同因此不通用。我就踩到这个坑了。接下来的操作就与Docker一样了。

注意:这个安装包: cgroup-lite_1.9_all.deb 一定要装,默认的光盘中就差这一个依赖,在下面的安装包中有要不就apt安装保存下来都可以。

材料准备

我在百度云盘中准备了三个文件,第一个是docker 1.7.1 第二个准别了vim screen ssh-server tmux CGroup的安装包。最后一个把我常用的Docker images 打包放出来了。其实在准备这个方案花最多时间就是在于精简依赖,最后发现只需要一个CGroup安装包。

总结

在本段文档中,我们给出了一个全新的使用Linux操作系统的思路不安装。并且做了一定的前期准备工作。启动了Linux操作系统做到本步骤如果您是新手就可以开始Linux的学习旅程了,如果您是需要此方案工作已经可以展开一般性质的工作了。
最后我真的拆掉我的三爽垃圾ssd(越用越慢)直接上内存。

方案合理要素:

  1. root权限过大。有时导致无法挽回的误操作。
  2. 现在的电脑内存不是很贵。大部分Linux电脑内存都在闲置。
  3. Linux操作系统如果每次执行的任务如果比较单一(一台物理机只给一个人用)真的不会很大。
  4. 给重新启动计算机赋予了新的意义。
  5. 真正超过SSD的速度,成本更低。(实测启动Eclipse C/C++ 仅需要5s)

大家好,今天我们来学习如何使用一个docker镜像交互式地创建一个Docker容器。当我们从镜像中启动一个Docker进程,Docker就会获取该镜像及其父镜像,并重复这个过程,直到到达基础镜像。然后联合文件系统(UFS)会在其顶层添加一个读写层。读写层被称之为容器,它包含了一些关于父镜像信息及一些其他的信息,如唯一ID,网络配置和资源限制等。容器是有状态的,其状态可以从 运行态 切换到 退出态。一个处于 运行态的容器包含了在CPU上面运行的进程树,于其它在该主机上运行的进程相隔离,而退出态是指文件系统的状态,并保留了其退出值。你可以使用它来启动,停止和重启一个容器。

Docker技术为IT界带来了巨大的改变,它使得云服务可以用来共享应用和工作流程自动化,使得应用可以用组件快速组合,消除了开发、品质保证、产品环境间的摩擦。在这篇文章中,我们将会建立CentOS环境,然后用Apache网络服务器提供一个网站服务。

这是一个快速且容易的教程,讨论我们怎样使用交互的shell,以交互的方式来创建一个容器。

1. 运行一个Docker实例

Docker首先会尝试从本地取得并运行所需的镜像,如果在本地主机上没有发现,它就会从Docker公共注册中心拉取。这里,我们将会拉取镜像并在 Docker 容器中创建一个fedora实例,并连接到它的 tty 上的bash shell。

# docker run -i -t fedora bash

Downloading Fedora Base Image

2.安装Apache网络服务器

现在,在我们的Fedora基本镜像实例准备好后,我们将会开始交互式地安装Apache网络服务器,而不是为它创建Dockerfile。为了做到这点,我们需要在终端或者shell运行以下命令。

# yum update

Installing httpd

# yum install httpd

Installing httpd

退出容器的 tty。

# exit

3.保存镜像

现在,我们要去保存在Fedora实例里做的修改。要做到这个,我们首先需要知道实例的容器ID。而为了得到ID,我们又需要运行以下命令(LCTT 译注:在容器外执行该命令)。

# docker ps -a

Docker Running Container

然后,我们会保存这些改变为一个新的镜像,请运行以下命令。

# docker commit c16378f943fe fedora-httpd

committing fedora httpd

这里,修改已经通过使用容器ID保存起来了,镜像名字叫fedora-httpd。为了确认新的镜像是否在运行,我们将运行以下命令。

# docker images

view docker images

4. 添加内容到新的镜像

我们自己新的Fedora Apache镜像正成功的运行,现在我们想添加一些我们网站的网页内容到Apache网络服务器,使得网站能够开箱即用。为做到这点,我们需要创建一个新的Dockerfile,它会处理从复制网页内容到启用80端口的所有操作。要达到这样的目的,我们需要使用我们最喜欢的文本编辑器创建Dockerfile文件,像下面演示的一样。

# nano Dockerfile

现在,我们需要添加以下的命令行到文件中。

FROM fedora-httpd
ADD mysite.tar /tmp/
RUN mv /tmp/mysite/* /var/www/html
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/httpd" ]
CMD [ "-D", "FOREGROUND" ]

configuring Dockerfile

这里,上述的Dockerfile中,放在mysite.tar里的网页内容会自动解压到/tmp/文件夹里。然后,整个站点会被移动到Apache的网页根目录/var/www/html/,命令expose 80会打开80端口,这样网站就能正常访问了。其次,入口点放在了/usr/sbin/https里面,保证Apache服务器能够执行。

5. 构建并运行一个容器

现在,我们要用刚刚创建的Dockerfile创建我们的容器,以便将我们的网站添加到上面。为做到这,我们需要运行以下命令。

# docker build -rm -t mysite .

Building mysite Image

建立好我们的新容器后,我们需要要用下面的命令来运行容器。

# docker run -d -P mysite

Running mysite Container

总结

最后,我们已经成功的以交互式的方式建立了一个Docker容器。在本节方法中,我们是直接通过交互的shell命令建立我们的容器和镜像。在建立与配置镜像与容器时,这种方法十分简单且快速。如果你有任何问题,建议和反馈,请在下方的评论框里写下来,以便我们可以提升或者更新我们的文章。谢谢!祝生活快乐 :-)


via: http://linoxide.com/linux-how-to/interactively-create-docker-container/

作者:Arun Pyasi 译者:wi-cuckoo 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

ctop是一个新的基于命令行的工具,它可用于在容器层级监控进程。容器通过利用控制器组(cgroup)的资源管理功能,提供了操作系统层级的虚拟化环境。该工具从cgroup收集与内存、CPU、块输入输出的相关数据,以及拥有者、开机时间等元数据,并以人性化的格式呈现给用户,这样就可以快速对系统健康状况进行评估。基于所获得的数据,它可以尝试推测下层的容器技术。ctop也有助于在低内存环境中检测出谁在消耗大量的内存。

功能

ctop的一些功能如下:

  • 收集CPU、内存和块输入输出的度量值
  • 收集与拥有者、容器技术和任务统计相关的信息
  • 通过任意栏对信息排序
  • 以树状视图显示信息
  • 折叠/展开cgroup树
  • 选择并跟踪cgroup/容器
  • 选择显示数据刷新的时间窗口
  • 暂停刷新数据
  • 检测基于systemd、Docker和LXC的容器
  • 基于Docker和LXC的容器的高级特性

    • 打开/连接shell以进行深度诊断
    • 停止/杀死容器类型

安装

ctop是由Python写成的,因此,除了需要Python 2.6或其更高版本外(带有内建的光标支持),别无其它外部依赖。推荐使用Python的pip进行安装,如果还没有安装pip,请先安装,然后使用pip安装ctop。

注意:本文样例来自Ubuntu(14.10)系统

$ sudo apt-get install python-pip

使用pip安装ctop:

poornima@poornima-Lenovo:~$ sudo pip install ctop

[sudo] password for poornima:

Downloading/unpacking ctop

Downloading ctop-0.4.0.tar.gz

Running setup.py (path:/tmp/pip_build_root/ctop/setup.py) egg_info for package ctop

Installing collected packages: ctop

Running setup.py install for ctop

changing mode of build/scripts-2.7/ctop from 644 to 755

changing mode of /usr/local/bin/ctop to 755

Successfully installed ctop

Cleaning up...

如果不选择使用pip安装,你也可以使用wget直接从github安装:

poornima@poornima-Lenovo:~$ wget https://raw.githubusercontent.com/yadutaf/ctop/master/cgroup_top.py -O ctop

--2015-04-29 19:32:53-- https://raw.githubusercontent.com/yadutaf/ctop/master/cgroup_top.py

Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 199.27.78.133

Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|199.27.78.133|:443... connected.

HTTP request sent, awaiting response... 200 OK Length: 27314 (27K) [text/plain]

Saving to: ctop

100%[======================================>] 27,314 --.-K/s in 0s

2015-04-29 19:32:59 (61.0 MB/s) - ctop saved [27314/27314]

poornima@poornima-Lenovo:~$ chmod +x ctop

如果cgroup-bin包没有安装,你可能会碰到一个错误消息,你可以通过安装需要的包来解决。

poornima@poornima-Lenovo:~$ ./ctop

[ERROR] Failed to locate cgroup mountpoints.

poornima@poornima-Lenovo:~$ sudo apt-get install cgroup-bin

下面是ctop的输出样例:

ctop screen

ctop屏幕

用法选项

ctop [--tree] [--refresh=] [--columns=] [--sort-col=] [--follow=] [--fold=, ...] ctop (-h | --help)

当你进入ctop屏幕,可使用上(↑)和下(↓)箭头键在容器间导航。点击某个容器就选定了该容器,按q或Ctrl+C退出该容器。

现在,让我们来看看上面列出的那一堆选项究竟是怎么用的吧。

-h / --help - 显示帮助信息

poornima@poornima-Lenovo:~$ ctop -h
Usage: ctop [options]

Options:
-h, --help show this help message and exit
--tree show tree view by default
--refresh=REFRESH Refresh display every <seconds>
--follow=FOLLOW Follow cgroup path
--columns=COLUMNS List of optional columns to display. Always includes
'name'
--sort-col=SORT_COL Select column to sort by initially. Can be changed
dynamically.

--tree - 显示容器的树形视图

默认情况下,会显示列表视图

当你进入ctop窗口,你可以使用F5按钮在树状/列表视图间切换。

--fold= - 在树形视图中折叠名为 的 cgroup 路径

该选项需要与 --tree 选项组合使用。

例子: ctop --tree --fold=/user.slice

Output of 'ctop --fold'

'ctop --fold'的输出

在ctop窗口中,使用+/-键来展开或折叠子cgroup。

注意:在写本文时,pip仓库中还没有最新版的ctop,还不支持命令行的‘--fold’选项

--follow= - 跟踪/高亮 cgroup 路径

例子: ctop --follow=/user.slice/user-1000.slice

正如你在下面屏幕中所见到的那样,带有“/user.slice/user-1000.slice”路径的cgroup被高亮显示,这让用户易于跟踪,就算显示位置变了也一样。

Output of 'ctop --follow'

'ctop --follow'的输出

你也可以使用‘f’按钮来让高亮的行跟踪选定的容器。默认情况下,跟踪是关闭的。

--refresh= - 按指定频率刷新显示,默认1秒

这对于按每用户需求来显示改变刷新率时很有用。使用‘p’按钮可以暂停刷新并选择文本。

--columns= - 限定只显示选定的列。'name' 需要是第一个字段,其后跟着其它字段。默认情况下,字段包括:owner, processes,memory, cpu-sys, cpu-user, blkio, cpu-time

例子: ctop --columns=name,owner,type,memory

Output of 'ctop --column'

'ctop --column'的输出

-sort-col= - 按指定的列排序。默认使用 cpu-user 排序

例子: ctop --sort-col=blkio

如果有Docker和LXC支持的额外容器,跟踪选项也是可用的:

press 'a' - 接驳到终端输出

press 'e' - 打开容器中的一个 shell

press 's' - 停止容器 (SIGTERM)

press 'k' - 杀死容器 (SIGKILL)

目前 Jean-Tiare Le Bigot 还在积极开发 ctop 中,希望我们能在该工具中见到像本地 top 命令一样的特性 :-)


via: http://linoxide.com/how-tos/monitor-linux-containers-performance/

作者:B N Poornima 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出