Docker容器检查点:实现高效故障恢复与状态保存

引言

本检查点旨在帮助您评估在容器入门文章中所学到的知识。这些文章涵盖了容器生态系统以及两种常见的容器解决方案:Docker和Kubernetes。您可以使用本检查点来检验您对这些主题的理解,复习重要术语和命令,并寻找持续学习的资源。

容器化是在操作系统层面隔离开发环境,以创建可移植运行时环境的过程。容器共享主机资源,能够在可预测和可控的环境中运行应用程序。通过使用容器对基础设施进行抽象和实现应用隔离,您可以高效且一致地扩展开发和测试流程。

在本检查点中,您将找到两个部分,它们综合了入门文章中的核心观点:一个部分总结了容器生态系统的目的,另一个部分涉及运行命令,并分别包含Docker和Kubernetes的特定子部分。在这些部分中,有互动组件可以帮助您测试知识。在本检查点的最后,您将找到继续学习容器的机会。

资源

  • 容器简介
  • 如何在Ubuntu 22.04上安装和使用Docker
  • 如何在Ubuntu 22.04上安装和使用Docker Compose
  • 如何使用docker exec在Docker容器中运行命令
  • 如何在Ubuntu 22.04上的Docker容器之间共享数据
  • 如何在Ubuntu 20.04上设置私有Docker注册表
  • Kubernetes简介
  • 如何使用minikube进行本地Kubernetes开发和测试

什么是容器?

容器为应用程序开发提供了一个可预测且受控的环境。当人们提到容器时,通常指的是容器引擎。

要理解容器,熟悉一些关键的容器化工具是很重要的。

信息

容器化术语解释

对以下术语进行解释,然后使用下拉功能来检查您的答案。

容器引擎

容器引擎是容器化的完整解决方案,引擎包括容器、容器运行时、容器镜像以及构建它们的工具。引擎还可能包括容器镜像注册表和容器编排。Docker是最常用的容器引擎之一。

容器镜像

容器镜像是提供给容器环境构建的模板。当运行一个镜像时,镜像的只读层与可调整的读写层相叠加,用于修改每个容器实例。

容器运行时

容器运行时管理容器的启动和执行。容器运行时分为两个组:开放容器倡议(OCI)和容器运行时倡议。

  • 开放容器倡议提供容器格式的规范和标准。OCI提供了运行容器的基准,例如常用的runc。
  • 容器运行时倡议专注于容器编排。

容器编排

容器编排涉及到资源分配、配置、扩展、调度、部署、监控等内容,通常用于自动化容器部署。许多开发人员喜欢容器化,因为它具有可移植性和可预测的性能。将基础设施抽象化使得在多台机器上以完全相同的方式测试应用程序成为可能。这种基准环境的稳定性赋予开发人员协作和远程工作的能力。

信息

检查自己

使用容器时有哪些常见目标?

为了确保强大的开发和生产环境,您可能希望满足以下需求:

  • 可预测和可移植的性能
  • 使用和内存的高效率
  • 状态不可持久性,但有持久数据的选项
  • 具有集群网络功能的隔离容器
  • 在容器测试期间记录错误和输出
  • 应用程序和基础设施解耦
  • 专业化和微服务

当从相同的基础镜像创建容器时,它们提供了一个可靠的环境,能够满足您的开发和测试需求。这种一致性使您能够根据应用程序的开发情况随时创建和销毁容器。

如果您正在处理需要在容器内保存持久数据的长期项目,您可以挂载一个卷以进行持久数据存储和容器间数据共享。

Kubernetes和Docker是两种常见的容器解决方案。在下面的部分中,您可以通过在入门文章中使用这两种选择,评估您对它们之间区别的了解程度。

信息

自我检查

Docker和Kubernetes之间有什么区别?

Docker是一个容器引擎,通常用于同时运行一个或两个容器化应用程序。

Kubernetes是一个编排软件,可以使您能够在规模上运行许多重叠的容器。Kubernetes最初使用Docker运行时,但现在主要使用containerd抽象层。

什么是Docker?

使用Docker,可以在容器中管理应用程序进程。Docker通常作为容器引擎使用,并可在各种操作系统上运行。

