当前位置: 首页 > 科技观察

如何让Docker得到开发者和系统管理员的认可

时间:2023-03-20 21:29:56 科技观察

近两年使用Docker作为应用容器管理系统已经成为很多开发者和系统工程师的标准做法。甚至有朋友说,容器方案是自OpenSSH以来最令人印象深刻和最值得肯定的技术飞跃。Docker已经成为技术领域当之无愧的新生力量,广泛应用于各种云系统架构中。然而,除此之外,Docker还需要了解如何赢得开发人员的芳心。接下来,我们将了解Docker的发展历史,未来我们将面临的竞争态势,以及发展前景的预测。那么,Docker到底是什么?Docker是一个使用libcontainer的微容器管理工具。作为SolomonHykes使用Go语言开发的项目,Docker在2013年开源,并迅速应用于多个领域。该工具出色的灵活性甚至使其成为游戏规则的改变者。在Docker出现之前,创建一套应用容器需要掌握各种比较高级的概念。LXC在该领域占据了相当大的市场份额,其卖点是提供“纯虚拟化”的解决方案并从中获利。OpenVZ和Xen在市场上也有一定的地位。然而,这些系统在设计上仍然主要是面向服务器的解决方案,需要进行相当程度的配置工作。这里我们要澄清一点:Docker的作用不是要取代LXC、OpenVZ或Xen。它也不是像KVM、VirtualBox和VMware那样的虚拟化解决方案。Docker有自己的定位视角、独特的运行方式和完全不同的功能起点。与OpenVZ、Xen、LXC一样,Docker也采用了rootfs原理——这其实就是根文件系统。它使用树结构作为远程系统的根(类似于chroot的作用),同时提供网络层和设置系统。但它也有一些自己独特的设计。首先,它的镜像和容器是通过联合挂载文件系统(比如aufs和devicemapper等)分层的。这样一方面可以节省磁盘存储空间,另一方面可以帮助我们快速搭建容器环境,无需复制整套root。另一个很大的区别是Docker避免了来宾系统中的初始化步骤。也就是说,容器的根只会作为指定应用的运行环境。最后,Docker具有注册和控制镜像版本的能力,这是其标准化的一个重要标志。默认情况下,Docker将使用公共注册表。注册中心提供了多套即用型镜像(包括官方提供的官方镜像,以及社区用户提交的镜像),也为后续支付提供了实现空间。理论上,Docker在很大程度上类似于Git,它的Hub类似于GitHub等服务解决方案。Docker还使用常见的概念,例如提交、标记和远程注册表服务器。围绕Docker项目建立的技术社区非常活跃,提供了大量的自动启动工具(fig,现在是DockerCompose),简化的云集成和管理流程(CoreOS),以及监控任务(cAdvisor)。工具列表在不断扩展。如今,Docker已经席卷了整个IT领域。OpenStack、亚马逊、谷歌、CoreOS等都在密切关注这一技术成果,甚至将其整合到自己的基础设施中。然而,激烈的市场竞争即将来临!提高系统的便利性Docker的主要诉求无疑是简化容器的创建过程,从而更方便地实现微服务架构管理。首先要强调的是,容器本身其实就是一种完全隔离应用的手段。得益于其libcontainer库,Docker始终可以在整个cgroup管理过程中实现内存和线程的完全隔离。除非用户另有说明,否则Docker不会打开主机设备上的任何端口。如果两套容器系统需要通过IP层进行通信,则可以相互通信,从而直接使用容器名称而不是IP地址来实现信息交互(因为IP地址可能会随着容器的重启而变化).#p#CloudscalingDocker在云环境中获得了很高的人气,主要是由于其极低的运行资源需求、出色的卷管理,以及可以显着降低磁盘存储空间需求的联合挂载文件系统。在研究Docker的运行机制的过程中,你会发现我们可以很容易地利用它来创建一个可伸缩和/或高可用性的系统解决方案。“docker”命令实际上是一个简单的REST客户端,旨在与守护进程进行通信。默认情况下,服务(守护进程)将创建一个unix套接字(位于/var/run/docker.sock)以提供API。而“docker”命令将只使用该API。此API可用于侦听各种事件,包括何时创建、启动或停止容器。通过API提供的信息,你可以很容易的知道哪个容器系统当前运行了哪个服务,使用了哪个端口。如果您不打算或没有能力使用所需的架构,如CoreOS、OpenStack等,那么您可以创建自己的架构和工具——而且整个过程并不困难。API相当容易访问并且非常高效。让我们看一下我们当前项目中的架构示例:我们采用以下规划方式:每个物理从服务器都配备了一个侦听Dockers套接字的发现服务。该服务在容器系统启动或停止时向主服务器发送信息。然后主服务器可以采取适当的行动,例如修改nginx服务器配置或删除/删除上游服务器等。另一种选择是修改Docker的配置,以便API可以以TCP方式访问(即使它具有网络访问权限)).在这种特殊情况下,小客户端能够与所有从属服务器对话并监听它们上发生的所有事件。但这种方式的基本原理还是一样的:每个事件都会让管理员在nginx中添加或删除一个上游服务器(假设使用了nginx)。两者的区别在于,这里主服务器必须处理所有从服务器的所有连接。前一种方法运行成本较低,因为所有从服务器都连接到主服务器。在这两种情况下,主服务器可以在每个容器系统启动或停止时得到通知,并可以修改主nginx服务器,重启容器,或者避免意外。当然我们也可以同时设置两台master服务器来实现failover管理。该方案完全可行且易于维护。开发者的便利毫无疑问,Docker非常适合系统管理员。但除此之外,它还可以在生产过程中发挥重要作用,即对开发人员而言。我们曾经给客户提供的一套解决方案结合了Dockerfile和docker-compose文件(通过Docker获取fig项目)。思路是首先定义开发者工作站运行项目所需要的必备条件,然后创建一个Dockerfile(如果需要的话)来构建一个有针对性的镜像解决方案,同时将一个docker-compose.yml文件连接到这些容器.之后,在使用版本控制服务器(如Git、Mercurial、SVN等)时,可以方便地设置项目目录,将这些文件和项目源代码添加到其中,并指定要使用的存储分区容器。卷。接下来,技术团队可以检索项目并使用“docker-composeup”来启用服务。我们以一个Drupal项目为例,我们将使用两个容器系统:一个MySQL容器和一个包含Apache加PHP模块的容器Drupal的源代码在“/src”下轮流发送到Apache容器。而这就是分卷的基本原理:宿主机上的一个本地目录或文件可以连接到特定目录下的一组或多组容器。之后就可以用同样的方法处理MySQL的存储目录,以免数据库中存储的记录丢失。下面是Dockerfile内容的例子:FROMdebian:7MAINTAINERadmin-dt@smile.fr#InstallsoftwareRUNapt-getupdate&&apt-getinstallapache2php5php5-mysqllibapache2-mod-php5#StartApacheCMD/usr/sbin/apache2ctl-DFOREGROUND接下来是docker-compose.yml的例子文件内容:web:dockerfile:.volumes:-"./src:/var/www/drupalports:-"8080:80"links:-"db"db:image:mysqlvolumes:-"./data:/var/lib/mysql"其中"web"服务链接到"db"(见上例中的'links'命令),因此它可以读取提供MySQL地址和端口的各种环境变量(由Dockerfile提供).#p#例如,在“web”容器中可以访问到以下变量:DB_PORT_3306_TCP_ADDR=172.17.1.24DB_PORT_3306_TCP_PORT=3306你当然可以使用其他容器名称,示例中的“web”和“db”代表的是名称两组容器中的设备。也就是说,地址“mysql://db”也是可以改变的。接下来,您需要修改Drupal配置文件以访问数据库,至此工作结束。该项目将具有以下结构:“data/”用于存储MySQL数据“src/”用于存放Drupal源代码“Dockerfile”用于创建Apache/PHP映像“docker-compose.yml”用于描述容器的启动方式为了使示例简单,我们没有提及Apache配置文件以及容器如何共享卷。综上所述,这套Web服务器的配置是可以随意修改的。您可能还会注意到绑定端口也得到了处理。由于开发者使用80端口不需要权限,我们使用本地8080端口映射Apache容器的80端口。开发者只需访问127.0.0.1:8080即可查看当前运行的Drupal实例。为了理解这个对接系统,请参考下图。竞争关系从目前的情况来看,Docker似乎是世界上唯一沐浴在赞誉中的容器技术成果。但是请记住,Docker使用libcontainer和cgroups,这意味着为了能够使用这些内核功能,服务必须以root身份运行。而这很可能会导致安全问题。这其实是CoreOS等类似解决方案批判Docker的主要焦点——但值得一提的是,这项技术确实很吸引人,而且它还支持CoreOS打造了最知名的云系统解决方案之一。Docker需要root权限才能访问cgroups,但是以root角色运行的服务确实容易造成系统安全漏洞。Docker的开发团队对此给出了礼貌的回应。显然,他们会在未来的版本升级中考虑这个问题,并欢迎任何解决这些缺陷的建议(尽管到目前为止,Docker还没有真正造成任何麻烦)。不过各位读者不要惊慌:该漏洞被实际利用的可能性很低。截至目前,该安全问题唯一一次出现是在2014年的1.0版本中,目前该问题已得到解决。总而言之,CoreOS决定创建自己的容器系统(能够使用Docker镜像),称为Rkt(发音像火箭,即“火箭”)。但就目前而言,大多数用户将继续在CoreOS解决方案之上使用Docker。就在Rkt刚刚发布的时候,LinuxContainers(LXC背后的大项目)也宣布了与Cannonical合作开发LXD的计划。可以看到,容器管理领域的一举一动都在尽可能地向内核靠拢,其结果是其性能水平会不断提升。随着时间的推移,容器的必要性变得越来越明显。但是Windows和OSX呢?对于OSX,目前还没有任何公告,更不用说有什么产品可供选择了。因此,使用boot2docker(一套专门运行Docker的虚拟机)就成了唯一的出路。Windows目前也需要依赖boot2docker,但微软最近在声明中指出,未来的微软操作系统将直接纳入容器机制。我们将看看结果如何……结语很明显,Docker是开发和系统管理工作的一项技术成就。它不断提供精简的效果和改进的性能水平,并结合良好的可行性,所有这些都使用户能够以高效的方式轻松构建服务。无论您的基础设施有多大,相信Docker可以帮助到每个人。此外,它的亮点也可以充分体现在制作过程中。现在的开发工作越来越规范,开发者和系统的界限越来越细。我们期待下一个版本的Docker的正式到来,并希望届时它将提供更具吸引力的竞争优势。就目前而言,Docker仍然是容器领域的唯一王者。原标题:如何让系统管理员和开发人员认同Docker