docker 网络不通用哪种网络方式比较好

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
【编者的话】Flux 7介绍了常用的8个Docker的真实使用场景,分别是简化配置、代码流水线管理、提高开发效率、隔离应用、整合服务器、调试能力、多租户环境、快速部署。我们一直在谈Docker,Docker怎么使用,在怎么样的场合下使用?也许本文可以帮到你。有需要交流的地方,可以通过评论与我们交流。
几周前我们参加了 ,Dockercon是首个以Docker为中心的技术大会。它面向开发者以及对在Docker开放平台上构建、交付、运行分布式应用感兴趣的从业者,不论这些开放平台是运行于自用笔记本上或者是数据中心的虚拟机上。我们参加了这次大会,Flux7是Docker基础的系统集成合作伙伴,同时也是演讲嘉宾。
我们的CEO Aater Suleman和我们的一位客户一同进行了演讲。虽然DockerCon大会十分有趣,但我觉得大会太关注Docker的具体细节,而忽略了Docker的使用场景。所以,在这篇文章中,我想介绍并分享一些Docker的实际应用案例。
在我们讨论Docker的使用场景之前,先来看看Docker这个工具有什么特别的地方吧。
Docker提供了轻量级的虚拟化,它几乎没有任何额外开销,这个特性非常酷。
首先你在享有Docker带来的虚拟化能力的时候无需担心它带来的额外开销。其次,相比于虚拟机,你可以在同一台机器上创建更多数量的容器。
Docker的另外一个优点是容器的启动与停止都能在几秒中内完成。Docker公司的创始人 Solomon Hykes曾经介绍过Docker在单纯的LXC之上做了哪些,你可以去看看。
下面是我总结的一些Docker的使用场景,它为你展示了如何借助Docker的优势,在低开销的情况下,打造一个一致性的环境。
1. 简化配置这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
2. 代码流水线(Code Pipeline)管理前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
3. 提高开发效率这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在 大会或者是DockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
4. 隔离应用有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的,文中将Google和亚马逊做了比较。
5. 整合服务器正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
6. 调试能力Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在的文章中找到这一点的例证。
7. 多租户环境另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
你可以在了解关于此场景的更多信息。
8. 快速部署在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。
你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。Vsa
原文链接:(翻译:钟最龙 审校:李颖杰)
&在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟&
博主好,我确实不太理解这段话的意思,感觉你在偷换一些概念或者把一些不同维度的东西拿来做比较。
你说引入新的硬件资源要消耗几天,要引入新的资源,肯定是资源不足,那才要引入新的硬件资源,这肯定是需要几天的,把机器装起来,操作系统,应用装起来。那你现在说Docker几分钟就好了,Docker 在没有新的机器的情况下就能新增资源来?它是状态固定的硬件上面的,还能凭空无故新加资源?我确实是困惑,不知道你能不能以一些具体的实例来说明下这个问题?
你好,这篇文章的翻译的,原文这里是:
Before VMs, bringing up a new hardware resource took days. Virtualization brought this number down to minutes. Docker, by creating just a container for the process and not booting up an OS, brings it down to seconds.
刚刚我发下这里翻译不太精准,所以改了一下:
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。
我个人认为这里原文的意思是一个应用上线之前,最初的时候给这个应用准备上线的环境,需要几天;后来有了虚拟机,这个时间只要几分钟;再后来,有了docker,只要几秒。应该跟资源不足没有关系,讲的只是给应用准备运行的环境。
Docker, by creating just a container for the process and not booting up an OS
这段中的process是不是翻译成“过程”更好呢?
process应该特指os里的一个进程。
要回复文章请先或
DockOne.io翻译编辑当前位置: →
Docker应用实践:一个简单的Java EE&Docker示例
学习Docker的最好办法就是迅速在工作中应用它,本文作者使用Docker部署了一个Java EE应用,非常简单和方便。需要注意的是,由于作者写作时本地网络有问题,所以Dockerfile中很多的资源都没有从网络下载,你再实践时,可以尝试修改。学习快乐 :)
本文中,我们将会把Java EE和Docker结合,具体内容如下:
创建、构建并运行一个Docker镜像;通过镜像启动一个Wildfly服务器,并部署了一个JavaEE示例应用;展示一些常用的Docker命令;启动多个容器,并让同一应用运行于不同端口。
在这里我不再介绍Docker,因为已经有太多的介绍性的文章。写本文之前,我阅读了如下教程:
Docker用户指南;使用Docker镜像;Docker终极指南(译者注:已翻译);Arun Gupta的技术技巧:#39、#57、#61和#65。
要完成本教程,你需要:
有一个运行于宿主机上的Docker后台进程安装Docker后,在etcdefaultdocker文件中添加一行:DOCKER_OPTS=&-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock此后重启机器并尝试运行这个命令:docker -H tcp://127.0.0.1:2375 &version,输出应该类似这样的:Docker version 1.4.1, build 5bc2ff8一个Wildfly 8.2.0的安装程序(解压后的);jdk-8u25-linux-x64.tar.gz文件。(/technetwork/java/javase/downloads/index.html)下载 car-service.war。(/rmpestano/javaee-docker-sample/blob/master/java_ee/car-service.war)下载 Dockerfile。(/rmpestano/javaee-docker-sample/blob/master/java_ee/Dockerfile)
创建Docker镜像
Docker镜像展现/描述了容器本身。由于我的网络带宽有限(手机3G),在这里我使用本机资源创建了一个镜像。因此,这个镜像只有在包含如下文件的目录下构建才能使用:
wildfly-8.2.0.Final:应用服务器car-service.war:要部署的应用Dockerfile:描述容器的文件jdk-8u25-linux-x64.tar.gz:要在容器里安装的java版本
注意:不推荐在Docker容器中使用本地资源,因为只有当所有文件都存在时镜像才可以正常构建。最好的办法是从头安装所有东西并下载必要的文件。
这是Dockerfile的内容:
FROM ubuntu MAINTAINER Rafael Pestano && setup WildFly COPY wildfly-8.2.0.Final /opt/wildfly install example app on wildfy COPY car-service.war /opt/wildfly/standalone/deployments/ setup Java RUN mkdir /opt/java COPY jdk-8u25-linux-x64.tar.gz /opt/java/ change dir to Java installation dir WORKDIR /opt/java/ RUN tar -zxf jdk-8u25-linux-x64.tar.gz setup environment variables RUN update-alternatives --install /usr/bin/javac javac /opt/java/jdk1.8.0_25/bin/javac 100 RUN update-alternatives --install /usr/bin/java java /opt/java/jdk1.8.0_25/bin/java 100 RUN update-alternatives --display java RUN java -version Expose the ports we're interested in EXPOSE
Set the default command to run on boot This will boot WildFly in the standalone mode and bind to all interface CMD [&/opt/wildfly/bin/standalone.sh&, &-c&, &standalone-full.xml&, &-b&, &0.0.0.0&]
镜像继承自Ubuntu&&一个安装了Ubuntu操作系统的镜像。Docker安装教程中就安装了Ubuntu镜像。
接着,我们将服务器复制到容器的/opt/wildfly目录。COPY是Dockerfile的一个指令。我们可以在这里找到所有命令。
我们随后将应用的war包复制到服务器中:
COPY car-service.war /opt/wildfly/standalone/deployments/。
然后,我们将Java解压安装到容器的/opt/java目录并设置一些环境变量。最好的办法是使用apt-get,不过这要求有互联网接入,而我写作时不具备这个条件。我使用RUN命令来执行java -version,(如果Java正确安装的话)它将在镜像构建时打印版本号。
之后,我使用EXPOSE 来告诉Docker容器要暴露的端口号。容器其实是镜像的实例,运行镜像(docker run)时,我们可以指定允许宿主访问的端口。
最后,我们指定了默认命令:CMD [&/opt/wildfly/bin/standalone.sh&, &-c&, &standalone-full.xml&, &-b&, &0.0.0.0&]。每次容器启动时都会运行这个命令。
在描述完镜像之后,我们需要构建它。在包含Dockerfile的父目录运行以下命令:
docker -H tcp://127.0.0.1:2375 build -t javaee_sample java_ee/ -H参数指定了Docker后台地址(使用TCP与后台通讯);build是命令本身;-t指定了用于识别镜像的标签名称(这里是javaee_sample);java_ee/是包含用于描述镜像的Dockerfile的目录。
上述命令的输出如下:
然后我们可以通过列出镜像命令(译者注:docker images命令)来确认刚创建的镜像:docker -H tcp://127.0.0.1:2375 images:
使用这一命令启动容器:
docker -H tcp://127.0.0.1:2375 run -p
javaee_sample -p指定容器端口到主机端口的映射;run是命令本身;javaee_sample是镜像名。
容器启动过程中会输出Wildfly启动日志,这是因为我们将其设置为初始命令(CMD Dockerfile命令):
运行多个容器
我们可以实例化多个容器,因为它们的端口在宿主上不会发生冲突。我将再启动两个容器并将8080端口分别暴露为:
docker -H tcp://127.0.0.1:2375 run -p
javaee_sample docker -H tcp://127.0.0.1:2375 run -p
javaee_sample
要列出启动的容器,我们可以使用命令:docker -H tcp://127.0.0.1:2375 ps,这是输出结果:
rmpestano@rmpestano-ubuntu:~/docker /images$ docker -H tcp://127.0.0.1:2375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b javaee_sample:latest &/opt/wildfly/bin/st 27 seconds ago Up 27 seconds 9990/tcp, 0.0.0.0:/tcp suspicious_lovelace d javaee_sample:latest &/opt/wildfly/bin/st 28 seconds ago Up 28 seconds 9990/tcp, 0.0.0.0:/tcp loving_hopper 96e58eb65126 javaee_sample:latest &/opt/wildfly/bin/st 42 seconds ago Up 42 seconds 9990/tcp, 0.0.0.0:/tcp clever_cori
现在我们可以在浏览器中同时访问这三个应用:
你可以通过容器的ID或名字来停止容器:
docker -H tcp://127.0.0.1:2375 stop suspicious_lovelace
记住,在容器删除时所有数据将消失。请使用Docker卷来持久化数据。
原文链接:/article/146
关注官方微信
扫一扫分享本文到朋友圈
联系我们:
&(发送邮件时,请把#换成@)
投稿信箱:
&(发送邮件时,请把#换成@)
企业网版权所有用手机浏览
>> CIO加油站>Docker最大化实际项目价值的八个应用场景订阅:
Docker最大化实际项目价值的八个应用场景
摘要:在过去一年,行业和用户对Docker(既是一项技术又是一家公司)的认识大有提升。可以这么说,它是我在职业生涯中见过的发展最迅猛的技术,采用速度之快前所未有。
作者:来源:51CTO
日 10:22:38
在过去一年,行业和用户对Docker(既是一项技术又是一家公司)的认识大有提升。可以这么说,它是我在职业生涯中见过的发展最迅猛的技术,采用速度之快前所未有。
这项技术在一些重要企业已得到了采用,并得到了包括微软和谷歌在内的各大软件厂商的认可。这家公司获得了大笔资金,不惜投入巨额,通过研发来提高该技术的易用性,包括改进网络功能。2014年,Docker甚至投入了相当大的精力,打造正规的合作伙伴体系。
我所在公司Flux7是Docker的创始合作伙伴之一。之所以选择我们公司作为合作伙伴,是因为我们在将Docker实施到几个关键使用场合方面有着早期经验。
本文着重介绍了我认为的最佳使用场合,它们都基于第一手经验和反复试验。
Docker的主要好处
Docker提供了轻量级虚拟化技术,而开销几乎为零。这因此带来了一些颇有影响力的优点。
首先,你可以得益于Docker提供的额外一层抽象机制,没必要为开销而操心。下一大优点在于,你在单单一个机器上运行的容器数量比光借助虚拟化技术要多得多。
另一大影响就是,容器的构建和拆卸可以在短短几秒内完成。Docker常见问题解答(FAQ)全面介绍了Docker为传统容器增添的特性。
总之,Docker功能分为这几大类:
将应用程序便携式部署成单一对象,而不是进程沙箱;
以应用程序为中心,而不是以机器/服务器为中心;
支持容器自动化构建;
内置版本控制功能;
可重复使用的组件;
共享容器的公共注册中心;以及
借助已发布的API,建立日益庞大的工具生态系统。
在我看来,真正让Docker与众不同的特点在于分层文件系统以及将版本控制应用到整批容器的功能。能够跟踪、恢复和查看变更的好处众所周知;总的 来说,这也是软件开发方面一项备受欢迎、广泛使用的特性。Docker将同样这个概念扩展到了更高层面;整个应用程序及其所有依赖项都在单单一个环境中, 这是前所未有的。
Docker的主要使用场合
下面仅仅是几个使用场合,它们借助Docker这项支持性技术提供了一致的环境,而开销很小。
1. 简化配置
Docker倡导的主要使用场合是简化配置。虚拟机的一大优点在于,能够在你的基础设施上运行任何平台,虚拟机有自己的配置。
Docker提供了同样这项功能,却没有虚拟机的开销。它让你可以将环境和配置放入到代码中加以部署。同样的Docker配置还可以用在各种环境中。这将基础设施需求与应用程序环境分离开来。
可以自由地在多个IaaS/PaaS上运行应用程序,又不需要任何的额外改动,这是Docker可以帮助你实现的终极目标。
如今,从亚马逊到谷歌,每家IaaS/PaaS提供商都支持Docker。知名厂商纷纷看好Docker。现在,轮到你得益于同样这些选择了。
2. 代码流水线管理
前一种使用场合给代码流水线管理带来了重大影响。随着代码从开发人员的机器进入到生产环境,它在一路中要经历许多不同的环境。这每一个环境会略有差异。
从开发环境直到生产环境,Docker为应用程序提供了始终一致的环境,因而简化了代码开发和部署流水线。
Docker映像不可改变的特性以及易于构建,可以帮助你实现从开发环境直到生产环境,应用程序的运行环境都不发生变化。
3. 提高开发人员的生产力
这进而让Docker为提高开发人员的生产力这个使用场合带来了一些额外优势。想了解详细的例子,你可以参阅我在DockerCon 2014大会上的演讲。
在开发环境中,我们有两个彼此冲突的目标:
我们希望尽可能接近生产环境;以及
我们希望开发环境尽可能快速,以便交互式使用。
理想情况下,想实现第一个目标,我们就需要每个服务都在自己的虚拟机上运行,体现生产环境的应用程序是如何运行的。然而,我们又不想每当需要编译时总是需要互联网连接,总是添加远程工作带来的开销。
这时候,开销很低的Docker派得上用场。开发环境的内存容量通常很低;由于并不增加内存占用空间(使用虚拟机通常会增加内存占用空间),Docker可以轻松让几十个服务运行。
想实现第二个目标,为了提供快速反馈回路,我们使用Docker的共享卷,从容器的主机操作系统DD这是虚拟设备虚拟机(通常是Vagrant设 备),将应用程序代码提供给一个或多个容器。应用程序源代码则使用Vagrant的与主机操作系统(Windows、Mac或Linux)同步的文件夹, 提供给容器主机操作系统(Vagrant设备)。
这种方法有诸多好处。开发人员可以从他所选择的平台(Windows、Mac或Linux)编辑源代码,还能够立即查看变化,因为运行的应用程序使用同样的源代码,运行环境则在使用一个或多个Docker容器的Vagrant设备里面设置。
此外,这种方法可以帮助不是非常了解后端细节的前端工程师轻松使用全面的应用程序架构,致力于他感兴趣的方面,不需要操心设置或安装方面的烦心事。另外,它提供了一种机会,可以进一步探究后端系统在底层是如何工作的,以便更深入地了解整个架构。
不妨更深入地细述这种方法。我们谈论的Vagrant设备可能是普通的操作系统发行版,它通过Vagrant文件(Vagrantfile)加以全 面配置。或者,它也可能是一个定制设备,在某种程度上进行了预先配置,然后我们在需要Vagrant时,可以使用Vagrant文件加以进一步配置。
如果你希望不依赖网络,构建一切都已预先配置好的定制设备是条出路。这种方法的唯一缺点是,虚拟机设备很庞大,而且环境未更新过。
你想实现第一个目标(尽量缩小开发和生产的不一致)时需要考虑的另外一点是,制定一项策略来进行数据库转储,那样应用程序的各个部分都面面俱到。这 就好比我们在测试覆盖方面力争实现的。仅仅获得随机性子集并不是最佳解决办法。你需要一项策略,与你应用程序的所有相关特性相一致。
如果你可以获得完整的数据库转储,那也是一条出路。但在大数据盛行的当下,你几乎做不到这一点。你需要一个子集来处理或测试。
4. 应用程序隔离
可能有诸多原因让你到头来在同一个机器上运行多个应用程序。前面提到的提高开发人员的生产力就是这样一个例子。不过也有其他的使用场合。
值得考虑的几个此类使用场合包括:合并服务器以降低成本,或者逐步计划将整块式应用程序划分成几个分离的部分。
比如说,假设你需要运行两台REST API服务器,它们都使用flask框架。但每一台服务器使用版本略有不同的flash及其他此类依赖项。在不同的容器下运行这些API服务器提供了一种简单的出路,可以克服所谓的&依赖性地狱&(dependency hell)。
5. 服务器合并
就像使用虚拟机来合并多个应用程序一样,Docker的应用程序隔离功能可以合并多台服务器,以节省成本。然而,由于没有多个操作系统的内存占用空间,又能够在诸实例之间共享闲置未用的内存,Docker提供的服务器合并效果比借助虚拟机所能实现的好得多。
新一代灵活定制的平台即服务(PaaS,比如Heroku、Elastic Beanstalk和App Engine)都使用容器的这些强大功能,现在有了Docker,这些功能触手可及。
此外,Deis、Kubernetes、Cadvisor、Panamax及其他开源项目使得部署和监控代表多层应用程序架构的大量容器易于管理。
6. 调试功能
Docker提供了未必是容器所特有的许多工具,但是它们与容器概念很搭。它们还提供了极其有用的功能。这包括:能够检查容器和容器版本,另外还能让两个容器有所不同。这在修复应用程序时大有用处。
<就在Docker容器里面运行。我们的Web开发人员告诉我们,一次崩溃的根源是他从用户界面推送到functions.php 文件的代码变更。我在短短一分钟内建立起了开发环境,让这位Web开发人员能够在沙箱里面进行调试。他稍后对我们表示一切OK后,我们就能切换回到网站的 最新版本,这要归功于Docker和Linux容器。
虽然这个过程可以使用另一种策略来解决,但是使用Docker却是解决这个问题的一种高效方法。另外,它也是我们实施在前端功能至关重要的许多客户部署环境的一种方法。
7. 多租户模式
不过Docker另一种值得关注的使用场合是,它可以用在多租户应用程序中,因而避免了对应用程序进行重大改写。
我们自身的例子就是,为一款物联网应用程序开发便捷的多租户架构。这种多租户应用程序的代码库要复杂得多,缺乏灵活性,难以处理。重新设计应用程序的架构不仅耗费时间,还耗费大量钱财。
使用Docker,就很容易为每个用户建立用来运行应用程序层多个实例的隔离环境,而且成本低廉。这之所以有可能,是由于Docker环境可以迅速 构建,另外由于易于使用的API,我们可以使用这些API,通过编程来启动容器。我们使用了docker-py,这个Python库有助于通过Web应用 程序界面,与Docker守护程序进行交互。
8. 快速部署
在虚拟机出现之前,配置新的硬件资源需要数天。虚拟化将这个时间缩短到了几分钟。Docker更是缩短到了短短几秒钟,因为它只需要为这个过程创建容器,并不启动操作系统。正是这项支持性技术,促使谷歌和Facebook使用容器。
实际上,你可以在数据中心里面创建和销毁资源,不用操心再次构建所需的成本。由于数据中心的利用率通常只在30%左右,很容易使用更积极地分配资源的方法,提高这个数字。另外,配置新实例的成本很低,允许更积极大胆地分配资源。
此外,Docker映像不可改变的特性让你吃下了定心丸:一切都将完全以之前的方式正常运行。
还有更多的使用场合表明Docker是一种合适的解决方案,包括从确保安全到助力开发人员,不一而足。本文着重介绍了我们认为给实际项目增添重大价值的使用场合。
从运行API服务器和Web应用程序,到运行采用计算统一设备架构(CUDA)的应用程序和功能完备的高清桌面云可视化(High Definition Desktop Cloud Visualization)DD你可以从运行中的容器里面使用GPU,Docker提供了一系列广泛的使用场合。Docker让Linux容器化技术易 于访问和易于使用,而且更重要的是,让这项技术易于管理。
对我们来说,使用Docker的动机总是在于使用适合某个项目的工具。最值得关注的方面在于业务理由,然后我们根据业务理由来构建系统。
(没有帐户?)
使用第三方帐号登录:
Docker相关文章IT管理相关文章
扫一扫,每天学点MBA
扫一扫,玩转营销
整体竞争力榜
云计算能力榜
最具人气榜
||||||||||||||||||| |
&&&&&&&&&&&&&&&
& CBS Interactive. All rights reserved.
北京智德典康电子商务有限公司(至顶网)版权所有.
京ICP证010391号 京ICP备号-159
京公网安备:
CBSi中国媒体1. 获取最近运行容器的id
这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境):
$&ID=$(docker&run&ubuntu&echo&hello&world)
hello&world
$&docker&commit&$ID&helloworld
fd08a884dc79
这种方式在编写脚本的时候很有用,比如你想在脚本中批量获取id,然后进一步操作。但是这种方式要求你必须给ID赋值,如果是直接敲命令,这样做就不太方便了。 这时,你可以换一种方式:
$&alias&dl=&docker&ps&-l&-q&
$&docker&run&ubuntu&echo&hello&world
hello&world
$&docker&commit&`dl`&helloworld
fd08a884dc79
docker ps -l -q命令将返回最近运行的容器的id,通过设置别名(alias),dl命令就是获取最近容器的id。这样,就无需再输入冗长的docker ps -l -q命令了。通过两个斜引号&,可以获取dl命令的值,也就是最近运行的容器的id。
2.尽量在Dockerfile中指定要安装的软件,而不用Docker容器的shell直接安装软件
说实话,我有时候也喜欢在shell中安装软件,也许你也一样,喜欢在shell中把所有软件安装都搞定。但是,搞来搞去,最后还是发现,你还是需要在Doockerfile中指定安装文件。在shell中安装软件,你要这样做:
$&docker&run&-i&-t&ubuntu&bash&
root@db0c3967abf8:/
然后输入下面的命令来安装文件:
apt-get&install&postgresql
然后再调用exit:
root@db0c3978abf8:/
退出docker容器,再给docker commit命令传递一个复杂的JSON字符串来提交新的镜像:
$&docker&commit&-run=&{&Cmd&:[&postgres&,&-too&-many&-opts&]&}&&`dl`&postgres
太麻烦了,不是吗?还是在Dockerfile中指定安装文件吧,只要两个步骤:
1.在一个小巧的Dockerfile中,指定当前操作的镜像为FROM命令的参数
2.然后在Dockerfile中指定一些docker的命令,如CMD,&ENTERPOINT,&VOLUME等等来指定安装的软件
3.超-超-超级用户
你可能需要一直用超级用户来操作docker,就像早期示例里一直提示的:
$&sudo&groupadd&docker
$&sudo&gpasswd&-a&myusername&docker
$&sudo&service&docker&restart
Wow!连续三个sudo!三次化身&超级用户&,真可谓是&超-超-超级用户&啊!别担心,设置完毕,以后你就再也不用打那么多sudo了!
4. 清理垃圾
如果你想删除所有停止运行的容器,用这个命令:
$&docker&rm&$(docker&ps&-a&-q)
顺便说一句,docker ps命令很慢,不知道为啥这么慢,按理说Go语言是很快的啊。docker ps -a -q命令列出所有容器的id,然后根据id删除容器。docker rm命令遇到正在运行的容器就会失效,所以这个命令完美的删除了所有没在运行的容器。
5. docker inspect输出结果的解析利器:jq
要对docker inspect的输出结果进行过滤,一般情况下,用grep命令,你需要这样操作:
$docker&inspect&`dl`&|&grep&IPAddress&|&cut&-d&&&&&-f&4&172.17.0.52
哦!看上去很复杂,用jq吧,专业解析docker inspect输出结果,具有更强的可读性,方便易用:
$docker&inspect&`dl`&|&jq&-r&&.[0].NetworkSettings.IPAddress&&172.17.0.52
其中第一个&.&代表所有的结果。&[0]&代表数组的第一个元素。就像JavaScript访问一个JSON对象一样,简单方便。
6.镜像有哪些环境变量?
有时候,你需要知道自己创建的镜像有哪些环境变量。简单!只要这样:
$&docker&run&ubuntu&env
输出结果如下:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
container=lxc
HOSTNAME=5e
调用env查看环境变量,对于后面要讲到的&链接&(-link)很有用,在连接两个容器时候需要用到这些环境变量,具体请看最后一个要点&链接&。
7.RUN命令 vs CMD命令
Docker的新手用户比较容易混淆RUN和CMD这两个命令。&RUN命令在构建(Build)Docker时执行,这时CMD命令不执行。CMD命令在RUN命令执行时才执行。我们来理清关系,假设Dockerfile内容如下:
FROM&thelanddownunder
MAINTAINER&crocdundee
我们要向系统中安装一些软件,那么:
RUN&apt-get&update
RUN&apt-get&install&softwares
CMD&[&softwares&]
Build时执行RUN,RUN时执行CMD,也就是说,CMD才是镜像最终执行的命令。
8.CMD命令 vs ENTRYPOINT命令
又是两条容易混淆的命令!具体细节我们就不说了,举个例子,假设一个容器的Dockerfile指定CMD命令,如下:
FROM&ubuntu
CMD&[&echo&]
另一个容器的Dockerfile指定ENTRYPOINT命令,如下:
FROM&ubuntu
ENTRYPOINT&[&echo&]
运行第一个容器:
docker&run&image1&echo&hello
得到的结果:
运行第二个容器:
docker&run&image2&echo&hello
得到的结果:
echo&hello
看到不同了吧?实际上,CMD命令是可覆盖的,docker
run后面输入的命令与CMD指定的命令匹配时,会把CMD指定的命令替换成docker
run中带的命令。而ENTRYPOINT指定的命令只是一个&入口&,docker
run后面的内容会全部传给这个&入口&,而不是进行命令的替换,所以得到的结果就是&echo hello&。
9.Docker容器有自己的IP地址吗?
刚接触Docker的人或许会有这样的疑问:Docker容器有自己的IP地址吗?Docker容器是一个进程?还是一个虚拟机?嗯&也许两者兼
具?哈哈,其实,Docker容器确实有自己的IP,就像一个具有IP的进程。只要分别在主机和Docker容器中执行查看ip的命令就知道了。
查看主机的ip:
$&ip&-4&-o&addr&show&eth0
得到结果:
2:&eth0&inet&162.243.139.222/24
查看Docker容器的ip:
$&docker&run&ubuntu&ip&-r&-o&addr&show&eth0
得到结果:
149:&eth0&&&inet&172.17.0.43/16
两者并不相同,说明Docker容器有自己的ip。
10.基于命令行的瘦客户端,使用UNIX Socket和Docker后台服务的REST接口进行通信
Docker默认是用UNIX socket通信的,一直到大概0.5、0.6的版本还是用端口来通信,但现在则改成UNIX socket,所以从外部无法控制Docker容器的内部细节。下面我们来搞点有趣的事情,从主机链接到docker的UNIX socket:
$&nc&-U&/&/var/run/docker.sock
连接成功后,输入:
GET&/images/json&HTTP/1.1
输入后连敲两个回车,第二个回车表示输入结束。然后,得到的结果应该是:
HTTP/1.1&200&OK
Content-Type:&application/json
Date:&Tue,&05&Nov&:09&GMT
Transfer-Encoding:&chunked
[{&Repository&:&postgres&,&Tag&:&......
有一天,我不小心把提交的名称打错了,名字开头打成&-xxx&(我把命令和选项的顺序搞混了),所以当我删除的时候出了问题,docker rm
-xxx,会把-xxx当成参数而不是镜像的名称。所以我只得通过socket直接连到容器来调用REST Server把错误的东西删掉。
11.把镜像的依赖关系绘制成图
docker images命令有一个很拉风的选项:-viz,可以把镜像的依赖关系绘制成图并通过管道符号保存到图片文件:
$&docker&images&-viz&|&dot&-T&png&-o&docker.png
这样,主机的当前路径下就生成了一张png图,然后,用python开启一个微型的HTTP服务器:
python&-m&SimpleHTTPServer
然后在别的机器上用浏览器打开:
http://machinename:8000/docker.png
OK,依赖关系一目了然!
(译者注:要使用dot命令,主机要安装graphviz包。另外,如果主机ip没有绑定域名,machinename换成主机的ip即可。)
12.Docker把东西都存到哪里去了?
Docker实际上把所有东西都放到/var/lib/docker路径下了。切换成super用户,到/var/lib/docker下看看,你能学到很多有趣的东西。执行下面的命令:
containers/&graph/&repositories&volumes/
可以看到不少目录,containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system
layer)存放在graph/imageid/layer路径下,这样你就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如
何一层一层叠加起来的。
13.Docker源代码:Go, Go, Go, Golang!
Docker的源代码全部是用Go语言写的。Go是一门非常酷的语言。其实,不只是Docker,很多优秀的软件都是用Go写的。对我来说,Docker源文件中,有4个是我非常喜欢阅读的:
commands.go
docker的命令行接口,是对REST API的一个轻量级封装。Docker团队不希望在命令中出现逻辑,因此commands.go只是向REST API发送指令,确保其较小的颗粒性。
REST API的路由(接受commands.go中的请求,转发到server.go)
大部分REST API的实现
buildfile.go
Dockerfile的解析器
有的伙计惊叹&Wow!Docker是怎么实现的?!我无法理解!&没关系,Docker是开源软件,去看它的源代码就可以了。如果你不太清楚Dockerfile中的命令是怎么回事,直接去看buildfile.go就明白了。
14.运行几个Docker后台程序,再退出容器,会发生什么?
OK,倒数第二个要点。如果在Docker中运行几个后台程序,再退出Docker容器,会发生什么?答案是:不要这么做!因为这样做后台程序就全丢了。
Dockerfile中用RUN命令去开启一个后台程序,如:
RUN&pg_ctl&start
这样的话,RUN命令开启的后台程序就会丢失。调用容器的bash连到容器的shell:
$&docker&run&-i&-t&postgresimage&bash
然后调用 ps aux查看进程,你会发现postgres的进程并没有跑起来。
RUN命令会影响文件系统。因此,不要再Dockerfile中用启动后台程序,要把后台程序启动成前台进程。或者,像一些高手提议的那样,写一个启动脚
本,在脚本中启动这些后台程序或进程。
15.容器之间进行友好沟通:链接
这是最拉风的功能!我把它留到最后压轴!这是0.6.5中最重要的新功能,我们前面已经提过两次了。运行一个容器,给它一个名称,在下面的例子中,我们通过-name参数给容器指定名称&loldb&:
$&docker&run&-d&-name&loldb&loldbimage
再运行另一个容器,加上-link参数来连接到第一个容器(别名为loldb),并给第二个容器也指定一个别名(这里用的是cheez):
$&docker&run&-link&/loldb:cheez&otherimage&env
顺便得到cheez的环境变量:
CHEEZ_PORT=tcp://172.17.0.8:6379
CHEEZ_PORT_1337_TCP=tcp://172.17.0.8.6379
CHEEZ_PORT_1337_TCP_ADDR=tcp://172.17.0.12
CHEEZ_PORT_1337_TCP_PORT=6379
CHEEZ_PORT_1337_TCP_PROTO=tcp
这样,我们就在两个容器间建立起一个网络通道(bridge),基于此,我们可以建立一个类似rails的程序:一个容器可以访问容器而不对外暴露其他接口。非常酷!数据库容器只需要知道第一个容器的别名(在本例中为cheez)和要打开的端口号。所以数据库容器也可以env命令来查看这个端口是否打开。
地址:/linux/13512.html
阅读(...) 评论()

我要回帖

更多关于 docker 容器 网络配置 的文章

 

随机推荐