Docker Swarm:从初学到可以部署多主机 Kubernetes

面试官:小伙子,你的代码为什么这么丝滑?

Docker 是如今前端开发人员不可或缺的一项技术,然而在实际的生产环境中,单个 Docker 容器可能无法满足业务需求。因此,多个 Docker 容器的协作管理是必要的。这就是 Docker Swarm,它是 Docker 官方提供的原生集群管理解决方案。Docker Swarm 允许将多个主机设置为一个 Docker 集群,并利用 Docker 的 API 和命令行工具在这个集群上进行操作和管理。

Kubernetes 是一个更为强大和复杂的容器管理平台,可以支持更复杂的应用程序和更多的容器集群。而 Docker Swarm 作为 Docker 自带的集群管理工具,也可以作为学习 Kubernetes 的入门基础。因此,本文将以 Docker Swarm 为主要内容,向读者介绍如何从初学到搭建多主机 Kubernetes 环境。

1. Docker Swarm 入门

1.1.准备工作

  • 安装 Docker CE:Docker CE 是 Docker 社区版,简单易用,是使用 Docker 的第一步,参考官方文档 https://docs.docker.com/install/ 进行安装即可。

  • 设置 Docker 镜像加速器:国内访问 Docker Hub 可能会非常慢,为了提高 Docker 构建和拉取镜像的速度,我们可以设置 Docker 镜像加速器,参考阿里云镜像加速器 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 进行设置。

  • 两个或多个 Docker 主机:构建 Docker Swarm 集群必须要有两个或多个主机,这些主机分别可以是物理机或虚拟机,同一个网络即可。

1.2.创建 Docker Swarm 集群

在其中一个主机上执行以下命令,创建 Docker Swarm 集群:

- ------ ----- ----

之后会生成一个 token,其他主机通过该 token 来加入集群。将该 token 备份到其他主机,如下所示:

----- ------------ ------- ---- --------------------------- -- --- - --------

-- --- - ------ -- ---- ------ --- --- --------- --------

    ------ ----- ---- ------- ------------------------------------------------------------------------------------- -------------------

-- --- - ------- -- ---- ------ --- ------- ----- ---------- -------- --- ------ --- -------------

然后在另一个主机上加入该集群,如下所示:

- ------ ----- ---- ------- ------------------------------------------------------------------------------------- -------------------

现在,我们就拥有了一个简单的 Docker Swarm 集群。

1.3.创建服务

服务是容器的一个集群。在 Docker Swarm 中,我们通过创建服务来运行相同的容器。服务管理容器的生命周期,并确保服务的可用性和可伸缩性。可以使用以下命令来创建服务:

- ------ ------- ------ ------ ---- ------------

这会创建一个名为 test 的服务,我们可以将其部署在我们的 Swarm 集群中。该服务的镜像是 nginx:latest,示例的应用层是一个静态的 nginx 服务。我们可以通过以下命令查看服务的状态:

- ------ ------- --

我们可以在其他节点上查看该服务是否运行:

- ------ --

1.4.管理 Swarm

我们可以使用 docker node 命令管理 Docker Swarm:

- ------ ---- --  - ------
- ------ ---- ------- -----------  - ---------
- ------ ---- ------- -----------  - -----------
- ------ ---- ------ -----------  - ----------
- ------ ---- -- -----------  - - ----- -------
- ------ ---- ------ -----------  - -------

Docker Swarm 对容器、服务和节点的管理都是很方便的。

2. Docker Swarm 进阶

Docker Swarm 不仅仅是一个简单的容器编排工具,它还提供了更高级的功能。这里为大家介绍一下 Docker Swarm 进阶部分的内容。

2.1.负载均衡

Docker Swarm 提供了内置的负载均衡能力,它会自动将流量分流到不同的节点上。

- ------ ------- ------ ------ ----- ---------- - -- ------- ------------

上面的命令可以创建一个名为 nginx 的服务,并将 entrypoint 设置为 nginx:latest。同时,服务的副本数量为 3,将通过端口 8080 暴露在主机上。

Docker Swarm 默认使用 round-robin 策略进行负载均衡。

2.2.健康检查和升级

Docker Swarm 提供了健康检查和自动升级的功能。

在 Docker Swarm 中,可以通过 docker service update 命令来更新服务。例如,以下命令将服务 web 的副本数量从 4 更改为 5

- ------ ------- ------ ---------- - ---

Docker Swarm 提供了一个健康检查机制,可以通过配置检查脚本来检测服务的状态是否健康。如果服务不健康,Docker Swarm 将自动停止并重启容器。

在 Dockerfile 中,可以通过 HEALTHCHECK 命令添加一个健康检查脚本。

----------- ------------- --- ---- -- ------------------- -- ---- -

以上例子中,Docker Swarm 会每 5 秒执行一次检查脚本,如果返回码为非零值,则意味着服务不健康。

2.3.存储方案

Docker Swarm 也提供了存储方案。可以使用以下命令来创建一个具有 100G 存储空间的存储方案:

