未找到结果

您的搜索操作未匹配到任何结果。

我们建议您尝试以下操作,以帮助您找到所需内容:

  • 检查关键词搜索的拼写。
  • 使用同义词代替键入的关键词,例如,尝试使用“应用”代替“软件”。
  • 请尝试下方显示的热门搜索之一。
  • 重新搜索。
热门问题

Docker 容器和容器云服务

容器是一种打包格式,可通过标准格式打包应用的所有代码和依赖关系,确保应用能够快速、可靠地在计算环境下运行。Docker 容器则是一种广受欢迎的轻量级、可执行的独立容器,其中包含应用运行所需的一切要素,包括库、系统工具、代码和运行时。此外,Docker 还是一个软件平台,支持开发人员快速构建、测试和部署容器化应用。

容器即服务 (CaaS) 或容器服务是一种用于管理容器生命周期的托管式云服务。它可以帮助您编排(启动、停止、扩展)容器运行时,简化、加速并实现应用开发与部署生命周期自动化。

在过去几年里,Docker 和容器服务得到了快速采用,取得了巨大的成功。如今,Docker 这一开源技术已从 2013 年的几乎无人知晓发展成了一种标准化运行时环境,已正式支持众多 Oracle 企业级产品。

哪些人使用 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 映像中没有单独的操作系统(参见图 1)。

Docker 基础知识图像
图 1

隔离与虚拟化对比

每一个 Docker 容器都拥有自己的文件系统、网络体系(因此也拥有自己的 IP 地址)、进程空间以及面向 CPU 和内存定义的资源限制。同时,它不需要引导操作系统,可以即时启动。简而言之,Docker 的宗旨是隔离,即隔离主机操作系统的资源,虚拟化则是在主机操作系统上提供访客操作系统。

虚拟机 与 Kubernetes 对比 — 部署基础设施
增量文件系统图像
图 2

增量文件系统

Docker 映像的文件系统采用分层结构,具有写时复制语义。这不仅有助于继承和重用以及节约磁盘资源,还支持增量式映像下载。

如图 2 所示,具有 WebLogic 部署的 Docker 映像基于具有 Oracle WebLogic Server 域的映像运行,该映像之下依次是 WebLogic 映像、Java Development Kit (JDK) 映像和 Oracle Linux 基础映像。

Docker 注册表

Docker 映像易于构建,其简单性和可移植性深受开发人员喜爱。然而,管理数千个 Docker 映像是一项极具挑战的任务。Docker 注册表可以解决这一问题。它是一种存储和分发 Docker 映像的标准方法,是一个获得了宽松式 Apache 许可的开源存储库。

Docker 注册表还可以优化其存储库中存储的 Docker 映像的访问控制和安全性。它可以管理映像分发,还可以与应用开发工作流集成。在实际应用中,开发人员可以构建自己的 Docker 注册表,也可以使用托管式 Docker 注册表服务,例如 Docker Hub、Oracle Container Registry 和 Azure Container Registry 等。

Docker Hub 就是 Docker 托管的一个注册表,它存储了来自软件供应商、开源项目和社区的 100000 多个容器映像,还包含了许多来自 NGINX、Logstash、Apache HTTP、Grafana、MySQL、Ubuntu 和 Oracle Linux 等官方存储库的软件和应用。

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

图 3:Docker 注册表屏幕截图
图 3

Docker 即微服务运行时

如今,将单体应用分割为较小的微服务块这一理念已引起了软件开发人员的广泛关注。

微服务系作为进程独立部署,使用轻量级协议相互通信,且每一项服务都拥有自己的数据 [7]。由于采用非集中式治理方法,微服务的实现离不开高水平的基础设施自动化、自动化测试、全自动 CD 管道以及熟练、敏捷的 DevOps 团队。

对于微服务这种架构,尽管目前仍有许多不同声音,但有一个共识,那就是在被分解为微服务后,应用无法以一组进程的形式运行。微服务的实现需要满足众多条件,例如它需要独立于主机,在操作系统层面进行隔离,需要在其资源限制内运行,必须支持按需伸缩,必须能在发生故障后重新启动,必须通过软件定义网络层连接至其他微服务。

在 Docker 容器中运行微服务可为实现这些目标奠定一个良好的基础。

Docker — 两个关键维度

Docker 在两个维度上改变了软件的构建、交付和运行方式:

  • 更可靠地将应用从开发环境移动到生产环境。
  • 通过标准映像格式将软件从本地迁移至云。

以下是关于这两个维度的详细介绍。

Docker 映像 — 从开发到生产

包含所有依赖关系的 Docker 映像可解决“开发环境下正常但生产环境下出错”的问题,其关键在于构建管道可以自动基于源代码库(如 Git)创建 Docker 映像,在开发环境下进行初步测试,然后在 Docker 注册表中存储该不可变映像。

