原创

基于DevOps平台构建自己博客:6-Docker简介概念篇

温馨提示:
本文最后更新于 2022年11月15日,已超过 760 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

什么是 Docker?

Docker 容器是一种打包格式,它以标准格式打包应用程序的所有代码和依赖项,使其能够在计算环境中快速可靠地运行。Docker 容器是一种流行的轻量级、独立的可执行容器,它包含运行应用程序所需的一切,包括库、系统工具、代码和运行时。Docker 也是一个软件平台,允许开发人员快速构建、测试和部署容器化应用程序。

容器即服务 (CaaS) 或容器服务是管理容器生命周期的托管云服务。容器服务有助于编排(启动、停止、扩展)容器的运行时。使用容器服务,您可以简化、自动化和加速您的应用程序开发和部署生命周期。

Docker和容器服务已被迅速采用,并且在过去几年中取得了巨大的成功。从 2013 年几乎不为人知的技术性开源技术,Docker 已经发展成为一个标准化的运行时环境,现在正式支持许多 Oracle 企业产品。

Docker术语定义

Docker:

一个软件容器平台,专为利用容器技术开发、交付和运行应用程序而设计。Docker 有两个版本:企业版和社区版。

Container(容器):

与提供硬件虚拟化的 VM 不同,容器通过抽象“用户空间”来提供轻量级的操作系统级虚拟化。容器与其他容器共享主机系统的内核。在主机操作系统上运行的容器是一种标准软件单元,它打包代码及其所有依赖项,因此应用程序可以快速可靠地从一个环境运行到另一个环境。容器是非持久性的,并且是从图像中分离出来的。

Docker engine:

构建和运行容器的开源主机软件。Docker 引擎充当客户端-服务器应用程序,支持各种 Windows 服务器和 Linux 操作系统上的容器,包括Oracle Linux、CentOS、Debian、Fedora、RHEL、SUSE 和 Ubuntu。

Docker image(Docker镜像):

作为容器运行的软件集合,其中包含一组用于创建可在 Docker 平台上运行的容器的指令。镜像是不可变的,对镜像的更改需要构建一个新镜像。

Docker Registry:

存储和下载镜像的地方。Registry是一个无状态且可扩展的服务器端应用程序,用于存储和分发Docker 映像

谁在使用Docker?

Docker 是一个开放的应用程序开发框架,旨在让 DevOps 和开发人员受益。使用 Docker,开发人员可以轻松地将应用程序构建、打包、发布和运行为轻量级、可移植、自给自足的容器,这些容器几乎可以在任何地方运行。容器允许开发人员打包应用程序及其所有依赖项并将其部署为一个单元。通过提供预建和自持的应用容器,开发人员可以专注于应用代码和使用,而无需担心底层操作系统或部署系统。

此外,开发人员可以利用已经设计为在 Docker 容器中运行的数千个开源容器应用程序。对于 DevOps 团队来说,Docker 有助于持续集成和开发工具链,并减少其系统架构中部署和管理应用程序所需的约束和复杂性。随着容器编排云服务的引入,任何开发人员都可以在其开发环境中本地开发容器化应用程序,然后在云服务(例如托管 Kubernetes 服务)上迁移和运行这些容器化应用程序。

Docker与Kubernetes

Linux 容器自 2008 年就已经存在,但直到 2013 年 Docker 容器的出现才广为人知。随着 Docker 容器的出现,人们对开发和部署容器化应用程序的兴趣激增。随着容器化应用程序的数量增长到跨越部署在多个服务器上的数百个容器,操作它们变得更加复杂。您如何协调、扩展、管理和安排数百个容器?这就是Kubernetes可以帮忙的了。Kubernetes 是一个开源编排系统,允许您运行 Docker 容器和工作负载。它可以帮助您在移动以扩展跨多个服务器部署的多个容器时管理操作复杂性。Kubernetes 引擎自动编排容器生命周期,将应用程序容器分布在托管基础设施中。Kubernetes 可以根据需求快速扩展或缩减资源。它持续提供、调度、删除和监控容器的健康状况。

Docker基础

