容器在“基础设施即代码(Infrastructure as Code)”中有什么意义?php
一句话归纳的话,容器意味着一切。mysql
为何这么说呢?当你在比较单体应用和微服务时,必定会有一些权衡和取舍。一方面,从单体模型转移到微服务模型,可以将进程分离成独立的工做单元。这使得开发者们能够将注意力放在单一功能上,而且有助于测试和扩展。另外一方面,因为将全部的东西都分红了单独的服务,过去你只需管理一个单一部署单元的基础设施,如今你却必须管理每个服务的基础设施。正是为了应对这一挑战,“基础设施即代码”做为一个解决方案便诞生了。git
容器技术已经存在一段时间了,它以不一样的形式实现且已取得不一样程度的成功。这项技术从上世纪80年代初的chroot开始,并在以后带来了如Virtuozzo和Sysjail这样形式的产品。直到2013年Docker的诞生和其后的迅猛发展,一切才化零为整,才真正开始深入影响了应用程序在容器模型中的开发、测试和部署。sql
“基础设施即代码”的实践,和Docker容器一块儿,象征着一个最具颠覆性和创新性的改变,它影响了咱们今天开发和发布软件的过程。docker
在深刻探讨IaC及它和容器的关系以前,先看看IaC的具体含义吧。IaC指的是开发应用程序自己的同时,对硬件和操做系统需求的供应编写脚本的实践。一般,管理这些脚本的方式和软件代码库相似,包括版本控制和自动化测试。apache
当正确执行时,脚本将代替管理员登录新机器并进行配置。这些脚本描述了新机器的理想状态,并会执行必要的步骤来配置机器,以实现这一状态。ubuntu
IaC旨在利用系统配置来缓解最多见的痛点,特别是之前配置一个新环境一般须要花费大量的时间。每个环境都须要单独配置,且若是某处出现错误,一般需从新进行整个过程。IaC消除了这些痛点,并向开发者和运维人员提供了如下额外的便利:服务器
做为开发者,我想咱们都遇到过诸如“我不知道啊,反正它在个人机器上工做!”这样的状况。往好处说,这是一种诙谐有趣的说法;但往坏处说,它表明了咱们天天都要处理的一个很大的问题。Docker这一革新性的技术不只有效消除了开发者的这些担心,它还使得IaC在开发过程当中成为一个核心组件。app
为了更好地说明这一点,让咱们想象一个已经Docker化的Web应用,它有简单的UI界面。该应用将有一个相似于以下所示的Dockerfile,具体说明了包含该应用的容器的配置信息。运维
FROM ubuntu:12.04 # Install dependencies RUN apt-get update -y && apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql # Install app RUN rm -rf /var/www/* ADD src /var/www # Configure apache RUN a2enmod rewrite RUN chown -R www-data:www-data /var/www ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80 CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
若是你熟悉Docker,这是一个至关典型和简单的Dockerfile,你应该已经知道了它是什么。若是你不熟悉Dockerfile,那么能够理解为,这个文件将用于建立一个Docker镜像,它本质上是一个用来建立容器的模板。Docker容器建立完毕后,镜像将用于构建容器,因而一个自包含的应用程序就这么产生了。从开发工做站到高可用云集群,它能够在已经将其实例化的任何机器上使用。
咱们看一下文件中的几个关键参数,并看看它们在过程当中实现了什么:
FROM ubuntu:12.04
这一行是从Docker Hub中拉取一个Ubuntu Docker镜像,做为新容器的基础。Docker Hub是主要的Docker镜像在线仓库。若是你访问Docker Hub并在其中搜索这个镜像,你就能找到Ubuntu镜像仓库了。这是一个官方镜像,是由Docker支持的专门团队负责管理的。使用该镜像的好处是,当你的底层技术出现问题时,颇有可能已经有人开发出了修复补丁并实现了它,而且你所须要作的只是更新你的Dockerfile到新版本,重建你的镜像,并再一次测试和部署你的容器。
Dockerfile中剩下的几行将使用apt-get在基础镜像上安装各类软件包。将应用程序的源添加到/var/www目录,配置Apache,而后将容器的公开端口设置为端口80。
最后,当容器搭建好后运行CMD指令,这将初始化Apache服务器,打开它以接收http请求。
这是“基础设施即代码”最简单的形式。这就是它的所有。
此时,假如你已经在工做站上安装并运行Docker了,你能够从Dockerfile所在的目录中执行如下指令:
$ docker build -t my_demo_application:v0.1
Docker将为你构建镜像,将其命名为my_demo_application并加标签v0.1,v0.1实际是一个版本编号。镜像建立后,您可使用如下命令获取该镜像,并使用该镜像建立容器。
$ docker run -d my_demo_application:v0.1
就像这样,你就能够在本地机器上运行你的应用程序,或者在你选择的任何硬件上运行它。
一份简单的Dockerfile,能够检查你的源代码,指定应用程序的环境、配置和访问路径,这就是Docker和“基础设施即代码”的最简单形式。同时你可使用docker compose来定义多层次服务的组合应用,每一个服务都包含一个独立的Dockerfile或者导入Docker仓库的一个镜像。你还可使用docker compose的加强版本rancher compose,这是微服务部署利器,可让咱们更加便利得玩转rolling upgrade等高级特性。
9月27日,北京海航万豪酒店,容器技术大会Container Day 2017即将举行。
CloudStack之父、海航科技技术总监、华为PaaS部门部长、恒丰银行科技部总经理、阿里云PaaS工程总监、民生保险CIO······均已加入豪华讲师套餐!
11家已容器落地企业,15位真·云计算大咖,13场纯·技术演讲,结合实战场景,聚焦落地经验。免费参会+超高规格,详细议程及注册连接请戳