- ------ ------ ------ -------- ----- ----- ---------- ----- ------------ ----- ----------- ------------

接着可以将该存储方案作为服务的一部分来使用。

- ------ ------- ------ ---------- - ------ ----- ------- ------------------------------------------------ --------- ------------------------ -----

2.4.多主机部署

在 Docker 18.02 版本之前,只有单个 Swarm 节点可用于管理服务。因此,不能将服务部署到多个节点上以实现容错能力。

现在,Docker 已经支持跨多个主机的 Swarm 集群。我们可以使用 docker swarm join 命令将新的主机加入到集群中。

2.5.实例

以下是一个 Docker Swarm 的示例:启动 5 个 nginx 服务容器,将它们绑定到同一个网络上,由 Docker Swarm 进行负载均衡。

  1. 启动 Docker Swarm 集群:
- ------ ----- ----
  1. 创建一个 Docker network:
- ------ ------- ------ -------- ------- ---------
  1. 启动 nginx 服务:
- ------ ------- ------ ------ ------------- ---------- - --------- --------- -- ----- -----
  1. 查看服务状态:
- ------ ------- --
  1. 在浏览器中访问 nginx 服务:
------------------------

3. Kubernetes

Kubernetes 是 Google 开源的分布式容器集群管理系统,旨在提供自动化容器部署、扩展和管理的平台。

Kubernetes 是一个更为强大和复杂的容器管理平台,可以支持更复杂的应用程序和更多的容器集群。你可以学习它的更高级用法,例如如何实现自定义资源对象、横向和垂直自动扩展、自定义调度策略、数据卷、状态存储等等。

3.1.搭建 Kubernetes 集群

Kubernetes 的安装和配置相对 Docker Swarm 更为复杂。然而,在为前端开发提供 K8s 支持的场景下, Minikube 提供了一种简单的方法。Minikube 可以在本地电脑上创建一个单主机 Kubernetes 集群,并且支持多种虚拟机管理器,常用的有 VirtualBox 和 KVM。

3.1.1. 安装 Minikube

请参阅 https://minikube.sigs.k8s.io/docs/start/ 进行安装和配置。如果已经安装了 Docker,可以通过 brew install minikube 命令来安装。接下来,执行以下命令验证 Minikube 是否正确安装:

- -------- -----

3.1.2. 配置 kubectl

kubectl 是 Kubernetes 的命令行工具。执行以下命令来安装 kubectl

---- ------- -------
---- ------- --------- ---------- ------ -----------
------ ---------

3.1.3. 部署配置

可以使用以下命令查看启动的集群是否正在运行:

-------- ------

接下来,通过 kubectl 来管理 Kubernetes:

------- ------------

3.1.4. 示例

  1. 启动 nginx 服务:
- ------- ------ ---------- ----- --------------------
  1. 将部署扩展到 3 个 Pod:
- ------- ----- ---------- ----- ------------
  1. 检查 Pod 的状态:
- ------- --- ----
  1. 检查服务:
- ------- --- -------

Kubernetes 的学习曲线比 Docker Swarm 更陡峭,但是它有更多的特性和更高的可扩展性,对于大型项目来说,是更好的选择。

4. 结论

Docker Swarm 和 Kubernetes 都是旨在提供容器编排和集群管理的平台。Docker Swarm 更加简单,轻量,并且可以在单个机器上管理容器集群。Kubernetes 提供了更多的高级特性,包括更容易扩展,更复杂的应用程序和更高级的资源调度。对于前端开发人员,Docker Swarm 可以作为学习 Kubernetes 的入门基础。在工作中选择何物需要结合具体情况进行评估。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6701157d0bef792019b14d28