Docker 的核心概念是镜像和容器。Docker 映像包含运行软件所需的一切:代码、运行时(例如,Java 虚拟机 (JVM)、驱动程序、工具、脚本、库、部署等。

Docker 容器是 Docker 映像的运行实例。但是,与使用 1 类或 2 类管理程序的传统虚拟化不同,Docker 容器运行在主机操作系统的内核上。在 Docker 映像中没有单独的操作系统,如图所示:

隔离与虚拟化

每个 Docker 容器都有自己的文件系统、自己的网络堆栈(因此也有自己的 IP 地址)、自己的进程空间以及定义的 CPU 和内存资源限制。由于 Docker 容器不必启动操作系统,它会立即启动。Docker 是关于隔离,即分离主机操作系统的资源,与虚拟化相反,即在主机操作系统之上提供客户操作系统。

增量文件系统

Docker 镜像的文件系统是分层的,具有写时复制语义。这支持继承和重用,节省磁盘资源,并支持增量图像下载。

如图所示,具有 WebLogic 部署的 Docker 映像可以基于具有 Oracle WebLogic Server 域的映像,该域可以基于 WebLogic 映像,该 WebLogic 映像基于 Java 开发工具包 (JDK) 映像,在turn 基于 Oracle Linux 基础映像。

Docker 注册表

虽然 Docker 映像易于构建,并且开发人员喜欢 Docker 映像的简单性和可移植性,但他们很快发现管理数千个 Docker 映像非常具有挑战性。Docker Registry 解决了这一挑战。Docker Registry 是存储和分发 Docker 镜像的标准方式。Registry 是一个基于开放源代码的存储库,在宽松的 Apache 许可下。

Docker Registry 还有助于改进存储在其存储库中的 Docker 映像的访问控制和安全性。它管理图像的分发,还可以与应用程序开发工作流集成。开发人员可以设置自己的 Docker Registry,或者使用托管的 Docker Registry 服务,例如 Docker Hub、Oracle Container Registry、Azure Container Registry 等。

Docker Hub 是由 Docker 管理的托管 Docker 注册表。Docker Hub 拥有来自软件供应商、开源项目和社区的超过 100,000 个容器镜像。Docker Hub 包含来自官方存储库的软件和应用程序,例如 NGINX、Logstash、Apache HTTP、Grafana、MySQL、Ubuntu 和 Oracle Linux。

启动容器时,如果本地不可用,Docker 默认会自动从公共 Docker Hub 中拉取相应的镜像。此外,您还可以创建自己的映像并将它们推送到 Docker Hub 到公共或私有存储库中。

Docker 作为微服务运行时

如今,将单体应用程序切割成更小的微服务块的想法在软件开发人员中引起了很多关注。

微服务作为一个进程独立部署,使用轻量级协议相互通信,每个服务都拥有自己的数据5。由于微服务遵循去中心化治理方法,它们需要相当多的基础设施自动化、自动化测试、全自动 CD 管道以及熟练、敏捷的 DevOps 团队。

关于这种架构风格仍有很多讨论,但如果假设分解为微服务的应用程序可以简单地作为一组进程运行,那就太天真了。仅举几个要求,微服务需要独立于主机,并且在操作系统级别上隔离。它必须在其资源限制内运行,必须按比例放大和缩小,如果失败则重新启动,并通过软件定义的网络层发现并连接到其他微服务。

因此,在 Docker 容器中运行微服务会让您处于实现大部分目标的绝佳起点。

Docker——两个关键维度

Docker 从两个不同的维度改变了我们构建、发布和运行软件的方式:

  • 它增强了从开发到生产可靠地获取应用程序的过程。
  • 它提供了从本地到云端的标准图像格式。

在以下段落中更详细地解释了这两个维度。

Docker 镜像——从开发到生产

创建一个包含所有依赖项的 Docker 映像解决了“但它在我的开发机器上对我有用”的问题。关键思想是 Docker 映像是由来自 Git 等源代码存储库的构建管道自动创建的,并最初在开发环境中进行测试。然后,这个不可变的图像将存储在 Docker 注册表中。

如图 所示,相同的图像将用于进一步的负载测试、集成测试、验收测试等。在每个环境中,都将使用相同的图像。小的但必要的环境特定差异,例如生产数据库的 JDBC URL,可以作为环境变量或文件输入到容器中。

统计数据显示,目前所有 Docker 用例中有 65% 处于开发阶段,48% 使用 Docker 进行持续集成。

Docker云

Docker 改变了公共云的采用:一方面,通过 Docker 镜像,历史上第一次出现了可以在本地以及每个主要云提供商上运行的通用包格式。Docker 容器在我的笔记本电脑上的运行方式与它们在 Oracle 云上的运行方式相同。

另一方面——由于 Docker 容器在每个主要的公共云上运行——它们为克服长期以来对公共云的偏见做出了重大贡献:供应商锁定。现在每个主要的云提供商都将 Docker 作为 PaaS 提供。

Docker版本——底层技术的成熟度

Docker 发布的速度远快于传统企业软件的发布周期。有时,Docker 发布的速度之快,加上 Docker 项目的新颖性,会引发对 Docker 安全性和稳定性的担忧。

尽管 Docker 及其命令行、Docker 守护进程、其 API 以及 Docker Swarm、Docker Machine 和 Docker Compose 等工具仅在过去三年中发展,但近十年来,每个 Linux 内核都可以使用底层内核功能.

早期采用容器技术的一个突出例子是谷歌。甚至在 Docker 出现之前,谷歌就一直在使用 Linux 容器。此外,谷歌在一个容器中运行一切。据估计,谷歌每周启动 20 亿个容器。

Cgroups 和Namespaces历史

Docker 使用的底层 Linux 内核特性是 cgroups 和命名空间。2008 年,基于 Google 开发人员1所做的工作,cgroups 被引入 Linux 内核。Cgroups 限制和说明一组操作系统进程的资源使用情况。

Linux 内核使用命名空间来隔离进程的系统资源。第一个命名空间,即挂载命名空间,早在 2002 年就引入了。

容器云服务

本文的第一部分解释了一些重要的 Docker 概念。但是,在生产环境中,仅仅在 Docker 容器中运行应用程序是不够的。

要设置和操作生产环境,需要硬件来运行容器。必须安装、升级和修补 Docker 等软件以及存储库和集群管理器。如果多个 Docker 容器跨主机通信,则必须创建一个网络。如果集群容器失败,则应重新启动它们。此外,一组相互链接的容器应该像单个逻辑应用程序实例一样容易部署。这方面的一个示例可能是负载平衡器、一些 Web 服务器、一些带有管理服务器、托管服务器和数据库的 Oracle WebLogic Server 实例。要大规模管理容器化应用程序,需要像 Kubernetes 或 Docker Swarm 这样的容器编排系统。部署、管理和操作 Kubernetes 等编排系统可能具有挑战性且耗时。

为了让开发人员更轻松、更高效地创建容器化应用程序,云提供商提供了容器云服务或容器即服务 (CaaS)。容器云服务可帮助开发人员和运营团队以自动化方式简化和管理容器的生命周期。这些编排服务通常使用 Kubernetes 构建,使 DevOps 团队能够更轻松地大规模管理和操作容器化应用程序。Oracle Container Engine for Kubernetes 和 Azure Kubernetes Service 是流行的容器编排托管云服务的两个示例。

正文到此结束
本文目录