如何创建为容器数据库尽可能小的Docker容器

1dotCloud到Docker:低调奢华有内涵  写在前面:放在两年前,你不认识Docker情有可原。但如果现在你还这么说,不好意思,我只能说你OUT了。你最好马上get起来,因为有可能你们公司很快就会引入Docker。今天就和大家讨论讨论这个备受好评的应用,让我们来揭开他的真面目!    【一】从dotCloud到Docker--低调奢华有内涵  1、追根溯源:dotCloud  时间倒回到两年前,有一个名不见经传的小公司,他的名字叫做:dotCloud。dotCloud公司主要提供的是基于&PaaS(Platform&as&a&Service,平台及服务)平台为开发者或开发商提供技术服务,并提供的开发工具和技术框架。  初创企业总是艰难的,dotCloud也是一样。在IBM,亚马逊,谷歌等大公司的挤压下,dotCloud举步维艰。即使2011年拿到了1000万美元的融资,可和上述大公司比起来,也不过是杯水车薪。  随着开源的洪流袭来,在2013年dotCloud&的创始人,28岁的Solomon&Hykes做了一个艰难的决定:将dotCloud的核心引擎开源!然而一旦这个基于&LXC(Linux&Container)技术的核心管理引擎开源,dotCloud公司就相当于走上了一条&不归路&。  可正是这个孤注一掷的举动,却带来了全球技术人员的热潮,众程序员惊呼:太方便了,太方便了。也正是这个决定,让所有的IT巨头也为之一颤。一个新的公司也随之出世,它就是:Docker。  2、Docker出世:从Docker0.1到Docker1.0  一个春秋,跨越了Docker的成名路。  在互联网时代,一夜成名早已不是什么新闻。Docker&这个技术公司,向我们证明了,成为一个&国际巨星&,只需要一个月。2013年2月决定开源,到日发布Docker0.1,只用了一个月的时间。  今后几乎每个一个月,Docker都会发布一个版本。而Docker0.1的发布像是一个宣言,昭示着一个Docker正在以一个新兴容器领导者的姿态迈进。  正如我们所知,从Docker0.1到Docker1.0,15个月的时间,Docker迅速成长。在日,Docker团队宣布发布Docker&1.0版。  日,1.0版本发布官方声明  1.0版本标志着Docker公司认为Docker平台已经足够成熟,并可以被应用到产品中(还提供了一些需要付费的支持选项)。  在这15个月中,Docker共收到了超过460位贡献者的8741条改进建议,Docker的用心经营下社区十分活跃。可以说,Docker的成功起于开源,发于社区。2如何定义Docker?  一年的时间,使一个围绕着Docker的小型初创企业生态体系逐渐形成。Docker先后赢得了Google、微软、Amazon、等巨头的青睐,巨头们纷纷示意将保证自己平台与Docker容器技术的兼容性。微软还宣布来要推出面向Windows的Docker客户端。  到了2014年9月,Docker完成4000万美元的C轮融资,彼时市值与约为4亿美元。可以说Docker一路风生水起,迅速赢得了IT圈的信赖。并且在8月12Docker发布了Docker1.8正式版(地址见末尾)。  但Docker是如何做到这些的呢?Docker的成功之路能否被复制呢?  【二】如何定义Docker?  Docker&是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的&Linux&机器上。  Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是Docker提出的&Build&once,Run&anywhere&Docker:Build&once,Run&anywhere    为了更好的认识Docker,我们先来了解几个必备词汇:镜像,容器和仓库。  1、镜像(image):Docker&镜像就是一个只读的模板,镜像可以用来创建&Docker&容器。Docker&提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。  镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。  Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:。  2、容器(&Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的&Linux&环境,Docker&利用容器来运行应用。  3、仓库:仓库是集中存放镜像文件的场所,仓库注册(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是&Docker&Hub,存放了数量庞大的镜像供用户下载。  Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。  Docker的运行离不开这几位的支持,Docker的成功也是拜几位所赐。也有人会误以为,Docker就是容器。但Docker只会傲娇地说:我不是容器,我是管理容器的引擎。什么是Docker  Docker中文手册上解释说:Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs()、bare&metal、OpenStack&集群和其他的基础应用平台。  从这里我们可以看出,Docker并非是容器,而是管理容器的引擎。Docker为应用打包、部署的平台,而非单纯的虚拟化技术。3Docker与虚拟化争锋  【三】Docker与虚拟化争锋容器技术与传统性能对比    谈到虚拟化,很多人又发问了。Docker和虚拟化有什么区别?Docker(或者说是容器)的出现是否会取代传统的虚拟化技术。  说起虚拟化,大家首先想到的必然是VM一类的虚机。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。  但在惜时如金的现在,这类虚机也面临着一定的问题,比如:启动时间太长,你有没有过在启动虚拟机后,点开其他页面继续操作,过了一分钟才回来的经历?还有虚拟镜像体积太大(一般都是几十GB)等问题。相比之下,Docker的镜像一般只有二三百兆。并且启动速度超快,&Docker的启动时间为毫秒级。  还有一个最大的问题是价格问题,据StackEngine调查分析,有43.8%的企业使用Docker的原因是太贵。Docker与虚拟机建构对比    但是,传统的虚拟技术还不会被取代。Docker或者说容器技术和虚拟机并非简单的取舍关系。  目前,很多企业仍在使用虚拟机技术,原因很简单,他们需要一个高效,安全且高可用的构架。然而,刚刚面世两年的Docker还没有经历沙场考验,CaaS(Container&as&a&Service,容器即服务)概念也是近两年才刚刚出现。无论是应用管理还是运行维护方面,Docker都还处于发展与完善阶段。  【四】Docker:我为什么与众不同  Solomon&Hykes:成功的要素之一是在正确的时间做了正确的事,我们一直坚信这个理念。Docker就好比传统的货运集装箱,我们一直都在努力。我们努力让这个技术更加灵活,更容易使用。  站在未来的角度,Docker解决了三大现存问题。  Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的&Linux&机器上,便可以实现虚拟化。  俗话说:天下武学唯快不破;在更新迭代如此之快的IT领域更是如此。所有成功的IT公司都必须走在时代的前列,他们的产品应该来自未来。他们有必要要站在未来的角度解决现存的问题。Docker之父Solomon&Hykes:Docker就好比传统的货运集装箱    Solomon&Hykes曾经说过,自己在开发dotCloud的PaaS云时,就发现一个让人头痛的问题:应用开发工程师和系统工程师两者之间无法轻松协作发布产品。Docker解决了难题。让开发者能专心写好程序;让系统工程师专注在应用的水平扩展、稳定发布的解决方案上。4Docker解决了三大现存问题  1、简化程序:Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的&Linux&机器上,便可以实现虚拟化。  Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。  2、避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!比如Docker镜像;Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。  3、节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。  另一方面,Docker能够是自愿额达到充分利用。举个简单地例子:凌晨三点的时候只有很少的人会去访问你的网站,同时你需要比较多的资源执行夜间的批处理任务,通过Docker可以很简单的便实现资源的交换。  Docker的这些优势,让各大IT巨头纷纷对Docker看好。  【五】统一标准,建立更有活力的生态系统开放容器技术项目(Open&Container&)    在2015年的DockerCon上推出了开放容器技术项目(Open&Container&Project)。OCP是一个非营利性组织,其受特许建立通用的容器技术标准。  这个项目汇集了微软、谷歌、惠普、IBM、英特尔、红帽(Red&Hat)、以及高盛等众多实力企业,OCP的推出,也使宿敌Docker和CoreOS走向了联合。让微软与自己的竞争对手Linux合作,足以见得Docker的魅力。  谷歌云计算平台产品经理克雷格·麦克拉克伊(Craig&Mcluckie)说:创建通用容器格式非常重要,单一标准可以促进更有活力的生态系统。  【六】企业对Docker是否认可?安全是关键!  随着容器技术逐渐得到IT界的认可,CaaS(Container&as&a&Service,容器即服务)也逐渐形成。而Docker作为CaaS技术的标杆是否已经得到企业的认可?是否投入生产呢?  2015年,和共同组织了一次问卷调查。报告显示,Docker的早期用户中,63%的用于QA/Test,53%的用于开发,并且31%的用户计划在生产环境中使用Docker,阻碍企业使用Docker的最大因素在于其安全性以及缺少生产环境下的运维工具(两个原因各占49%左右)。  对Docker应用最广泛的三个领域分别是:Test/QA应用;Web应用;大数据,企业应用。  调查显示,目前企业对Docker的接受程度在不断提高。但Docker的安全性似乎仍旧是企业顾虑的主要原因,那么Docker的安全性究竟如何?Gartner:Docker还是一项年轻的技术,它的安全性仍不够成熟    2015年1月,Gartner分析师Joerg&Fritsch发布一份报告,报告显示:虽然Docker这款容器化工具已经颇具名声,但Docker的安全性仍不够成熟。  Joerg&Fritsch指出:&Docker与容器技术目前还无法通过管理程序弥合自身最为严重的两大短板:安全性保障与管理功能,外加在常见控制机制的机密性、完整性与可用性方面提供支持。&  总体来讲,Docker的安全性能还不错,只是这还是一项年轻的技术、因此目前尚未积累起能够满足实际生产需求的完整工具生态系统。5Docker安全鉴定三方面  其实如果要谈论Docker的安全性,我们就要谈论三点:命名空间(Namespace);Docker程序本身的抗攻击性和加固内核安全性来影响容器的安全性。企业对Docker是否认可?安全是关键!  1、命名空间(Namespace):Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,Docker运用Namespace将进程隔离,为进程或进程组创建已隔离的运行空间,为进程提供不同的命名空间视图。这样,每一个隔离出来的进程组,对外就表现为一个container(容器)。需要注意的是,Docker让用户误以为自己占据了全部资源,但这并不是&&。  内核namesapce从内核2.6.15之后被引入,距今已经5年了,在很多大型生产系统中被验证。他们的设计和灵感提出的时间更早,openvz项目利用namespace重新封装他们的内核,并合并到主流内核中。openvz最早的版本是2005年的,所以他们的设计和实现都很成熟。  2、Docker程序本身的抗攻击性:Docker允许你在主机和容器之间共享文件夹,这就容易让容器突破资源限制,那么容器就可以对主机做任何更改了。但实际上,几乎所有虚拟机系统都有在物理主机和虚拟机之间共享资源的限制,所以这一层的安全性,需要你自己把控。  3、加固内核安全性:默认情况下,Docker启动的容器只使用一部分内核capabilities,就算攻击者在容器中取得了权限,他能做的破坏也少了,也不能获得主机的更高权限。  由此我们可以说:Docker还是比较安全的,但是你要注意使用在容器中使用非root权限允许进程。  目前来说,Docker的主要应用场景为:  面向开发人员:快速开发、交付应用程序。开发环境的机器通常内存比较小,之前使用虚拟的时候,经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。  面向运维人员:降低运维成本。正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个以降低成本。Docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可。  面向企业:Docker本身就发家于PaaS,在Docker面向企业,是可以提供Paas层的实现;比如,扩展现有的OpenShift或Cloud&Foundry平台来搭建自己的PaaS环境。Docker&集装箱&  6评说Docker  【七】评说Docker  Solomon&Hykes(Docker之父):&建立一个为所有生产共有的系统,使用一种被广泛接受的方式,让它可以很好的运行和扩展,让它可以被所有人依赖,然后将它视为理所当然的存在,并使用它创造自己的奇迹,这是个挑战。评说Docker  Chris&Swan&(银行业的技术专家,曾经有十几年的时间在从事金融服务业):Docker公司已经建立了清晰的道路,即发展核心能力(libcontainer)、跨业务管理(libswarm)和容器间消息(libchan)。  Docker公司表达了利用自身生态系统的意愿。随着时间的推移,和容器(Docker中的&运行&部分)之间的区别很可能变得不再那么重要,这将使注意力转到&构建(build)&和&交付(ship)&方面。  马全一(Docker中文社区创始人之一):Docker一定会成为云计算和大数据领域的重要成员之一。  Docker的出现使得以Docker容器为单位的云平台和Docker容器为载体的交易平台成为可能。任何后端的服务程序,都可以封装在Docker容器中进行销售、分发和部署,后端开发者能像Mobile&App开发者那样去做自己的产品来获利。随着Golang的发展,一定会有以Golang为开发语言、Docker为运行载体的新大数据平台,成为Hadoop平台的竞争者。  Docker,一个迅速走红,并在技术领域赢得一片好评的一款应用。尽管Docker目前还不够完善,但已经有很多厂商已经开始使用。同时一批围绕Docker建立起来的初创企业已经形成,学习Docker风气正盛。可以预见在不远的未来,Docker和CaaS会获得更多的人肯定,越来越多的企业愿意使用Docker这个应用。  :贴上一些Docker基本命令  Docker&ps用来查看正在运行中的容器。  Docker&ps命令的常用参数(及组合)如下。  -a:&查看所有容器,包括已经停止运行的。  -l:&查看刚刚启动的容器。  -q:&只显示容器ID  -l&-q:&则可以返回刚启动的容器ID。  Docker&stop用来停止运行中的容器,同时你还可以用Docker&start来重新启动一个已经停止的容器。  Docker&restart可以重启一个运行中的容器。这就相当于对一个容器先进行stop再start。Docker内部人员:在Docker&1.0正式发布之前,就已经有3家主要银行将其投入到生产应用中 7常用Docker命令  Docker服务对应的版本查看  #&sudo&Docker&version  Docker命令帮助  #sudo&Docker&&//查看Docker的所有命令  #sudo&Docker&command&--help&&//查看单个Docker命令的帮助,如Docker&run&--help常用Docker命令8Docker最新版(1.8)下载地址  Docker最新版(1.8)地址:  Ubuntu/Debian:&curl&-sSL&https://&|&sh  Linux&64bit&binary:  https:///builds/Linux/x86_64/Docker-1.8.0  Darwin/OSX&64bit&client&binary:  https:///builds/Darwin/x86_64/Docker-1.8.0  Darwin/OSX&32bit&client&binary:  https:///builds/Darwin/i386/Docker-1.8.0  Linux&64bit&tgz:  https:///builds/Linux/x86_64/Docker-1.8.0.tgz  Windows&64bit&client&binary:  https:///builds/Windows/x86_64/Docker-1.8.0.exe  Windows&32bit&client&binary:  https:///builds/Windows/i386/Docker-1.8.0.exe  相关网站链接:Docker官网:https:///  Mac安装方式:http:///mac/started/  Linux安装方式:http:///linux/started/  Windows安装方式:http:///windows/started/用户名:kw107301
文章数:11
访问量:17515
注册日期:
阅读量:1297
阅读量:3317
阅读量:586910
阅读量:473421
51CTO推荐博文
操作系统:vm centos6.5 x64 192.168.240.148docker容器:centos6.5 x64 172.17.0.31.下载原始镜像[root@localhost&~]#docker&pull&centos&
###一般会拉最新版centos7和centos6.5过来,这里使用的是centos6.5###2.安装openssh[root@localhost&~]#&docker&run&-i&-t&kw1073/centos-new4&/bin/bash
bash-4.1#yum&-y&install&openssh-server&openssh-clients
bash-4.1#chkconfig&sshd&on
bash-4.1#service&sshd&start
######显示如下#####Generating&SSH1&RSA&host&key:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
Generating&SSH2&RSA&host&key:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
Generating&SSH2&DSA&host&key:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
Starting&sshd:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]3.ssh到宿主机中bash-4.1#ssh&192.168.240.148&-p61618
root@192.168.240.148's&password:&
Last&login:&Thu&Jul&31&22:39:38&2014&from&192.168.240.1
[root@localhost&~]#4.安装passwdbash-4.1#yum&install&passwd&
###docker官网上的centos6.5原始镜像中没有passwd,用于修改root用户的密码###
bash-4.1#passwd&root
bash-4.1#useradd&kw10735.使用commit命令保存镜像[root@localhost&~]#docker&ps&-l&&###查看docker的id###[root@localhost&~]#docker&commit&6b84dba2a9bb&kw1073/centos-new4&
###做成可ssh的docker镜像###6.在宿主机上映射端口[root@localhost&~]#docker&run&-u&-t&-p&127.0.0.1:222:22&kw1073/centos-new4&&/bin/bash&
###做好docker镜像和宿主机的端口映射,这里会直接进入bash环境###7.在docker容器中启动ssh服务bash-4.1#service&sshd&start
bash-4.1#ifconfigeth0&Link&encap:Ethernet&HWaddr&82:E2:4F:F5:12:E9
&&&&&&&&&&inet&addr:172.17.0.3&Bcast:0.0.0.0&Mask:255.255.0.0
&&&&&&&&&&inet6&addr:&fe80::80e2:4fff:fef5:12e9/64&Scope:Link
&&&&&&&&&&UP&BROADCAST&RUNNING&MTU:1500&Metric:1
&&&&&&&&&&RX&packets:4882&errors:0&dropped:0&overruns:0&frame:0
&&&&&&&&&&TX&packets:4107&errors:0&dropped:0&overruns:0&carrier:0
&&&&&&&&&&collisions:0&txqueuelen:1000
&&&&&&&&&&RX&bytes:.3&MiB)&TX&bytes:4.9&KiB)8.在宿主机上进行ssh连接[root@localhost&~]#ssh&172.0.0.3
The&authenticity&of&host&'172.17.0.3&(172.17.0.3)'&can't&be&established.
RSA&key&fingerprint&is&40:4f:f2:9a:55:07:9e:a0:cb:42:60:4f:92:fa:90:e7.
Are&you&sure&you&want&to&continue&connecting&(yes/no)?&yes
Warning:&Permanently&added&'172.17.0.3'&(RSA)&to&the&list&of&known&hosts.
root@172.17.0.3's&password:&
Last&login:&Thu&Jul&31&10:26:24&2014&from&172.17.42.1
Connection&to&172.17.0.3&closed.9.修改容器中ssh的配置####从上一步可以看到,ssh连接错误,可以登录,但是一登录上去就马上断开####bash-4.1#&sed&-i&'s/UsePAM&yes/UsePAM&no/'&/etc/ssh/sshd_config&  #修改sshd配置文件
bash-4.1#&/etc/init.d/sshd&reload 
bash-4.1#&/etc/init.d/sshd&restart                    #重启sshd服务
Stopping&sshd:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
Starting&sshd:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]10.在宿主机上重试一次ssh连接[root@localhost&dist]#&ssh&172.17.0.3&
root@172.17.0.3's&password:&Last&login:&Thu&Jul&31&11:48:51&2014&from&172.17.42.1&
-bash-4.1#&ls
或者如下连接:
[root@localhost&dist]#&ssh&root@127.0.0.1&-p222&
root@127.0.0.1's&password:&Last&login:&Thu&Jul&31&15:36:56&2014&from&172.17.42.1
#####因为做了端口映射,所以可以直接从映射的端口登陆###11.设置docker容器中的环境变量#######直接从宿主机上拷贝一份过去########
[root@localhost&dist]#&scp&/root/.bash*&172.17.0.3:/root/12.在宿主机上重新ssh到容器中[root@localhost&dist]#&ssh&172.17.0.3&root@172.17.0.3's&password:&Last&login:&Thu&Jul&31&15:07:00&2014&from&172.17.42.1&
[root@e61&~]#13.保存配置好的docker容器为镜像#######查看当前运行中的docker容器#######
[root@localhost&~]#&docker&ps&-a#######保存容器为镜像#######
[root@localhost&~]#&docker&commit&e61&kw1073/centos-new5
17a29d582aae50b6fc5be96b0#####查看当前的镜像########
[root@localhost&~]#&docker&images本文出自 “” 博客,谢绝转载!
了这篇文章
类别:┆阅读(0)┆评论(0)使用Bash在Tutum上创建并运行Docker容器 - 为程序员服务
使用Bash在Tutum上创建并运行Docker容器
提供非常棒的 Docker 容器托管服务。
目前我使用它托管运行在
上的一个机器人项目
来自动更新我们的项目.
我所做的就是为这个机器人创建一个简单的 Docker 镜像,其中包含所有它运行所需要的东西。
把这个镜像上传到 Tutum 的私有仓库并利用一段 bash 脚本和 crontab 每 30 分钟执行一次。
libgrabber 每次会工作 3 ~ 5 分钟,之后这个容器就会被销毁.
我使用的是一个"Small"大小的容器并将计费周期从 30 分钟转为 10 分钟(即每次 Tutum 会收取从容器启动开始 10 分钟的使用费用,超出的时间会按分钟收费)。
这种计费方式每次仅 0.182¢,每天 8.7¢,每月只需要 $2.6!它除了比 DigitalOcean 更便宜,我还得到了卓越的自动化服务,并且不必为基础架构和服务器而烦恼。
这里有一些我喜欢的功能:
按分钟计费(10 分钟以后开始计费)
免费的私有 docker 仓库
简单的 API
良好的支持
之前 Tutum 有一个非常简单的 API 让你可以用一行代码就创建并运行一个容器。遗憾的是 Tutum 做了一些调整后,它变得稍显繁复,现在这个过程为:
从返回的 JSON 响应中获取容器 ID
使用容器 ID 发送一个启动命令
我想用一些真正的语言来解析 JSON , 比如在 bash 下完成上述过程。
最简单的方法是使用
,但是我懒得鼓捣它。我的解决方法是:
uuid=$(curl -s -H "Authorization: ApiKey username: YOURKEY" -H "Content-Type: application/json" -d
'{"image":"r.tutum.co/user/image", "name":"libgrabber", "autodestroy":"ALWAYS", "container_size":"S"}'
https://app.tutum.co/api/v1/container/ | grep -Po '"'"uuid"'"\s*:\s*"\K([^"]*)' $1)
curl -s -H "Authorization: ApiKey username: YOURKEY" -X POST
https://app.tutum.co/api/v1/container/${uuid}/start/
大功告成!现在你可以保存这个脚本并创建一个 cronjob 以随时执行它。
这篇文章由
撰写, 翻译。点击
阅读原文。
The article was contributed by , click
to read the original publication.
Dockboard 致力于在中国建立一个 Docker 技术的开放社区。我们的行动包括编写原创技术博文、翻译相关英文文章、组织 Meetup 活动。我们非常期待您的参与,请关注我们的 新浪微博 和 T
原文地址:, 感谢原作者分享。
您可能感兴趣的代码迈出使用Docker的第一步,学习第一个Docker容器 - 简书
迈出使用Docker的第一步,学习第一个Docker容器
在本文中,我们将迈出使用Docker的第一步,学习第一个Docker容器。本章还会介绍如何与Docker进行交互的基本知识。
1 确保Docker已经就绪
首先,我们会查看Docker是否能正常工作,然后学习基本的Docker的工作流:创建并管理容器。我们将浏览容器的典型生命周期:从创建、管理到停止,直到最终删除。
第一步,查看docker程序是否存在,功能是否正常,如代码清单3-1所示。
代码清单3-1 查看docker程序是否正常工作
$ sudo docker info
Containers: 0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Execution Driver: native-0.1
Kernel Version: 3.8.0-29-generic
Registry: [https://index.docker.io/v1/]
在这里我们调用了docker可执行程序的info命令,该命令会返回所有容器和镜像(镜像即是Docker用来构建容器的“构建块”)的数量、Docker使用的执行驱动和存储驱动(execution and storage driver),以及Docker的基本配置。
在前面几章我们已经介绍过,Docker是基于客户端-服务器构架的。它有一个docker程序,既能作为客户端,也可以作为服务器端。作为客户端时,docker程序向Docker守护进程发送请求(如请求返回守护进程自身的信息),然后再对返回来的请求结果进行处理。
2 运行我们的第一个容器
现在,让我们尝试启动第一个Docker容器。我们可以使用docker run命令创建容器,如代码清单3-2所示。docker run命令提供了Docker容器的创建到启动的功能,在本书中我们也会使用该命令来创建新容器。
代码清单3-2 创建第一个容器
$ sudo docker run -i -t ubuntu /bin/bash
Pulling repository ubuntu from https://index.docker.io/v1
Pulling image 8dbd9e392ad58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu
Pulling 8dbd9e392ad58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c metadata
Pulling 8dbd9e392ad58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c fs layer
Downloading /? (n/a)
Pulling image b750fea3c593ef05ba02a62b4accb2c21d589ff2f5f2dc (quantal) from ubuntu
Pulling image 27cf () from ubuntu
root@fcd78e1a3569:/#
{提示}官方文档列出了完整的Docker命令列表,你也可以使用docker help获取这些命令。此外,你还可以使用Docker的man页(即执行man docker-run)。
代码清单3-3所示命令的输出结果非常丰富,下面我们来逐条解析。
代码清单3-3 docker run命令
$ sudo docker run -i -t ubuntu /bin/bash
首先,我们告诉Docker执行docker run命令,并指定了-i和-t两个命令行参数。-i标志保证容器中STDIN是开启的,尽管我们并没有附着到容器中。持久的标准输入是交互式shell的“半边天”,-t标志则是另外“半边天”,它告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则这两个参数已经是最基本的参数了。
{提示}官方文档上列出了docker run命令的所有标志,此外还可以用命令docker help run查看这些标志。或者,也可以用Docker的man页(也就是执行man docker-run命令)。
接下来,我们告诉Docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。ubuntu镜像是一个常备镜像,也可以称为“基础”(base)镜像,它由Docker公司提供,保存在Docker HubRegistry上。
你可以用 ubuntu 基础镜像(以及类似的 fedora、debian、centos等镜像)为基础,在你选择的操作系统上构建自己的镜像。这里,我们基于此基础镜像启动了一个容器,并且没有对容器进行任何改动。
那么,在这一切的背后又都发生了什么呢?首先Docker会检查本地是否存在ubuntu镜像,如果本地还没有该镜像的话,那么Docker就会连接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。
随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash命令启动了一个Bash shell。
当容器创建完毕之后,Docker就会执行容器中的/bin/bash命令,这时我们就可以看到容器内的shell了,就像代码清单3-4所示。
代码清单3-4 第一个容器的shell
root@f7cbdac22a02:/#
{注意}在第4章中,我们将会看到如何构建自己的镜像并基于该镜像创建容器的基础知识。
3 使用第一个容器
现在,我们已经以root用户登录到了新容器中,容器的ID f7cbdac22a02``,乍``看起来有些令人迷惑的字符串。这是一个完整的Ubuntu系统,你可以用它来做任何事情。下面我们就来研究一下这个容器。首先,我们可以获取该容器的主机名,如代码清单3-5所示。
代码清单3-5 检查容器的主机名
root@f7cbdac22a02:/# hostname
f7cbdac22a02
可以看到,容器的主机名就是该容器的ID。我们再来看看/etc/hosts文件,如代码清单3-6所示。
代码清单3-6 检查容器的/etc/hosts文件
root@f7cbdac22a02:/# cat /etc/hosts
172.17.0.4
f7cbdac22a02
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Docker以在hosts文件中为该容器的IP地址添加了一条主机配置项。我们再来看看容器的网络配置情况,如代码清单3-7所示。
代码清单3-7 检查容器的接口
root@f7cbdac22a02:/#
1: lo: &LOOPBACK,UP,LOWER_UP& mtu 1500 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
899: eth0: &BROADCAST,UP,LOWER_UP& mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 scope global eth0
inet6 fe80::1450:3aff:feb6:f2cc/64 scope link
valid_lft forever preferred_lft forever
我们可以看到,这里有lo的环回接口,还有IP为172.17.0.4的标准eth0网络接口,和普通宿主机是完全一样的。我们还可以查看容器中运行的进程,如代码清单3-8所示。
代码清单3-8 检查容器的进程
root@f7cbdac22a02:/#
PID %CPU %MEM
STAT START
TIME COMMAND
0:00 /bin/bash
0:00 ps -aux
接下来我们要干些什么呢?安装一个软件包怎么样?如代码清单3-9所示。
代码清单3-9 在第一个容器中安装软件包
root@f7cbdac22a02:/# apt-get update && apt-get install vim
通过上述命令,我们就在容器中安装了Vim软件。
你可以继续在容器中做任何自己想做的事情。当所有工作都结束时,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。
这个容器现在怎样了?容器现在已经停止运行了!只有在指定的/bin/bash命令处于运行状态的时候,我们容器也才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。
但容器仍然是存在的,我们可以用docker ps -a命令查看当前系统中容器的列表
默认情况下,当执行docker ps命令时,只能看到正在运行的容器。如果指定-a标志,选项的话,那么docker ps命令会列出所有容器,包括正在运行的和已经停止的。
{提示}你也可以为docker ps命令指定-l标志,该选项会列出最后一次运行的容器,包括正在运行和已经停止的。
从该命令的输出结果中我们可以看到关于这个容器的很多有用信息:ID、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)。我们还可以看到,每个容器都有一个名称。
{注意}有三种方式可以指代唯一容器:短UUID(如f7cbdac22a02)、长UUID(如f7cbdac22a02e03ce54db9d20cfa2ac1fc872e74778)或者名称(如gray_cat)。
4 容器命名
Docker会为我们创建的每一个容器自动生成一个随机的名称。例如,上面我们刚刚创建的容器就被命名为gray_cat。如果想为容器指定一个名称,而不是使用自动生成的名称,则可以用--name标志来实现,如代码清单3-10所示。
代码清单3-10 给容器命名
$ sudo docker run --name bob_the_container -i -t ubuntu /bin/bash
root@aa3f365f0f4e:/# exit
上述命令将会创建一个名为bob_the_container的容器。一个合法的容器名称只能包含以下字符:小写字母a~z、大写字母A~Z、数字0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-])。
在很多Docker命令中,我们都可以用容器的名称来替代容器ID,后面我们将会看到。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如web、db)比容器ID和随机容器名好记多了。我推荐大家都使用容器名称,以更加方便地管理容器。
容器的命名必须是唯一的。如果我们试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。
5 重新启动已经停止的容器
bob_the_container容器已经停止了,接下来我们能对它做些什么呢?如果愿意,我们可以用下面的命令重新启动一个已经停止的容器,如代码清单3-11所示。
代码清单3-11 启动已经停止运行的容器
$ sudo docker start bob_the_container
除了容器名称,我们也可以用容器ID来指定容器,如代码清单3-12所示。
代码清单3-12 通过ID启动已经停止运行的容器
$ sudo docker start aa3f365f0f4e
{提示}我们也可以使用docker restart命令来重新启动一个容器。
这时运行不带-a标志的docker ps命令,就应该看到我们的容器已经开始运行了。
6 附着到容器上
Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们容器重新启动后会运行一个交互式会话shell。此外,我们也可以用docker attach命令,重新附着到该容器的会话上,如代码清单3-13所示。
代码清单3-13 附着到正在运行的容器
$ sudo docker attach bob_the_container
我们也可以使用容器ID,重新附着到容器的会话上,如代码清单3-14所示。
代码清单3-14 通过ID附着到正在运行的容器
$ sudo docker attach aa3f365f0f4e
现在,我们又重新回到了容器的Bash提示符,如代码清单3-15所示。
代码清单3-15 重新附着到容器的会话
root@aa3f365f0f4e:/#
{提示}你可能需要按下回车键才能进入该会话。
如果退出容器的shell,容器也会随之停止运行。
7 创建守护式容器
除了这些交互式运行的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。下面我们就来启动一个守护式容器,如代码清单3-16所示。
代码清单3-16 创建长期运行的容器
$ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c " sleep 1; done"
affe44a335b382c09a887aa9f95cbb7db3
我们在上面的docker run命令使用了-d参数,因此Docker会将容器放到后台运行。
我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。
通过组合使用上面的这些参数,你可以发现docker run命令并没有像上一个容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已,我们还是在主机的命令行之中。如果我们执行docker ps命令,可以看到一个正在运行的容器,如代码清单3-17所示。
代码清单3-17 查看正在运行的daemon_dave容器
CONTAINER ID IMAGE
PORTS NAMES
af ubuntu:14.04 /bin/sh -c 'while tr 32 secs ago
daemon_dave
8容器内部都在干些什么
现在我们已经有了一个在后台运行while循环的守护型容器。为了探究该容器内部都在干些什么,我们可以用docker logs命令来获取容器的日志,如代码清单3-18所示。
代码清单3-18 获取守护式容器的日志
$ sudo docker logs daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world
这里,我们可以看到while循环正在向日志里打印hello world。Docker会输出最后几条日志项并返回。我们也可以在命令后使用-f参数来监控Docker的日志,这与tail -f命令非常相似,如代码清单3-19所示。
代码清单3-19 跟踪守护式容器的日志
$ sudo docker logs -f daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world
{提示}可以通过Ctrl+C退出日志跟踪。
我们也可以跟踪容器日志的某一片段,和之前类似,只需要在tail命令后加入-f --lines标志即可。例如,可以用docker logs --tail 10 daemon_dave获取日志的最后10行内容。另外,也可以用docker logs --tail 0 -f daemon_dave命令来跟踪某个容器的最新日志而不必读取整个日志文件。
为了让调试更简单,我们还可以使用-t标志为每条日志项加上时间戳,如代码清单3-20所示。
代码清单3-20 跟踪守护式容器的最新日志
$ sudo docker logs -ft daemon_dave
[May 10 13:06:17.934] hello world
[May 10 13:06:18.935] hello world
[May 10 13:06:19.937] hello world
[May 10 13:06:20.939] hello world
[May 10 13:06:21.942] hello world
{提示}同样,可以通过Ctr+C退出日志跟踪。
9 查看容器内的进程
除了容器的日志,我们也可以查看容器内部运行的进程。要做到这一点,要使用docker top命令,如代码清单3-21所示。
代码清单3-21 查看守护式容器的进程
$ sudo docker top daemon_dave
该命令执行后,我们可以看到容器内的所有进程(主要还是我们的while循环)、运行进程的用户及进程ID,如代码清单3-22所示。
代码清单3-22 docker``top命令的输出结果
USER COMMAND
root /bin/sh - sleep 1; done
1123 root sleep 1
10 在容器内部运行进程
在Docker 1.3之后,我们也可以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开shell的任务,交互式任务是很实用的。下面我们先来看一个后台任务的例子,如代码清单3-23所示。
代码清单3-23 在容器中运行后台任务
$ sudo docker exec -d daemon_dave touch /etc/new_config_file
这里的-d标志表明需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令会在daemon_dave容器内创建了一个空文件,文件名为/etc/new_config_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。
我们也可以在daemon_dave容器中启动一个诸如打开shell的交互式任务,如代码清单3-24所示。
代码清单3-24 在容器内运行交互命令
$ sudo docker exec -t -i daemon_dave /bin/bashVersion:
和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。
{注意}docker exec命令是Docker 1.3引入的,早期版本并不支持该命令。对于早期Docker版本,请参考第6章中介绍的nsenter命令。
11 停止守护式容器
要停止守护式容器,只需要执行docker stop命令,如代码清单3-25所示。
代码清单3-25 停止正在运行的Docker容器
$ sudo docker stop daemon_dave
当然,也可以用容器ID来指代容器名称,如代码清单3-26所示。
代码清单3-26 通过容器ID停止正在运行的容器
$ sudo docker stop c2c4e57c12c4
{注意}docker stop命令会向Docker容器进程发送SIGTERM信号。如果你想快速停止某个容器,也可以使用docker kill命令来向容器进程发送SIGKILL信号。
要想查看已经停止的容器的状态,则可以使用docker ps命令。还有一个很实用的命令docker ps -n x,该命令会显示最后x个容器,不论这些容器正在运行还是已经停止。
12 自动重启容器
如果由于某种错误而导致容器停止运行,我们还可以通过--restart标志,让Docker自动重新启动该容器。--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器。
代码清单3-27是一个在docker run命令中使用—restart标志的例子。
代码清单3-27 自动重启容器
$ sudo docker run --restart=always --name daemon_dave -d ubuntu /
bin/sh -c " sleep 1; done"
在本例中,--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure``还接受``一个可选的重启次数参数,如代码清单3-28所示。
代码清单3-28 为on-failure指定count参数
--restart=on-failure:5
这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。
{注意}--restart标志是Docker1.2.0引入的选项。
13 深入容器
除了通过docker ps命令获取容器的信息,我们还可以使用docker inspect``来获得更多的容器信息,如代码清单3-29所示。
代码清单3-29 查看容器
$ sudo docker inspect daemon_dave
"ID": "c2c4e57c12c4cd64b20b5d784430bcbd0f",
"Created": "T11:49:01.Z",
"Path": "/bin/sh",
" sleep 1; done"
"Config": {
"Hostname": "c2c4e57c12c4",
docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
我们也可以用-f或者--format标志来选定查看结果,如代码清单3-30所示。
代码清单3-30 有选择地获取容器信息
$ sudo docker inspect --format='{{ .State.Running }}' daemon_dave
上面这条命令会返回容器的运行状态,示例中该状态为false。我们还能获取其他有用的信息,如容器IP地址,如代码清单3-31所示。
代码清单3-31 查看容器的IP地址
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' \
daemon_dave
172.17.0.2
{提示}--format或者-f标志远非表面看上去那么简单。该标志实际上支持完整的Go语言模板。用它进行查询时,可以充分利用Go语言模板的优势。
我们也可以同时指定多个容器,并显示每个容器的输出结果,如代码清单3-32所示。
代码清单3-32 查看多个容器
$ sudo docker inspect --format '{{.Name}} {{.State.Running}}' \
daemon_dave bob_the_container
/daemon_dave false
/bob_the_container false
我们可以为该参数指定要查询和返回的查看散列(inspect hash)中的任意部分。
{注意}除了查看容器,你还可以通过浏览/var/lib/docker目录来深入了解Docker的工作原理。该目录存放着Docker镜像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers目录下。
14 删除容器
如果容器已经不再使用,可以使用docker rm命令来删除它们,如代码清单3-33所示。
代码清单3-33 删除容器
$ sudo docker rm 1
{注意}需要注意的是,运行中的Docker容器是无法删除的!你必须先通过docker stop或docker kill命令停止容器,才能将其删除。
目前,还没有办法一次删除所有容器,不过可以通过代码清单3-34所示的小技巧来删除全部容器。
代码清单3-34 删除所有容器
docker rm `docker ps -a -q`
上面的docker ps命令会列出现有的全部容器,-a标志代表列出所有(all)容器,而-q标志则表示只需要返回容器的ID而不会返回容器的其他信息。这样我们就得到了容器ID的列表,并传给了docker rm命令,从而达到删除所有容器的目的。
在本章中我们介绍了Docker容器的基本工作原理。这里学到的内容也是本书剩余章节中学习如何使用Docker的基础。
本文摘自《第一本Docker书》
全球第一本Docker书
Docker公司前服务与支持副总裁力作!
全球第一本Docker技术图书!
学习Docker必备的第一本书!
购买入口:
ptpressitbooks二维码
程序员书屋公众号:programmer-book
程序员书屋QQ群:
联系我qq:
出版圈里混混一名,没事给大家推推技术书,分享分享第一手干货样章,偶尔来个赠书,发点福利。}

我要回帖

更多关于 12c 创建为容器数据库 的文章

更多推荐

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

点击添加站长微信