如何让系统管理员和开发者认同 Docker

暂无读者喜欢。
Shipping containers stacked

Wikimedia Commons

Docker 作为应用程序容器管理系统的使用在短短两年内已成为开发者和系统工程师的标准实践。有些人喜欢说,自从 OpenSSH 以来,他们就没见过如此重大的技术进步。Docker 现在是一个主要的参与者,并在云系统架构中得到广泛应用。但不仅仅如此:Docker 知道如何赢得开发者的青睐。

让我们来看看我们使用 Docker 所做工作的一个概述,以及对未来和地平线上出现的竞争的评估。

那么 Docker 到底是什么?

Docker 是一种微容器管理工具,它使用 libcontainer。Docker 由 Solomon Hykes 用 Go 语言开发,于 2013 年开源,并迅速被主要客户采用。该工具的灵活性是一个游戏规则改变者。

在其出现之前,创建应用程序容器需要掌握相对高级的概念。LXC 已经开始占据大部分市场份额,给“纯虚拟化”解决方案带来了竞争压力。OpenVZ 和 Xen 也发挥了一些作用。但这些系统主要为服务器解决方案而设计,并且需要大量的配置工作。

明确一点:Docker 不是 LXC、OpenVZ 或 Xen 的替代品。它也不是像 KVM、VirtualBox 和 VMWare 那样的虚拟化解决方案。Docker 有另一种愿景,另一种操作方法,并且不服务于完全相同的目的。

像 OpenVZ、Xen 和 LXC 一样,Docker 使用 rootfs 原则,这只不过是一个根文件系统。它使用树结构作为远程系统的根目录(就像 chroot 会做的那样),并提供网络层和设置系统。但它也有其自身的差异。

首先,它的镜像和容器使用联合挂载文件系统(如 aufs、devicemapper 等)进行分层。一方面,这节省了磁盘空间,但同时也使得快速构建容器而无需复制整个根目录成为可能。

另一个区别是 Docker 避免了访客系统的初始化阶段。换句话说,容器的根目录仅用作目标应用程序的环境。

最后,Docker 标准配备了管理镜像版本注册表的能力。默认情况下,使用公共注册表。该注册表提供了大量的现成镜像(官方镜像或社区用户提交的镜像),以及可以付费提供的私有空间。理论上,Docker 与 Git 非常相似,其 Hub 可以比作像 GitHub 这样的服务。它还使用常见的概念,如提交、标签和远程注册服务器。

社区一直积极围绕该项目,提出了用于自动启动的工具(fig,现在的 Docker Compose)或用于简化云集成和管理流程的工具(CoreOS)、监控工具(cAdvisor)等等。

今天,Docker 正在席卷 IT 世界。OpenStack、Amazon、Google、CoreOS 等:他们都在研究这项技术,如果他们还没有将其与他们的基础设施集成的话。

但竞争正在到来!

方便系统

Docker 的主要吸引力无疑是其易于创建容器来管理 微服务。容器首先是一种完全隔离应用程序的方式。 благодаря своей библиотеке libcontainer, Docker 通过 cgroups 的管理来使用内存和进程隔离。

除非明确要求,否则 Docker 不会在主机上打开端口。如果两个容器需要通过 IP 层进行通信,它们可以链接在一起,以便这两个实例可以使用名称而不是 IP 地址进行通信(IP 地址在每次容器重启时可能会发生变化)。

云扩展

Docker 在云端变得非常流行,因为它使用的资源级别低、卷管理和联合挂载文件系统,从而减少了所需的磁盘空间。在研究 Docker 的工作原理时,你会意识到创建可扩展和/或高可用性系统非常简单。

“docker”命令实际上是一个简单的 REST 客户端,它与守护进程通信。默认情况下,服务(守护进程)创建一个 unix 套接字 (/var/run/docker.sock) 来提供 API。“docker”命令只是使用该 API。

API 可以用来监听事件,例如容器何时被创建、启动或停止。当您使用此 API 提供的信息时,您可以确定哪个容器正在运行哪个服务,在哪个端口上等等。

如果您不想或无法使用 CoreOS、OpenStack 等所需的结构,您或许可以相对容易地创建自己的架构和工具。API 相当容易访问且高效。

这是一个在我们的一个项目中使用的架构示例。

在这种安排中

  • 每个物理从服务器都有一个发现服务,监听 Docker 套接字。

  • 当容器启动或停止时,该服务将信息发送到主服务器。

然后,主服务器可以采取适当的措施,例如修改 nginx 服务器的配置,或删除/移除上游服务器。

另一种选择是更改 Docker 的配置,以便 API 可以通过 TCP 模式访问(使其网络可访问)。在这种特定情况下,一个小客户端连接到所有从服务器并监听它们的所有事件。否则,原理与上述相同:每个事件都将允许在 nginx 中添加或删除上游服务器(例如)。