您可以通过映射端口或者允许Docker选择一个随机未使用的端口,将Docker容器映射到主机上。这一过程简化了您的测试环境。如果想了解更多有关使用Docker的信息,您可以参阅《Docker生态系统:常见组件介绍》。

通过使用特定术语来支持系统设置,Docker能够评估您对其术语的了解。

信息

以下是关于 Docker 的相关术语,帮助你了解每个术语的含义。

Docker Compose

Docker Compose 是一个命令行工具,可以通过一个 YAML 文件来定义和运行多容器应用环境。YAML 配置文件将定义环境设置,通常包括一个 Web 服务器环境、端口重定向和共享卷。

Docker Hub

Docker Hub 是由 Docker 公司管理的特定镜像注册表,他们是 Docker 项目背后的公司。

Docker 镜像

Docker 镜像是构建容器的模板。有许多常用的镜像可供使用。

Docker 卷

Docker 卷可用于在容器之间持久化数据,包括已停止或已删除的容器。

Swarm

Docker Swarm 模式是一种用于管理集群的方法,这个集群被称为 Swarm。SwarmKit 是一个基于 Go 语言构建的开源编排工具包,可以用于 Swarm 模式集群。这与之前的名为 Docker Swarm 的工具是不同的,后者现在被称为 Swarm Classic,它指的是 Docker 的早期原生集群方案。Swarm Classic 曾经是一种用于大规模集群的选项。Docker容器提供了一个可移植和一致的运行环境,通常可部署到Kubernetes集群中。

什么是Kubernetes?

使用Kubernetes,您可以在集群中运行和管理容器化应用程序和服务。Kubernetes经常用于满足容器化需求的扩展。

使用 Kubernetes 的特定术语来支持其系统设置。通过了解 Kubernetes 术语来评估您的知识水平。

信息

Kubernetes术语解释

请定义以下术语,然后使用下拉菜单来核对您的答案。

部署 (Deployment)

一个部署是使用复制集 (ReplicaSet) 进行周期管理的Kubernetes工作负载。

复制集用于管理Pod,类似于复制控制器 (Replication Controller),用于定义扩展副本Pod的模板。

节点 (Node)

集群中的服务器被称为节点,其中一个节点充当集群的控制平面 (Control Plane),其他服务器作为工作节点 (Worker Node) 进行功能运行。每个节点都包括容器运行时,用于在该节点上管理应用程序和容器中的服务。

Pod

被作为单个应用程序进行控制的容器被分组为Pod。Pod可由复制控制器或复制集创建。您的 Kubernetes 集群包括一个中央服务器和节点,其中包含特定的组件,帮助集群正常运行并且使服务器之间能够相互通信。要更详细了解 Kubernetes 架构,请参阅《Kubernetes 简介》。

为了实现集群中服务器的网络配置便利,Kubernetes在控制平面上需要特定的组件,这些组件也可以在节点之间进行访问,包括:

  • 一个可以分布在节点上的键值存储,例如 etcd。
  • 一个API服务器 (kube-apiserver),可用于配置工作负载和发送命令。
  • 一个控制器管理器 (kube-controller-manager),用于管理工作负载、执行任务和调节集群。
  • 一个调度器 (kube-scheduler),用于将工作负载分配到特定节点。
  • 一个云控制器 (cloud-controller-manager),代表集群与云提供商、资源和服务进行交互。

节点还需要特定的组件与中央服务器通信并运行其分配的工作负载,包括:

  • 每个节点上的容器运行时,例如 Docker 或 runc。
  • 一个通信服务,如 kubelet,用于与控制平面进行通信;kubelet 使用清单 (manifest) 来定义其接收的工作负载并管理节点的工作状态。
  • 一个小型代理,最常见的是 kube-proxy,用于将请求转发到容器。

有专门用于Docker和Kubernetes的命令行工具,每个工具都有自己的语法。部署后,您还可以使用Docker Desktop或通过Web浏览器访问的Kubernetes仪表板来管理容器。

使用命令行

容器检查点:命令行与容器管理进阶

本文是《容器检查点》系列文章的第二部分。