如图 4 所示,您可以使用同一映像进行进一步的负载测试、集成测试、验收测试等。换言之,您在每一个环境下使用的都是同一个映像。而对于细微但必要的环境特定差异(例如生产数据库的 JDBC URL),您可以将其作为环境变量或文件纳入到容器中。

Docker 映像屏幕截图
图 4

有统计数据显示,当前 65% 的 Docker 使用场景都位于开发环境下,48% 的使用场景都使用 Docker 进行持续集成 [5]。

从本地迁移到云端

Docker 改变了公有云的采用方式。一方面,Docker 映像这种前所未有的通用软件包格式可以在本地环境和所有主流的云提供商环境下运行。例如,Docker 容器可以像在 Oracle 云上一样在笔记本电脑上运行。

另一方面,Docker 容器可以在所有主流的公有云上运行,这为消除长期以来关于公有云的一个偏见做出了重大贡献,即供应商依赖。如今,所有主流的云提供商均可提供 Docker as PaaS 服务。

Docker — 成熟的底层技术

Docker 的发布节奏比传统企业软件快得多,这种快节奏以及 Docker 项目的新颖性有时甚至引起了人们对 Docker 安全性和稳定性的担忧。

事实上,尽管 Docker 及其命令行、Docker daemon、API 以及 Docker Swarm、Docker Machine 和 Docker Compose 等工具快速发展只是近三年的事情,近十年来每一个 Linux 内核中都能看到 Docker 的底层内核特性。

Google 就是一个典型的容器技术早期采用者。早在 Docker 出现之前,Google 就一直在使用 Linux 容器,甚至在容器中运行所有一切。据估计,谷歌每周要启动 20 亿个容器 [3]。

Cgroup 和命名空间的历史

Docker 使用的底层 Linux 内核特性包括 Cgroups 和命名空间。2008 年,在 Google 开发人员以往工作的基础上,Linux 内核引入了 Cgroups [1]。Cgroups 可以限制并说明一组操作系统进程的资源用量。

命名空间则可隔离各个进程之间的系统资源。2002 年,Linux 引入了第一个名称空间(即 mount 命名空间)。

容器云服务

本文的第一部分介绍了关于 Docker 的一些重要概念。但在生产环境下,除了在 Docker 容器中运行应用,您还需要解决很多问题。

您需要准备硬件来运行容器,从而设置和操作生产环境;需要安装、升级和修补 Docker 等软件以及存储库和集群管理器;需要创建一个网络,以便多个 Docker 容器跨主机通信;需要能够在集群化容器发生故障后将它们重新启动。此外,一系列互连的容器应当像一个逻辑应用实例一样易于部署,例如一个负载均衡器、多个 Web 服务器、多个带管理服务器的 Oracle WebLogic Server 实例、一个托管式服务器和一个数据库。最后,要想规模化地管理容器化应用,Kubernetes 或 Docker Swarm 之类的容器编排系统也必不可少,而部署、管理和运行 Kubernetes 之类的编排系统也是一项耗时且充满挑战的任务。

为了更轻松、高效地创建容器化应用,很多云提供商提供了容器云服务或容器即服务 (CaaS),以帮助开发人员和运营团队理顺和管理容器生命周期。这些编排服务通常由 Kubernetes 构建,支持 DevOps 团队更轻松、规模化地管理和运行容器化应用。例如,Oracle Container Engine for Kubernetes 和 Azure Kubernetes Service 就是两个常用的、典型的托管式容器编排云服务。

Oracle Container Engine for Kubernetes 是一款全托管式、可扩展、高度可用,可在云端部署容器化应用的服务。如果您的开发团队希望可靠地构建、部署和管理云原生应用,请使用 Container Engine for Kubernetes(有时缩写为 OKE)。

来自 Oracle 的 Docker 映像 — 请前往以下位置获取或为 Oracle 产品构建 Docker 映像。其中,面向 Docker 映像的 Oracle GitHub 存储库包含为 Oracle 商用产品和 Oracle 赞助的开源项目构建 Docker 映像的 Dockerfile 和示例。

Docker 实操实验室 — 使用 Docker 进行容器化开发

参考

  1. Cgroups (Wikipedia)
  2. Linux 命名空间 (Wikipedia)
  3. Google 在容器中运行一切,作者 Jack Clark
  4. Docker Hub 达到 50 亿次拉取次数
  5. 现代化软件供应链的进化之旅,2016 年 Docker 调查报告
  6. MOS Doc ID 2216342.1:面向 Oracle 数据库的 Docker 支持
  7. 微服务,作者 Martin Fowler
  8. Oracle 容器引擎和注册表演示 (3:13)
  9. Container Engine for Kubernetes 文档