这里的区别在于主服务器必须处理与所有从服务器的所有连接。前一种方法成本较低,因为是从服务器连接到主服务器。

在这两种情况下,主服务器都会在每次容器启动或停止时收到通知,并且可以修改主 nginx 服务器、重启容器或防止事件发生。

当然也可以设置两个主服务器来进行故障转移管理。该解决方案具有适应性且易于维护。

方便开发者

诚然,Docker 非常适合系统管理员。但它对于生产环境,即对于开发者来说,也可能非常有用。我们为一个客户使用的一个解决方案是 Dockerfiles 和 docker-compose 文件(用于检索 Docker 的 fig 项目)的组合

这个想法是定义开发者的工作站需要什么来运行项目,然后创建 Dockerfiles(如果需要)以符合约束条件的方式构建镜像,以及一个链接容器的 docker-compose.yml 文件。

然后,当使用版本控制服务器(Git、Mercurial、SVN 等)时,您只需设置项目目录以包含这些文件和项目的源代码,并指定要馈送到容器的卷。接下来,团队检索项目,启动服务所需的唯一命令是“docker-compose up”。

让我们以一个 Drupal 项目为例。可以使用两个容器

  • 一个 MySQL 容器;

  • 一个带有 Apache + PHP 模块的容器。

Drupal 的源代码被放置在“/src”中并发送到 Apache 容器。这是卷的原理:主机上的本地目录或文件可以附加到一个或多个容器中的特定目录。然后,您对 MySQL 存储目录执行相同的操作,以便不会丢失保存到数据库的记录。

例如,Dockerfile 可以是

FROM debian:7
MAINTAINER admin-dt@smile.fr

# 安装软件
RUN apt-get update && apt-get install apache2 php5 php5-mysql libapache2-mod-php5

# 启动 Apache
CMD /usr/sbin/apache2ctl -D FOREGROUND

以及 docker-compose.yml 文件

web
     dockerfile: .
     volumes
     - "./src:/var/www/drupal
     ports
      - "8080:80"
     links
      - "db"
db
     image: mysql
     volumes
     - "./data:/var/lib/mysql"

“web”服务链接到“db”(请参阅上面示例中的“links”指令),因此可以读取提供 MySQL 地址和端口的环境变量(在其 Dockerfile 中呈现)。

例如,在这里,“web”容器中可以访问以下变量

  • DB_PORT_3306_TCP_ADDR=172.17.1.24
  • DB_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 身份运行。这可能会被利用。

尽管 Docker 对这项技术显然具有吸引力,并使其能够创建当今最著名的云系统之一,但这实际上是 CoreOS 和其他公司对 Docker 的批评。Docker 需要 root 权限才能与 cgroups 接口。但是以 root 身份运行的服务可能会在系统中创建一个漏洞。

Docker 的开发团队做出了礼貌的回应。很明显,未来的升级将考虑到这个问题,并且任何纠正这些缺陷的建议(到目前为止,这些缺陷尚未造成任何特殊问题)都将受到关注。但不要惊慌:此漏洞被利用的可能性相对较低。迄今为止,唯一被利用的漏洞可以追溯到 2014 年的版本 (1.0),并且此后已被修复。

简而言之,CoreOS 决定创建自己的容器系统(可以使用 Docker 镜像),名为 Rkt(发音为“rock-it”)。但是,没有什么可以阻止您继续将 Docker 与 CoreOS 解决方案一起使用。Rkt 刚刚宣布,LinuxContainers(LXC 背后的伞形项目)就公布了与 Canonical 合作开发 LXD 的消息。

正如您所看到的,容器管理的一切都已就绪,尽可能靠近内核,从而使性能水平飙升。

随着时间的推移,容器正变得越来越必要。

但是 Windows 和 OS X 呢?对于 OS X,没有发布公告,也没有现有产品。因此,使用 boot2docker(为运行 Docker 而创建的虚拟机)是不可选的。Windows 现在也需要 boot2docker,尽管最近的一项公告暗示有可能看到容器在 Microsoft 的操作系统上运行。敬请期待...

结论

Docker 显然是一项适合开发和系统管理的技术。它在简化和性能方面的贡献,以及它的适应性,使得以以前无法实现的方式轻松设置服务成为可能。无论您的基础设施规模如何,Docker 都有适合您的选择。

但它的优势也可以用于生产。开发正变得标准化,开发者和系统之间的界限变得越来越模糊。接下来的版本将呈现多少演变,以及竞争将提供什么,仍有待观察。

就目前而言,Docker 仍然是该领域的王者。

User profile image.
我出生于 1980 年,自 2001 年以来一直担任工程师。自 2009 年以来,我一直是 Smile 的合作者,提供我在 PHP、Python、AngularJS、Go 和其他技术(包括 Linux、Nginx 和 Apache)方面的专业知识。

评论已关闭。

Creative Commons License本作品根据 Creative Commons 许可协议 授权。
© . All rights reserved.