Docker —— 用于统一开发和部署的轻量级 Linux 容器
2016-04-29 15:40
761 查看
使用Docker容器——轻量灵活的VM同类,来接管“依赖地狱”。学习Docker是如何基于LXC技术,通过把应用包装在容器里来使应用具有移植性和独立性。 想象一下可以轻松地把应用和它的依赖打包,然后在其他的开发、测试和生产环境上平滑的运行。这就是开源Docker项目的目标。尽管它现在还没正式到生产阶段,最新的发布(本篇文章编写时是0.7.x)使得Docker实现这一伟大目标又近了一步。 | Ley 翻译于 2年前 2人顶 顶 翻译的不错哦! |
Docker容器试图解决“依赖地狱”问题。现代的应用通常从已存在的组件组合而来,并且依赖其他服务和应用。比如,你的Python应用可能使用Postgre所为一个数据存储,用Redis缓存以及使用Apache作web服务器。每个这些组件都附带自身的一些依赖,这些依赖可能与其他组件产生冲突。通过打包每个组件及其依赖,Docker容器解决以下问题: 冲突依赖:需要在PHP4.3上运行一个web站点而另一个运行在PHP5.5上?如果你在一个独立的Docker容器中运行每个版本的PHP,那就没问题。 缺少依赖:在一个新环境上安装应用对Docker容器来说只是瞬间的事情,因为所有的依赖都和这个应用一起打包到一个容器中。 平台依赖:从一个发行版移动到另一个不再是一个麻烦。如果两个系统都运行了Docker容器,那么相同的容器执行起来将没有任何问题。 | jimmyjmh 翻译于 2年前 2人顶 顶 翻译的不错哦! |
2013年初,Docker在dotCloud—一个平台即服务的、以云计算为中心的公司,以一个开源项目的形式诞生。Docker是该公司已经开发的用来在数千台服务器上运行云业务的一个自然扩展技术。它是用Go语言编写的,Go语言是由谷歌开发的一种基于C语言且语法松散的静态类型编程语言。快速发展了6到9个月,这家公司聘请了一个新的CEO,加入了Linux基金会,将公司名改为Docker,并且宣布将工作重心转移到Docker容器及其生态系统的开发。作为Docker容器的受欢迎程度进一步说明,在写这篇文章的时候,它已经在GitHub上被 | jimmyjmh 翻译于 2年前 4人顶 顶 翻译的不错哦! |
Docker运用了一些强大的内核级技术并让我们触手可及。容器虚拟化的概念早在几年前已经出现,但通过提供一个简单的工具集和统一的API接口管理一些内核级技术,如LXCs(Linux容器)、cgroups和一个写复制文件系统,Docker已经创建了一个比其各部件更好的工具。它就是一个潜在的用于开发运营商、系统管理员和开发者的规则转换器。 | jimmyjmh 翻译于 2年前 1人顶 顶 翻译的不错哦! |
Linux容器和LXC,一个用于Linux容器的用户空间控制程序包,是组成Docker的核心,LXC使用内核级命名空间将主机和容器相互隔离。用户命名空间将主机和容器的用户数据库分离,这样保证了容器的root用户没有主机的root权限。程序命名空间仅负责显示和管理程序在容器中,而非在主机运行。而且网络命名空间提供自己的网络设备和虚拟IP地址给容器。 LXC提供的另一个组件是控制组(cgroups)。命名空间负责主机与容器之间的隔离,而控制组实现资源核算和限制。当允许Docker限制被一个容器消耗的资源:如内存、磁盘空间和输入输出时,控制组也会输出大量与之相关的指标。这些指标使Docker能够监控容器内各个进程的资源消耗并确保每个进程只获取可用的公平共享资源。 | jimmyjmh 翻译于 2年前 1人顶 顶 翻译的不错哦! |
除了以上组件,Docker一直在用AuFS(高级多层次统一文件系统)作为容器的文件系统。AuFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。AuFS可以把多层合并成文件系统的单层表示。这个过程称为写复制。 真正酷毙的是,AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。 | jimmyjmh 翻译于 2年前 2人顶 顶 翻译的不错哦! |
使用AuFS的另一个好处是Docker的版本容器镜像能力。每个新版本都是一个与之前版本的简单差异改动,有效地保持镜像文件最小化。但,这也意味着你总是要有一个记录该容器从一个版本到另一个版本改动的审计跟踪。 传统上,Docker依赖AuFS提供了写复制存储机制。然而,最近添加的一个存储启动API可能降低这种依赖。最初,可用的存储驱动有三种:AuFS、VFS和设备映射器-与红帽合作的产物。 自版本0.7起,Docker就与所有Linux发行版协作。然而,它并没有兼顾大部分非Linux系统,如Windows和OS X。在那些操作系统上使用Docker的推荐方式是,用Vagrant在VirtualBox上提供一个虚拟机。 | jimmyjmh 翻译于 2年前 2人顶 顶 翻译的不错哦! |
那容器到底什么是以及它与基于管理程序的虚拟化的区别是什么?简单地说,容器在操作系统层面虚拟化,而基于管理程序的虚拟化在硬件层面。效果类似,但区别很重要,这也是我花了点时间探索它们的差异和由其产生的差异和权衡的原因。 | jimmyjmh 翻译于 2年前 1人顶 顶 翻译的不错哦! |
由于基于hypervisor的虚拟化仅仅提供了对硬件的访问,因此你还需要安装操作系统。这样就会运行多个完整的操作系统,每个虚拟机上运行一个,这将快速地吃完服务器上的诸如内存(RAM)、CPU和带宽等资源。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
图2展示了两种类型的虚拟机和容器 图2.虚拟机和容器 Docker容器里所执行的进程与宿主机操作系统上运行的进程或者运行在其它Docker容器里的进程是相互独立的。不过,所有的进程都是运行在相同的内核里。Docker使用LXC来给每个容器提供独立的命名空间,内核里的这项技术已经具有5年多的历史了,已经十分成熟。另外,容器还使用了控制组,Linux内核里的这项技术比LXC的历史更长,它对资源进行审核和限制。 | 几点人 翻译于 2年前 2人顶 顶 翻译的不错哦! |
Docker服务进程本身还是一个潜在的攻击载体,这是因为它目前只能以root权限运行。对LXC和Docker的改进都应当允许以非root权限运行容器,而且可以用另外一个用户运行Docker服务进程。 虽然容器所使用的这种类型的隔离总的来说非常强大,然而是不是像运行在hypervisor上的虚拟机那么强壮仍具有争议性。如果内核停止,那么所有的容器就会停止运行。虚拟机具有优势的领域是它十分成熟,而且广泛的应用在生产环境中。相比之下,Docker和它的支撑技术几乎没有任何行动。特别是Docker每天都进行大量的修改变化,而且我们大家都知道变化是安全的天敌. | 几点人 翻译于 2年前 2人顶 顶 翻译的不错哦! |
上面我们一直在对Docker和虚拟机进行比较,现在该看看这两种技术彼此在哪些方面是真正互补的。Docker在虚拟化的环境下运行的非常好。很显然,你不需要对各个虚拟主机的每个应用或者组件进行封装。而且假定给你一台Linux虚拟机,你就能够很容易地部署上Docker容器。这也就是在非Linux系统,比如OS X和Windows上运行Docker的官方安装方式是在Vagrant的协助下安装基于Ubuntu虚拟机的Precise64不让你感到吃惊的原因所在。http://www.docker.io站点有详细并且简单的指令。 | 几点人 翻译于 2年前 0人顶 顶 翻译的不错哦! |
Docker杀手级特性之一就是能够快速的查找、下载和启动由其他开发者创建的容器映像。存储映像的地方称为注册中心。Docker有限公司提供一个公共的注册中心,这个注册中心也称为索引中心。你可以把这个注册中心和Docker客户端看作与Node的NPM,Perl的CPAN或者Ruby的RubyGems等同。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
Docker是有单个二进制文件组成的,这个二进制文件可以以三种方式来运行。第一种,它可以作为管理容器的服务进程运行。服务进程向外提供既可以进行本地访问也可以进行远程访问的基于REST风格的API。越来越多的客户端数据库可与服务进程API进行通信,其中包括Ruby,Python,JavaScript(Angular和Node),Erlang,Go和PHP提供的客户端库. | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
让我们看看实际中运行Docker的这三种方式。在下面的例子里,你将搜索Docker仓库,查找MySQL映像。因此你找到所喜欢的映像,然后下载它,接着告诉Docker服务进程运行对应的命令(MySQL)。你所做的这些操作都是通过命令行进行的。 图3.下载Docker映像并启动容器 一开始,先运行docker search mysql命令,这条命令将显示公共Docker注册中心里匹配关键词"mysql"的映像列表。我确定这条命令可以正常运行,接着使用命令docker pull brice/mysql下载"brice/mysql"映像。你可以看到Docker不仅仅下载的是你所指定的映像,而且还可以下载依赖这个包所建立的其他映像。输入docker images命令,将会罗列出目前本地具有的所有映像,其中包括了"brice/mysql"映像。使用-d选项启动容器,它将会脱离当前运行的容器之外运行一个容器,此时,你已经在一个容器里运行了MySQL了。你可以使用docker ps命令来验证,这条命令经罗列出运行的容器,而不是罗列出映像。在命令行的输出里,你还能看到MySQL服务侦听的端口号,默认是3306。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
然而,在知道MySQL运行在容器内部情况下,你该怎样连接到MySQL呢?切记:每个Docker容器有自己的网络接口。你需要确定的是mysqld服务器进程运行在哪个IP地址和端口上。运行docker inspect <imageId>命令,它将给我们提供大量的信息。不过,由于你所需要的仅仅是IP地址,所以当你使用容器的哈希值对容器进行查看的时候,你就可以抓取到IP地址,即运行docker inspect 5a9005441bb5 | grep IPAddress。现在你可以通过给标准的MYSQL CLI客户端指定主机地址和端口选项来连接了。当你使用完MySQL服务器后,你可以使用命令docker stop 5a9005441bb5关闭这个容器了。 我们使用了7条命令查找、下载、启动运行MySQL服务器的Docker容器以及使用完后关闭这个容器。在这个过程中,你不必担心与已安装软件之间存在的冲突,也不必担心MySQL的版本有什么不一样,或者存在哪些包依赖。你使用了7条不同的Docker命令:search、pull、images、run、ps、inspect和stop,不过,Docker客户端实际上有33条命令。你可以通过命令运行docker help命令或者查找在线手册来查阅全部命令列表。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
在上面例子里进行Docker操作之前,我就提到了客户端与服务进程和Docker注册中心之间的通信是通过基于REST的Web服务而进行的。这就隐含地告诉你可以使用本地Docker客户端与远程的服务进程通信,从而可以有效地管理远端服务器上的容器了。Docker站点上对Docker服务进程、注册中心和索引的API都有很好的文档,并且举例给予了说明(见资源一节)。有多种方式可以把Docker引入到开发和部署过程里。让我们看看演示工作流程的例子,如图4。我们设想一个公司的开发人员可能运行安装了Docker的Ubuntu。他可能从公共注册中心下载映像或者上传映像到公共注册中心,并在这个映像的基础上安装自己的代码或者公司专有知识产权的软件,还要生成可上传到公司私有注册中心的映像。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
在这个例子里,公司的产品质量测试环境运行的Centos和Docker。它也从公共或者私有的注册中心下载映像,然后再环境更新的时候启动各种容器。 最后,为了方便扩展和伸缩,公司把生产环境部署在云中,即部署在亚马逊的WEB服务上(AWS)。亚马逊Linux上也运行了管理不同容器的Docker。 注意:上面的所有三个环境运行着不同版本的Linux,但这三个环境都与Docker兼容。而且每个环境都运行着不同的容器组合。然而,由于每个容器都把自己的依赖同其他容器分离开来,因此不存在任何冲突,所有容器都平安地并存着。 图4.使用Docker进行软件开发的工作流程举例 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
认识到Docker提供的是一个以应用为核心的容器模型是非常重要的。也就是说,容器运行的是单独的应用或者服务,而不是许多应用或者服务。我们已经知道:创建和运行容器非常快而且消耗的资源也很少。由于你所使用的系统遵循单一责任法则,而且每个容器运行一个主进程,所以系统组件之间就是松耦合的。基于这个理念,我们自己就可以创建属于自己的,可以启动容器的映像了。在前面的例子里,你已经通过命令行与Docker进行交互了。然而在创建映像的时候,更常见的是创建进行自动构建过程的"Dockerfile“。Dockerfile是简单的文本文件,它描述的是构建过程。你可以对Dockerfile实行版本控制,这样就可以就可以非常完美地重复创建映像了。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
在接下来的例子里,我们将看看名字为PHP Box的Dockerfile(见代码清单1)。? |
FROM命令向你指明了所使用的基本映像。它必须是Docker文件的第一条命令。在这个例子里,你所做的工作都是建立在刚才新建的基本映像Centos上的。很显然,MAINTAINER命令则罗列出了维护这个Dockerfile的人员。RUN命令执行一条命令,并给出运行结果映像,因此它新创建了一个映像。这个Dockerfile里的RUN命令获取其他软件仓库的配置文件,然后使用Yum安装curl、git、wget、unzip、httpd、php-mysql和yum-utils。我们可以把这几个yum install命令合并成一条RUN命令,从而可以避免连续多次提交。
几点人
翻译于 2年前
1人顶
顶 翻译的不错哦!
接下来的EXPOSE命令向外部开放端口80,它就是启动容器的时候Apache要侦听的端口号。 最后一条命令 CMD给出了容器启动时所要运行的缺省命令。启动容器就是启动一个单独的进程,这样你就可以把容器看作一条命令。 在命令行里输入 docker build -t php_box .,这时Docker就会使用当前目录下的Dockerfile开始进行构建。运行所得到的最终映像将被命名为"php_box",这样,你以后就会很容易的识别和查找这个映像。 这个构建过程下载了基本映像,紧接着安装Apache httpd以及与其相关的所有依赖。完成安装之后,将返回一个用来识别新创建映像的哈希值。这个值与你在前面启动MySQL容器时所使用的值类似。你可以使用php_box标签来运行Apache和PHP映像,命令如下: docker run -d -t php_box。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
下面我们将以很简短例子结束这篇文章,这个例子说明在已有的映像基础上如何简单地创建新映像: ? FROM命令指定了启动的是php_box映像。然后使用 ADD命令拷贝本地一目录到这个映像。在这个例子里,拷贝到映像的Apache的DOCUMNET_ROOT文件夹的是一个PHP项目。最终得到的结果是:启动这个映像的时候默认会启动这个服务站点。 | 几点人 翻译于 2年前 0人顶 顶 翻译的不错哦! |
轻量级应用及其依赖打包和部署工具Docker的出现是令人激动的事情,Linux社团很快采纳了它,而且还试着在生产环境中使用。例如,Red Hat在12月就宣布将在即将发布的Red Hat Linux企业版7里支持Docker。然而,Docker仍然是一个年轻的项目,而且正在飞速发展中。看到Docker项目发布1.0版本将是多么令人激动的时刻,1.0版本将是官方批准的用于生产环境的第一个版本。Docker依靠的现有的技术,其中一些技术已经具有十几年的历史了,但这并不意味着它没有任何创新。我希望这篇文章能给你足够多有关Docker的信息,并鼓励你下载Docker,亲自试一下。 | 几点人 翻译于 2年前 1人顶 顶 翻译的不错哦! |
在这篇文章发布的时候,Docker团队发布了版本0.8。最新的发布增加了对Mac OS X的支持,它有两个组件组成。客户端可以运行在OS X操作系统上,而Docker服务进程则运行在由boot2docker管理的轻量级VirtualBox虚拟机上,其中也包含命令行客户端。由于底层技术,比如LXC和命名空间得不到OS X的支持,所以这么做就是必然的选择。我认为大家都在期待有类似的方案能用在其他平台上,比如Windows上。 |
相关文章推荐
- 5分钟弄懂Docker!
- docker基础概念总结
- 第二章 Docker的核心概念和安装
- 1.3 虚拟化与Docker
- 1.2 为什么要使用Docker
- 第一章 初识Docker
- 斌哥的 Docker 进阶指南
- 斌哥的 Docker 进阶指南
- 【原创】docker源码分析(2)---docker server
- Docker exec与Docker attach
- Docker Hub 的伟大在那里?
- 【Docker】容器、虚拟机与Docker概念全解析
- centos 安装部署docker与局域网主机相通详细配置
- docker 介绍
- docker入门时碰到的代理设置问题
- docker 报Error: docker-engine-selinux conflicts with docker-selinux-1.9.1-25.el7.centos.x86_64
- ubuntu下安装docker
- dockerfile 收集
- Docker是用来干什么的?
- docker 搭建php开发环境