猜你喜欢

  • ES7 中的类:更加完善的代码重构和参数传递

    1. 引言 随着前端技术的不断发展,JavaScript 作为 Web 开发中的一种常用编程语言也在不断地演变,从 ES5 开始,JavaScript 中引入了类的概念,以更加面向对象化的方式来构建代...

    14 天前
  • 值得一试的 20+Material Design 资源库

    值得一试的 20+ Material Design 资源库 Material Design 是 Google 在 2014 年提出的一种新的设计语言,关注用户体验和直观性。

    14 天前
  • Enzyme 中如何测试 React 组件的 CSS 样式

    Enzyme 中如何测试 React 组件的 CSS 样式 在 React 前端开发中,CSS 样式是非常重要的一部分。而如何测试组件的 CSS 样式,确保它们能够正确地呈现和被渲染,是一项非常重要的...

    14 天前
  • 使用 Headless CMS 和 React 创建无头 Ecommerce

    概述 Headless CMS 是一种将内容和后端数据从前端界面中解耦的 CMS 解决方案,使得开发人员可以更加专注于构建用户界面和用户体验。而这种解耦则非常适合创建 Ecommerce 平台,尤其是...

    14 天前
  • ESLint vs TSLint:前端代码检测工具对比

    在前端开发中,代码的规范性和可读性是非常重要的。为了保证代码的质量和可维护性,在编写代码的同时应该注重代码检测工具的使用。以前,我们可以使用 JSLint 或 JSHint 来检测 JavaScrip...

    14 天前
  • 使用 TailwindCSS 快速优化网站性能

    在现代 Web 应用开发过程中,前端性能已成为至关重要的因素。为了满足用户需求,我们需要优化应用性能以提高用户体验。一种常用的优化方法是使用 CSS 框架。在这篇文章中,我们将介绍一种名为 Tailw...

    14 天前
  • 如何使用 PWA 技术实现在线客服系统

    在当今互联网时代,为用户提供在线客服服务已经成为了各大企业必不可少的一项服务。随着移动端的不断发展,用户更加愿意使用手机或平板电脑与企业进行沟通。PWA(Progressive Web App)技术是...

    14 天前
  • 为什么需要 CSS Reset?如何正确使用它?

    什么是 CSS Reset? CSS Reset 是一个通用的 CSS 样式库,通过重置浏览器内置的样式,从而减少浏览器之间的差异。它最初由 Eric Meyer 创作并发布,并在 Web 开发中得到...

    14 天前
  • Cypress 中如何断言一个元素是否可见

    在前端自动化测试中,要验证一个元素是否可见是非常重要的,因为它可以确保页面的正确展示和交互。在使用 Cypress 进行前端自动化测试时,判断元素是否可见是很常见的需求,本文将介绍如何使用 Cypre...

    14 天前
  • ES11 异步迭代器与 for-await-of 的使用

    在前端开发中,异步编程是一个常见的问题。随着 ES11 的发布,我们现在可以使用异步迭代器和 for-await-of 语句来更加方便地处理异步操作了。 异步迭代器简介 异步迭代器是一个新的特性,可以...

    14 天前
  • Angular 应用中使用 RxJS 遇到的错误及解决方式

    在使用 Angular 应用中,我们经常会用到 RxJS 作为数据流处理工具。RxJS 是一个函数响应式编程工具,可以轻松地处理异步数据流。然而,在使用过程中,我们可能会遇到一些常见的错误,本文将介绍...

    14 天前
  • 自定义元素中变量的命名

    在前端开发中,我们经常需要使用自定义元素。然而,在自定义元素中,变量的命名非常重要,因为它们不仅影响代码的可读性,还可以影响代码的性能。 变量命名规则 在自定义元素中,我们需要遵守以下变量命名规则: ...

    14 天前
  • 初学者必学:Redux 的核心概念解析

    如果你是一名前端开发初学者,那么你一定听说过 Redux,它是一个流行的 JavaScript 状态管理库。虽然初学时,Redux 看起来有点吓人,但是一旦掌握了它的核心概念,使用它来管理应用程序中的...

    14 天前
  • Mocha 报错 TypeError: is not a function 怎么办?

    在前端开发过程中,Mocha 是前端测试框架中的一种,常用来进行单元测试和集成测试。但是,在使用 Mocha 进行测试时,可能会遇到 "TypeError: is not a function" 错误...

    14 天前
  • 如何使用 Stencil.js 构建高质量的 Web Components?

    前言 在现代 Web 开发中,Web Components 是一个重要的概念。Web Components 是由组件构成的 Web 应用。在 Web Components 中,一个组件可以被多个应用所...

    14 天前
  • Angular 使用 HttpClient 请求数据的实现方法

    Angular 是一款流行的前端框架,它提供了一种方便的方式来构建响应式、高性能的 Web 应用程序。在很多 Web 应用中,前端需要与后端 API 进行交互来获取数据。

    14 天前
  • Vue.js SPA 应用多页打开 404 问题解决方案

    背景 随着前端开发的不断发展,Vue.js 的单页应用(SPA)越来越受欢迎。SPA 可以提供流畅的用户体验,但是在一些情况下,我们需要将 SPA 应用的某个页面作为多页应用的一个页面打开,这时就会出...

    14 天前
  • ES8 中的 Reflect API:改变 JavaScript 应用程序的可维护性

    在前端开发中,JavaScript 是一种不可避免的语言。为了使我们的应用程序更加灵活和易于维护,JavaScript 语言自 2017 年起添加了一个新的 API:Reflect。

    14 天前
  • 如何在 MongoDB 中使用事务

    MongoDB 4.0 版本中增加了事务功能,这是一个非常重要的更新。事务可用于处理复杂的多操作过程并确保数据的完整性。在这篇文章中,我们将详细介绍如何在 MongoDB 中使用事务。

    14 天前
  • GraphQL 查询优化技巧:缓存与预取

    GraphQL 是一种新兴的数据查询语言,它可以将多个 RESTful API 请求集中合并为一个请求,并返回客户端所需的全部数据。 在优化 GraphQL 查询性能方面,缓存和预取是两个关键技术。

    15 天前

相关推荐

    暂无文章