最常见的 Docker 使用方法(一)

259 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

容器化应用程序而不是将它们托管在虚拟机上是过去几年一直流行的概念,这也使得容器管理流行起来。Docker 处于这一转变的核心,它帮助企业无缝地采用容器化技术。近来,Docker 用例遍布所有行业,无论规模大小和性质。

什么是Docker?

Docker 是一种容器化技术,它使开发人员能够将服务及其依赖项、库和操作系统打包到容器中。通过将应用程序与基础架构分离,Docker 允许在各种环境中无缝部署和移动应用程序。 

Docker 使用以下步骤可以非常简单地创建和管理容器:

  1. 创建一个 Docker 文件并添加代码
  2. 基于 Dockerfile 构建 Docker 镜像
  3. 从 Docker 镜像创建一个正在运行的实例
  4. 按需扩展容器

什么是微服务?

传统意义上软件是使用单体架构开发的,其中整个软件是使用瀑布开发方法作为单个实体开发的。这些单体架构带来了规模、复杂性和可扩展性方面的挑战。微服务或微服务架构允许开发人员将应用程序分解为更小的独立单元,这些单元使用 REST API 相互通信,从而解决了这些挑战。通常,每个功能都可以开发为独立的服务,这意味着每个服务都可以独立运行而不影响任何其他服务。因此,组织可以加快发布周期、按需扩展操作并无缝更改代码,而无需应用程序停机。从单体架构迁移到微服务是一个流行的 Docker 用例。

什么是容器?

容器是微服务架构的一个典型用例。容器是一个标准的软件单元,它通过将应用程序与所有依赖项和所需资源打包在一起,将应用程序与其底层基础设施隔离开来。与虚拟化硬件层的虚拟机不同,容器仅虚拟化操作系统级别之上的软件层。

Docker 的业务优势

Docker 因其可移植性和生态系统而成为容器化的代名词。因此,你可以在任何环境(包括 VirtualBox、Rackspace 和 OpenStack)上无缝运行 Docker 容器。可扩展性是 Docker 的最大优势之一,通过在单个主机上部署多个容器,组织可以显著降低运营成本。此外,Docker允许在商用硬件上部署服务,从而减少了购买昂贵服务器的成本。

一、从单体架构到微服务架构

仅使用整体方法(瀑布模型)开发软件的日子已经一去不复返了,在这种情况下,整个软件是作为一个实体开发的。尽管整体架构有助于软件的构建、测试、部署和水平扩展,但随着应用程序变得越来越大,管理可能会成为一个挑战。任何功能中的任何错误都会影响整个应用程序。此外,进行简单的更改需要重写、测试和部署整个应用程序。因此,采用新技术并不灵活。 

另一方面,微服务将应用程序分解为多个独立的模块化服务,每个服务都拥有自己的数据库模式,并通过 API 相互通信。微服务架构适合支持 DevOps 的基础架构,因为它有助于持续交付。通过利用 Docker,组织可以轻松地将 DevOps 最佳实践整合到基础架构中,从而在竞争中保持领先地位。此外,Docker 允许开发人员轻松地与运营团队共享软件及其依赖项,并确保它在两端以相同的方式运行。例如,管理员可以使用开发人员使用 Dockerfile 创建的 Docker 镜像来暂存和更新生产环境。像这样,降低了构建和配置 CI/CD 管道的复杂性,从而可以更高级别地控制对基础设施所做的所有更改。负载均衡配置也变得更容易。

二、提高生产力

在传统的开发环境中,复杂性通常在于使用手动工作定义、构建和配置开发环境,而不会延迟发布周期。缺乏可移植性会导致应用程序出现不一致的行为。Docker 允许您使用 Docker 映像构建容器化开发环境,并轻松设置和使用开发环境,同时在其整个生命周期内提供一致的性能。此外,它还为开发环境中使用的所有工具、框架和技术提供无缝支持。 

其次,Docker 环境促进了自动化构建、自动化测试和 Webhooks。这意味着您可以轻松地将 Bitbucket 或 GitHub 存储库与开发环境集成,并从源代码创建自动构建并将它们移至 Docker 存储库。开发人员和 CI/CD 工具之间的连接工作流也意味着更快的发布。 

Docker 带有一个云管理的容器注册表,无需管理你自己的注册表,当您扩展底层基础设施时,这可能会变得昂贵。此外,配置的复杂性已成为过去。实施基于角色的访问允许不同团队的人员安全地访问 Docker 镜像。此外,Slack 集成允许团队在整个产品生命周期中无缝协作和协调。 

毫无疑问,Docker 提供加速开发、自动化工作流程和无缝协作,可以提高生产力。

三、基础架构即代码

微服务架构使你能够将软件分解为多个服务模块,从而使你能够单独处理每个功能。虽然这带来了可扩展性和自动化,但也有一个问题:它让你有数百个服务需要监控和管理。这时基础设施即代码(IaC)就可以派上用场了,它使你能够使用代码管理基础设施。基本上,它允许你使用配置文件为基础设施定义资源配置,并将基础设施转换为软件,从而利用 CI/CD 流程、自动化、可重用性和版本控制等软件最佳实践。 

Docker 将 IaC 带入 CI/CD 管道的开发阶段,因为开发人员可以使用 Docker-compose 构建使用多个服务的复合应用程序,并确保它在整个管道中一致地工作。IaC 是 Docker 用例的典型示例。

四、多环境标准化

Docker 为管道中的所有成员提供了一个生产对等环境。考虑一个软件开发团队正在发展的例子。当一个新成员加入团队时,每个成员都必须安装/更新操作系统、数据库、节点等。光是准备好机器就需要 1-2 天的时间。此外,确保每个人都获得相同的操作系统、程序版本、数据库版本、节点版本、代码编辑器扩展和配置也是一项挑战。 

例如,如果你为两个不同的程序使用两个不同版本的库,则需要安装两个版本。此外,应在执行这些程序之前指定自定义环境变量。现在,如果你在开发阶段对依赖项进行了某些更改而忘记在生产阶段进行这些更改怎么办?

Docker将所有需要的资源打包到一个容器中,并保证依赖之间没有冲突。此外,你可以监控破坏环境的未跟踪元素。Docker 标准化了环境,确保容器在整个 CI/CD 管道中以相似的方式工作。

五、松耦合架构

如今,在云和微服务架构的支持下,开发人员正在将应用程序分解成更小的单元,并轻松地将它们构建为松散耦合的服务,这些服务通过 REST API 相互通信。Docker 帮助开发人员将每项服务连同所需的资源打包到一个容器中,从而使其易于部署、移动和更新。

通信业界正在利用5G技术和Docker对软件定义网络技术的支持,构建松散耦合的架构。新的5G技术支持网络功能虚拟化,允许电信公司虚拟化网络设备硬件。因此,他们可以将每个网络功能划分和开发为一个服务,并将其打包到容器中。这些容器可以安装在商品硬件上,这使得电信消除了对昂贵硬件基础设施的需求,从而大大降低了成本。