您通过我们的云服务器入门文章开始接触Linux命令行,通过网页服务器解决方案文章配置了网页服务器,并通过数据库相关文章管理了数据库。在容器的介绍中,您通过以下命令行操作进一步熟悉了命令行开发:

  • cat:显示文件内容。
  • chmod:使用新工具设置权限。
  • curl:向指定位置(URL)传输数据。
  • echo:显示作为参数传递的字符串。
  • env:打印所有环境变量。
  • exit:关闭交互式Docker Shell。
  • mkdir:创建新目录。
  • pwd:打印当前工作目录。
  • systemctl:管理Docker守护进程。
  • tail:打印文件末尾的十行内容。
  • watch:持续运行特定命令(默认每两秒一次)。
  • whoami:打印当前用户的用户名。

您还曾使用不同容器引擎的独特命令语法,并使用Homebrew软件包管理器为您的Kubernetes集群安装了minikube。在下面的部分中,您将回顾在Docker和Kubernetes入门文章中运行的命令。

运行Docker命令

在介绍Docker的文章中,您在Ubuntu服务器上安装和管理了一个Docker容器。默认情况下,只有root用户可以运行docker命令,您可以在命令前添加sudo权限或者将用户添加到docker用户组中。

您使用了docker命令,用于向Docker容器传递选项、子命令和参数:

  • docker exec:在活跃容器中运行命令,使用--workdir标志指定命令运行的目录,--user标志以不同用户身份运行命令,-e标志将环境变量传递到容器中,或--env-file标志指定.env文件。
  • docker images:查看已下载到系统的镜像。
  • docker info:访问系统范围的信息。
  • docker ps:查看系统上运行的活跃容器,使用-a开关查看所有容器(包括活跃和非活跃),使用-l开关查看最新创建的容器。
  • docker rename:重命名您的容器。
  • docker rm:使用容器ID或名称删除容器。
  • docker run:从指定镜像启动容器,结合使用-it开关进行交互式Shell访问。
  • docker search:搜索Docker Hub上可用的镜像;docker pull:从注册表下载指定镜像。
  • docker start:使用容器ID或名称启动已停止的容器。
  • docker stop:使用容器ID或名称停止正在运行的容器。
  • docker tag:重命名已创建的镜像。
  • docker volume:管理您的数据卷。

信息:自我检查

使用下拉功能获取答案。

dockerdocker exec命令有什么区别?

docker exec命令用于在当前运行的容器中执行程序和检查,而docker run命令则用于创建新的容器。

什么是Dockerfile?

您可以使用docker build命令通过Dockerfile构建镜像,尽管在这些入门文章中您没有运行过该命令。Dockerfile用于构建镜像,而使用docker compose运行YAML配置文件则管理编排。您还使用了--help选项来访问各种子命令可用的选项,例如以下开关:

  • --name:为容器指定名称。
  • --rm:创建一个在停止时自动删除的容器。
  • -d:将容器从终端分离,使其在后台运行。
  • -v:通过命名或创建绑定挂载(指定/~/)来管理Docker卷。

Docker还提供了Docker Compose命令行工具来管理多容器环境。您可以设置一个YAML配置文件,创建一个带有端口重定向和共享卷的Web服务器环境,并运行以下命令来管理您的容器:

  • docker compose up:运行容器化环境。
  • docker compose ps:提供有关运行中容器和端口重定向的信息。
  • docker compose logs:访问容器的日志。
  • docker compose pause:暂停容器;docker compose unpause:恢复容器。
  • docker compose stop:停止容器。
  • docker compose down:移除与环境关联的容器、网络和卷。

信息:自我检查

使用下拉功能获取答案。

使用docker命令和运行docker compose之间的主要区别是什么?

docker命令在命令行中运行所有子命令,而docker compose则运行一个YAML文件以提供配置数据,该数据可用于多个容器环境。使用docker compose启动的容器还可以共享网络和数据卷。

Docker Compose作为一个有益工具的原因是什么?

当您有一个较大的部署,同时运行多个容器时,您可以编写一个YAML文件来设置容器配置,然后运行docker compose来对所有组件发出命令并一起控制它们。因此,当您的应用程序增长并需要强大的协调设置时,docker compose能够帮助您扩展容器管理。

