非Linux操作系统上可以用Docker吗

966,690 七月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
Docker:利用Linux容器实现可移植的应用部署
Docker:利用Linux容器实现可移植的应用部署
日. 估计阅读时间:
智能化运维、Serverless、DevOps......2017年有哪些最新运维技术趋势?!
相关厂商内容
相关赞助商
CNUTCon全球运维技术大会,9月10日-9月11日,上海&光大会展中心大酒店,
我们来看一个相对简单的应用的部署:。Wordpress的安装通常要求:
Wordpress源码
一个Wordpress MySQL数据库,配置Wordpress使用该数据库
Apache的配置:
加载PHP模块
支持URL重写和.htaccess文件
指向WordPress源码的DocumentRoot
在服务器上部署、运行这样一个系统,我们可能会遇到下面的问题和挑战:
隔离性:如果我们已经在这个服务器上部署了不同的网站,已有的网站只能在上运行,而Wordpress依赖于Apache,这时我们就会有麻烦:它们都监听80端口。同时运行两个网站是可以的,但需要调整配置(修改监听端口),设置反向代理等。库级别也会出现类似的冲突,如果还要运行一个仍然依赖PHP4的老应用就会出问题,因为Wordpress不再支持PHP4,同时运行PHP4和PHP5则非常困难。运行在同一个服务器上的应用没有互相隔离(在文件系统级别和网络级别),所以它们可能会互相冲突。
安全性:Wordpress的安全记录并不是非常好。所以还是给它创建个沙箱,至少黑客入侵时不会影响其他运行的应用。
升级、降级:升级应用一般会覆盖现有文件。升级过程中会发生什么?系统要关闭么?如果升级失败,或者不对该怎么办?我们怎样快速回退到先前的版本?
快照、备份:一旦所有的内容都设置好,就给系统创建一个&快照&,以便能备份快照,甚至能移到另一个服务器上再次启动,或者拷贝到多个服务器上以备不时之需。
重复性:系统出新版本之后,比较好的做法是先在测试基础设施上自动部署并测试,然后再发布到生产系统。通常会利用诸如、等工具在服务器上自动安装一堆包,等一切内容都就绪后,再在生产系统上运行相同的部署脚本。这在百分之九十九的情况下都没有问题。但有百分之一的例外,在部署到测试环境和生产环境之间的时间跨度里,你依赖的包在包仓库里有了更新,而新版本并不兼容。结果生产环境的设置和测试环境不同,还有可能破坏生产系统。假如没有控制部署的每一个方面(例如托管自己的APT或YUM仓库),持续在多个阶段(比如测试、预演、生产环境)重复搭建出完全相同的系统就很困难。
资源限制:如果我们的Wordpress耗费CPU资源,并占用了所有的CPU周期,导致其他应用无法做任何事情怎么办?如果它用尽了全部可用的内存呢?或者疯狂写日志阻塞磁盘呢?要是能限制应用的可用资源,比如CPU、内存和磁盘空间,就会非常方便。
易于安装:也许有Debian或CentOS包,抑或是能自动执行所有复杂步骤并安装Wordpress的Chef菜谱。但这些菜谱很难稳定下来,因为它们需要考虑目标系统上可能的系统配置。很多情况下,这些菜谱只能在干净的系统上运行。因此,你不太可能更换成自己的包或Chef菜谱。这样的话,安装就是个复杂的系统工程,而不是午休期间就能搞定的事情。
易于移除:软件应该能轻松、干净地移除,不留痕迹。但部署应用通常要调整已有的配置文件、设置状态(MySQL数据库的数据,日志),完全移除应用也变得不那么容易。
那我们应该如何解决这些问题呢?
我们决定在单独的虚拟机上运行独立的应用,例如,大部分问题这时会迎刃而解:
隔离性:在一个VM上安装一个应用,应用是完全独立的,除非它们攻入了对方的防火墙。
重复性:用你喜欢的方式准备系统,然后创建一个AMI。你可以随意实例化多个AMI实例。完全是可重现的。
安全性:由于我们完全隔离,如果Wordpress遭到攻击,其余的基础设施并不会受到影响&&除非你没有保管好SSH密钥或者在哪里都使用同一个密码,但你应该不会这么做吧?
资源限制:VM会分配特定的CPU周期、可用内存和磁盘空间,没有加价的话就不能超额。
易于安装:越来越多的应用能够在EC2上运行,只要在上点击一个按钮就能实例化应用。启动只需要几分钟,就是这样。
易于移除:不需要某个应用了?销毁VM。干净又方便。
升级、降级:里提到,只需要在新VM上部署新版本,然后让负载均衡器指向部署了新版本的VM。不过应用如果需要在本地保存状态,这种方法就不是很好用了。
快照、备份:点击一个按钮(或者调用一下API)就能获得EBS磁盘的快照,快照会备份到中。
不过&&我们有个新问题:虚拟机在两个方面比较昂贵:
金钱:你真的有那么多钱为每个应用启动一个EC2实例?另外你能预测到需要多少个实例么?如果你以后需要更多的资源,你需要停止VM进行升级&&否则就要为闲置资源白白付钱,直到真正用起来(除非你用能动态调整大小的Solaris Zones,比如上的)。
时间:虚拟机相关的操作大多都很慢:启动要几分钟,捕捉快照要几分钟,创建镜像也需要几分钟。世界不停转动,我们可没有这种时间!
我们能做得更好吗?
进入的世界吧。
是由公共PaaS提供商的人发起的开源项目,。从技术角度来说,Docker(主要用语言编写)试图简化两种已有技术的使用:
,允许独立进程在比普通Unix进程更高的隔离级别上运行。使用的技术术语是集装箱化:一个容器里运行一个进程。容器支持的隔离级别有:
文件系统:容器只能访问自己的沙箱文件系统(类似于),否则要到容器的文件系统中才能访问。
用户名字空间:容器有自己的用户数据库(也就是容器的root不等于主机的root账户)。
进程名字空间:只有容器里的进程才是可见的(ps aux的输出会非常简洁)。
网络名字空间:每个容器都有自己的虚拟网络设备和虚拟IP(因此它可以绑定任意端口,不用占用主机端口)。
,可用来创建联合、写时拷贝的文件系统。
Docker可以安装在任何支持AUFS和内核版本大于等于3.8的Linux系统上。但从概念上来说它并不依赖于这些技术,以后也可以和类似的技术一起运行,例如或,并将作为文件系统。不过目前只能选择Linux 3.8+和AUFS。
那Docker为什么有意思呢?
Docker非常轻量。启动VM是个大动作,需要占用大量内存;而启动Docker容器只耗费很少的CPU和内存,并且非常快。几乎和启动一个常规进程没什么区别。不仅运行容器快,构建镜像、捕获文件系统的快照也很快。
它运行在已经虚拟化过的环境中。也就是说,你可以在EC2实例、Rackspace VM或VirtualBox里运行Docker。事实上,在Mac和Windows上使用Docker的首选方式是。
Docker容器能移植到任何运行Docker的操作系统上。无论是Ubuntu还是CentOS,只要Docker运行着,你的容器就能运行。
让我们回到前面的部署、操作问题列表,看看Docker是怎么解决的:
隔离性:Docker在文件系统和网络级别隔离了应用。从这个意义上来讲很像在运行&真正的&虚拟机。
重复性:用你喜欢的方式准备系统(登录并在所有软件里执行apt-get命令,或者使用),然后把修改提交到镜像中。你可以随意实例化若干个实例,或者把镜像传输到另一台机器,完全重现同样的设置。
安全性:Docker容器比普通的进程隔离更为安全。Docker团队,正在着手解决。
资源约束:Docker现在能限制CPU的使用率和内存用量。目前还不能直接限制磁盘的使用情况。
易于安装:Docker有一个,这个仓库存储了现成的Docker镜像,你用一条命令就可以完成实例化。比如说,要使用Clojure REPL镜像,只要运行docker run -t -i zefhemel/clojure-repl命令就能自动获取并运行该镜像。
易于移除:不需要应用了?销毁容器就行。
升级、降级:和EC2 VM一样:先启动应用的新版本,然后把负载均衡器切换到新的端口。
快照、备份:Docker能提交镜像并给镜像打标签,和EC2上的快照不同,Docker是立即处理的。
怎么使用Docker
假设你已经安装了Docker。要在Ubuntu容器中运行bash,只要执行:
docker run -t -i ubuntu /bin/bash
根据&ubuntu&镜像的下载情况,Docker会选择下载或者使用本地可用的拷贝,然后在Ubuntu容器里运行/bin/bash。接着你就能在容器里执行几乎所有典型的Ubuntu操作,比如安装新的包。
我们来安装个&hello&:
$ docker run -t -i ubuntu /bin/bash
root@78b:/# apt-get install hello
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 26.1 kB of archives.
After this operation, 102 kB of additional disk space will be used.
Get:1 /ubuntu/ precise/main hello amd64 2.7-2 [26.1 kB]
Fetched 26.1 kB in 0s (390 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package hello.
(Reading database ... 7545 files and directories currently installed.)
Unpacking hello (from .../archives/hello_2.7-2_amd64.deb) ...
Setting up hello (2.7-2) ...
root@78b:/# hello
Hello, world!
现在退出,然后再运行一次相同的Docker命令:
root@78b:/# exit
$ docker run -t -i ubuntu /bin/bash
root@e5e9cde16021:/# hello
bash: hello: command not found
怎么了?我们美丽的hello命令哪儿去了?事实上我们刚刚根据干净的Ubuntu镜像启动了一个新的容器。要继续先前那个,我们必须把它提交到仓库中。我们退出这个容器,看看先前启动容器的ID是什么:
$ docker ps -a
e5e9cde16021
ubuntu:12.04
About a minute ago
ubuntu:12.04
2 minutes ago
docker ps命令能列出当前运行的容器,docker ps -a还会显示已经退出的容器。每个容器都有一个唯一的ID,类似于Git提交哈希值。命令也列出了容器基于的镜像、运行的命令、创建时间、当前状态,以及容器暴露的端口和与主机端口之间的映射。
上面那个是我们第二次启动的容器,不包含&hello&;下面那个是我们想重用的,所以我们提交一下,再创建一个新的容器:
$ docker commit 78b zefhemel/ubuntu
356e4d516681
$ docker run -t -i zefhemel/ubuntu /bin/bash
root@0d7898bbf8cd:/# hello
Hello, world!
我用容器ID把容器提交到了仓库中。仓库类似于Git仓库,包含一或多个打了标签的镜像。如果像我一样没有指定标签名称,标签会被命名为&latest&。运行docker images命令可以查看本地安装的所有镜像。
Docker提供了一些基础镜像(比如ubuntu和centos),你也可以创建自己的镜像。用户仓库的命名模型和的类似:后面跟一个斜线,然后再跟仓库名称。
前面创建Docker镜像的方式并不是特别正规,你可以试试。更简洁的方式是使用Dockerfile。
使用Dockerfile构建镜像
Dockerfile是个简单的文本文件,介绍了如何从基础镜像构建镜像。我在Dockerfile。下面的文件用来运行、安装SSH服务器:
FROM ubuntu
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo &root:root& | chpasswd
上面的内容一目了然。FROM命令定义了基础镜像,基础镜像可以是官方的,也可以是我们刚刚创建的zefhemel/ubuntu。RUN命令用来配置镜像。在这里,我们更新了APT包仓库,安装了openssh-server,创建了一个目录,然后给我们的root账户设置了一个再简单不过的密码。EXPOSE命令会向外暴露22端口(SSH端口)。接下来看看如何构建并实例化这个Dockerfile。
第一步是构建一个镜像。在包含Dockerfile的目录下运行:
$ docker bui ld -t zefhemel/ssh .
这会创建一个zefhemel/ssh仓库,包含我们新的SSH镜像。如果创建成功,就能进行实例化了:
$ docker run -d zefhemel/ssh /usr/sbin/sshd -D
和前面的命令不一样。-d表示会在后台运行容器,而不是运行bash,所以我们用前台模式(用-D参数指定)运行了sshd守护进程。
让我们检查运行中的容器,看看命令做了些什么:
$ docker ps
23ee5acf5c91
zefhemel/ssh:latest
/usr/sbin/sshd -D
3 seconds ago
Up 2 seconds
可以看到我们的容器启动着。PORTS头下的内容比较有意思。由于我们EXPOSE了22端口,这个端口现在映射到了主机系统的一个端口(这里是49154)。让我们看看它能否运行。
$ ssh root@localhost -p 49154
The authenticity of host '[localhost]:49154 ([127.0.0.1]:49154)' can't be established.
ECDSA key fingerprint is f3:cc:c1:0b:e9:e4:49:f2:98:9a:af:3b:30:59:77:35.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:49154' (ECDSA) to the list of known hosts.
root@localhost's password: &I typed in 'root' here&
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.8.0-27-generic x86_64)
* Documentation:
The programs included with the Ubuntu syst
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@23ee5acf5c91:~#
再次成功了!现在有了一个运行的SSH服务器,我们能登录它。在有人猜出密码并攻击容器之前,让我们先从SSH退出,杀掉容器。
$ docker kill 23ee5acf5c91
如你所见,容器的22端口映射到了49154端口,但这是完全随机的。要把它映射到特定端口,运行命令时传入-p参数:
docker run -p 2222:22 -d zefhemel/ssh /usr/sbin/sshd -D
现在,如果2222端口可用,我们的端口就会映射到2222上。我们在Dockerfile的结尾再添加一行内容,以便我们的镜像对用户更加友好:
CMD /usr/sbin/sshd -D
CMD表示构建镜像时并不会运行命令,实例化时才运行。所以不传递其它参数时就会执行/usr/sbin/sshd -D。然后我们可以直接运行:
docker run -p 2222:22 -d zefhemel/ssh
得到的结果和前面一样。要发布新创建的镜像,只要运行docker push就可以了:
docker push zefhemel/ssh
登录之后,,用先前的docker run命令就能执行命令。
让我们回到Wordpress的例子。怎样在容器里用Docker运行Wordpress呢?要构建一个Wordpress镜像,我们要创建一个Dockerfile:
安装Apache、PHP5和MySQL
下载Wordpress,解压到文件系统的某个地方
创建一个MySQL数据库
更新WordPress的配置文件,指向MySQL数据库
把WordPress设置为Apache的DocumentRoot
启动MySQL和Apache(比如用)
幸运的是,,比如就包括创建这样一个Wordpress镜像需要的所有内容。
Docker用例
除了用可靠、可重复的方式简化复杂应用的部署,Docker还有很多用途。下面是一些有趣的Docker用法和项目:
持续集成和部署:在Docker容器里构建软件,确保构建之间的隔离性。构建好的软件镜像可以自动推到私有的Docker仓库中,并部署到测试环境或生产环境。
:一个简单的PaaS,用构建而成。
和,两个使用Docker的开源PaaS项目。
验证了Docker的合理性,CoreOS是个非常轻量级的Linux发行版,其中的应用都用Docker安装、运行,由管理。
Docker不是什么
尽管Docker有助于系统的可靠部署,但它本身并不是个完全成熟的部署系统。它操作的是容器里运行的应用。哪个容器安装在哪个服务器上,以及如何启动它们,则超出了Docker的范围。
同样的,Docker也不处理跨多个容器(可能在多个物理服务器上,也可能在多个VM上)运行的应用。要让容器互相通信,需要某些发现机制,来找出哪些IP和端口上的其他应用可用。这和跨常规虚拟机的服务发现非常相似。等工具,或者其他的服务发现机制都能用来解决这个问题。
虽然本文描述的所有内容用原始的LXC、cgroups和AUFS也可能实现,但实现起来绝对没有那么。Docker提供了一种简单的方式将复杂应用打包到容器中,而且能轻松版本化、可靠分发。进而让轻量级的Linux容器和真正的虚拟机一样灵活、强大,但成本更低、方式更为便捷。即便 VirtualBox VM在Macbook Pro上,使用运行在其中的Docker创建的Docker镜像也能很好地运行在、或物理硬件上,反之亦然。
Docker可以从上获取,并免费使用。交互式的很不错。指出,第一个生产就绪的版本是2013年10月发布的0.8版本,不过此前大家已经在生产环境里使用Docker了。
Zef Hemel是公司的开发者布道师和产品管理团队成员,LogicBlox基于逻辑编程(尤其是)开发应用服务器和数据库引擎。此前他是的工程副总裁,开发基于浏览器的IDE。Zef工作之初就涉足Web领域,从二十世纪九十年代起就在开发Web应用。他是声明式编程环境的拥趸。
查看英文原文:
Author Contacted
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
订阅InfoQ每周精要,加入拥有25万多名资深开发者的庞大技术社区。
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。拒绝访问 | www. | 百度云加速
请打开cookies.
此网站 (www.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38d9b79a659d43ad-ua98).
重新安装浏览器,或使用别的浏览器Docker容器如何抵御Linux OS故障影响?
日期:作者:来源:TechTarget中国
【TechTarget中国原创】 现在说起Docker,想必大家已经不再陌生。Docker自去年首次进入开源软件市场之后就实现了爆炸式增长。上个月受到Google的公开支持,同时版本的正式发布更是让Docker热潮更上一层。 任何技术的出现到成熟都是需要付出一些代价的,现在,已经有人给Docker泼冷水了。 众所周知,Docker可以轻松地将应用和服务从开发环境迁移到生产环境,或者从一个服务器环境迁移到另一个环境。有人认为Docker也存在致命弱点,那就是云工作负载的可移植性和管理。他们将其与hypervisors进行比较,并建议VM可能是一种更好的管理云工作负载的方式。通过共享的Linux实现,因此会容易产生更多的潜在漏洞,这些漏洞可以影响服务器上每个容器的操作,特别是当底层操作系统出现故障时。在这种情况下,所有容器中的工作负载会出现性能下降。 事实上,Docker对Linux操作系统故障有自己的防御手段:
命名空间具有隔离容器所有进程,包括其他容器和主机操作系统的能力。每个容器都有自己的网络堆栈。如果一个容器出现故障,另一个容器仍然可以跟其他容器和主机操作系统互动。
Docker的Cgroups在管理资源的同时可以提供隔离功能。Cgroups不仅确保容器共享底层资源,还可以进行检测以防止其中某个容器耗尽所有资源降低其他容器性能。
如果有问题发生,Docker容器可以自动重启,从而实现额外的灵活性。你也可以扩展与操作系统之间的依赖关系,这样进一步降低了单个操作系统影响所有容器的风险。
你要知道核心观点是,容器比VM有更快更轻便的资源。只要用户愿意选择使用单独的平台来为所有的容器提供共享的操作系统。容器的真正优势在于:
一个完整的虚拟机创建和启动过程可能需要花费几分钟的时间,而一个容器可以在几秒内启动。
容器为自己内部的应用程序提供更好的性能,而在VM上运行的应用程序会产生由hypervisor运行所带来的开销。
正是这些轻量级架构的优势及更好的性能让Docker很受欢迎。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
TechTarget中国
查看更多评论
敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。
TechTarget中国存储组主编。专注原创。爱好研究美食,忠实美剧迷。
11月中,青云QingCloud宣布上海 1 区正式商用,上海1区是继北京1区、广东1区、北京2区以及位于香港的亚太1区、北京3区之后,QingCloud第六个自营公有云区域。
你知道部署容器得用哪种基础设施吗? 作为托管Docker和其他容器环境的平台,裸机服务器是否比虚拟机更好?
Docker是一个容器化应用程序的支柱,但这仅限于Linux系统内。Windows Server容器已经对其提供了支持。你还需要了解这些事情。
在每年的红帽峰会上必须出现的一个话题就是Red Hat Enterprise Linux(RHEL),今年也不例外。RHEL 7.2将是红帽企业平台的下一个重大更新。来看看有哪些新发现?
微软Windows Server 2012 R2为广大Linux用户带来了福音:Hyper-V 2012 R2增强了对Linux客户端尤其是Linux虚拟机的支持。本期技术手册为您分享在Hyper-V中运行Linux虚拟机时的实用技巧。
有了微软的Virtual&Server&2005&R2,管理员不必亲自去到主机服务器而迅速管理多台虚拟机。本指南包含Virtual&Server&2005&R2(VS2005R2)的一些主要特性、怎样在Windows中安装Microsoft&Virtual&Server&2005&R2、如何创建虚拟机和安装子机操作系统以及它与Virtual&PC之间的比较。
IT预算是IT管理员的一个烦恼。不过在如今全球经济危机下,相对于减少IT预算和和裁员,更值得考虑使用免费的虚拟化管理工具。在整个2008年,许多公司发布了关于VMware ESX和VMware Infrastructure套件的新应用,包括几个免费的VMware工具。这些工具是免费的,但并不意味着它们竞争不过付费产品。本应用手册将介绍2008十大免费VMware工具。
什么是高可用性?它与灾难恢复有什么区别?在虚拟环境里达到高可用性的方法有哪些?VMware HA有哪些作用?如何在虚拟环境配置VMware HA故障转移级别?HA出现故障时应该如何解决?
TechTarget
企业级IT网站群
TechTarget中国 版权所有
All Rights Reserved, Copyright
TechTarget中国 版权所有
All Rights Reserved, Copyright}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信