通过私有Docker镜像仓库和Docker Hub管理您的镜像,您运行了以下命令:

  • docker login:登录,使用-u开关指定用户名。
  • docker commit:提交新的Docker镜像,使用-m开关提供提交信息,-a开关指定作者。
  • docker push:推送您的镜像,包括推送到您自己的仓库。
  • docker pull:将您的镜像拉取到新机器。

对于持久性数据,您还可以设置一个Docker卷。您可以使用docker volume命令与create子命令来创建一个新卷,使用inspect子命令来验证系统上的卷,使用ls子命令来列出卷,并在卷名后附加:ro以获得只读权限。接下来,您可以在Docker容器和主机之间共享数据。

Docker是一种常见的容器引擎,Kubernetes是一个可以运行Docker容器引擎的编排平台。

运行Kubernetes命令

这是文章《容器检查点》的第3部分(共3部分)。

在介绍Kubernetes的文章中,你使用Docker框架运行minikube伴侣,模拟了在单台机器上运行的Kubernetes集群,这使你能够访问Kubernetes集群的浏览器仪表板。

你运行了以下 minikube 命令:

  • minikube start:启动工具并启用kubectl,可选地使用 -p--profile 选项来指定集群。
  • minikube dashboard:访问Kubernetes仪表板,并自动进行端口转发,使用 --url 选项通过SSH隧道辅助从远程服务器进行端口转发。
  • minikube service:针对指定服务使用 --url 选项,以获取正在运行服务的URL。
  • minikube config:通过 set memoryget profile 等子命令来管理你的集群。
  • minikube delete:删除服务以便重新部署。
  • minikube mount:将本地文件系统中的目录临时挂载到集群中,使用 local_path:minikube_host_path 语法来指定目录及其在容器中的位置。
  • minikube profile:使用指定集群来切换活动配置文件。

你还使用了 kubectl 命令和以下子命令:

  • kubectl get pods:列出集群中所有正在运行的Pod,使用 -A 参数查找所有命名空间。
  • kubectl create deployment:创建名为部署的服务,使用 --image 选项调用指定的远程镜像。
  • kubectl expose deployment:暴露指定的部署,使用 --port 选项指定端口,并使用 --type 选项。
  • kubectl get service:检查指定服务是否正在运行。
  • kubectl get nodes:列出集群中活动的节点,使用 --kubeconfig 选项指定不同的YAML配置文件。

要使用托管的 Kubernetes 服务,您可以查看 Silicon Cloud Kubernetes 快速入门文档。

接下来是什么?

通过对容器和流行的数据库容器引擎有更深入的了解,您可以将开发环境容器化,从而在构建应用程序时实现一致性。这对于一个复杂的主题来说,可能看起来过于简单,但现在您至少有一个甚至两个容器生态系统可以进行实验、应用构建和项目扩展。

要构建更多的 Docker 生态系统,您可以接下来按照这些教程来操作:

  • 使用 Docker Compose 将 Node.js 应用程序容器化以进行开发
  • 如何使用 Nginx、Let’s Encrypt 和 Docker Compose 保护容器化的 Node.js 应用程序

如果您喜欢立即开始操作,请尝试 Silicon Cloud Marketplace 的 Docker 一键解决方案,它会启动一个已安装 Docker 的 vServer(云主机)。您还可以查阅 Silicon Cloud 产品文档中的容器镜像(Container Images)部分,了解如何部署容器镜像。

为了继续发展您的 Kubernetes 集群,您可以参考以下文章:

  • 为 Kubernetes 架构应用程序
  • 为 Kubernetes 现代化应用程序
  • 将单体应用程序重构为微服务的最佳实践
  • 我们的系列文章:从容器到 Kubernetes,使用 Node.js 或 Django

如果您希望释放资源以进行开发,您可以迁移到 Silicon Cloud 托管的 Kubernetes (DOKS) 服务。您还可以使用 Silicon Cloud 容器注册表 (DOCR) 来提供对 Docker 容器和 Silicon Cloud Kubernetes 集群的额外支持。

凭借您对容器的新掌握,您已经做好了继续进行云端安全措施的旅程的准备。如果您还没有看过我们关于云服务器、Web服务器和数据库的入门文章,现在就去看一下吧。

bannerAds