千家信息网

Docker的引擎Swarm怎么用

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章主要介绍了Docker的引擎Swarm怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker的引擎Swarm怎么用文章都会有所收获,下面我们一起来看看吧
千家信息网最后更新 2024年11月24日Docker的引擎Swarm怎么用

这篇文章主要介绍了Docker的引擎Swarm怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker的引擎Swarm怎么用文章都会有所收获,下面我们一起来看看吧。

Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker

Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

n只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。

技术概要

如果把 Docker 详细而又好用的文档照搬到这里那将太丢人了,所以我将简要概括下这个技术的概要。我们已经有了 Docker,对吧。现在,你想要更多的服务器作为 Docker 主机,但同时你希望它们属于同一个逻辑上的实体。也就是说,你想建立一个集群。

我们先从一个主机组成的集群开始。当你在一个主机上初始化一个 Swarm 集群,这台主机将成为这个集群的管理者manager。从技术角度来讲,它成为了共识组consensus group中的一个节点node。其背后的数学逻辑建立在 Raft 算法之上。管理者manager负责调度任务。而具体的任务则会委任给各个加入了 Swarm 集群的工作者worker节点。这些操作将由 Node API 所管理。虽说我讨厌 API 这个词汇,但我必须在这里用到它。

Service API 是这个实现中的第二个组件。它允许管理者manager节点在所有的 Swarm 集群节点上创建一个分布式的服务。这个服务可以被复制replicated,也就是说它们(LCTT 译注:指这些服务)会由平衡机制被分配到集群中(LCTT 译注:指 replicated 模式,多个容器实例将会自动调度任务到集群中的一些满足条件的节点),或者可以分配给全局(LCTT 译注:指 global 模式),也就是说每个节点都会运行一个容器实例。

配置镜像和服务

我将尝试配置一个负载均衡的 Apache 服务,并使用多个容器实例通过唯一的 IP 地址提供页面内容。挺标准的吧(LCTT 译注:指这个负载均衡的网页服务器)。这个例子同时也突出了你想要使用集群的大多数原因:可用性、冗余、横向扩展以及性能。当然,你同时需要考虑网络和储存这两块,但它们超出了这篇指南所涉及的范围了。

这个 Dockerfile 模板其实可以在官方镜像仓库里的 httpd 下找到。你只需一个最简单的设置来起步。至于如何下载或创建自己的镜像,请参考我的入门指南,链接可以在这篇教程的顶部可以找到。

docker build -t my-apache2 .Sending build context to Docker daemon 2.048 kBStep 1 : FROM httpd:2.4Trying to pull repository docker.io/library/httpd ...2.4: Pulling from docker.io/library/httpd8ad8b3f87b37: Pull completec95e1f92326d: Pull complete96e8046a7a4e: Pull complete00a0d292c371: Pull complete3f7586acab34: Pull completeDigest: sha256:3ad4d7c4f1815bd1c16788a57f81b413...a915e50a0d3a4Status: Downloaded newer image for docker.io/httpd:2.4---> fe3336dd034dStep 2 : COPY ../public-html/ /usr/local/apache2/htdocs/...

Image created

在你继续下面的步骤之前,你应该确保你能无错误的启动一个容器实例并能链接到这个网页服务器上(LCTT 译注:使用下面的命令)。一旦你确保你能连上,我们就可以开始着手创建一个分布式的服务。

docker run -dit --name my-running-app my-apache2

将这个 IP 地址输入浏览器,看看会出现什么。

Swarm 初始化和配置

下一步就是启动 Swarm 集群了。你将需要这些最基础的命令来开始,它们与 Docker 博客中的例子非常相似:

docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest

这里我们做了什么?我们创建了一个叫做 frontent 的服务,它有五个容器实例。同时我们还将主机的 80 端口和这些容器的 80 端口相绑定。我们将使用刚刚新创建的 Apache 镜像来做这个测试。然而,当你在自己的电脑上直接键入上面的指令时,你将看到下面的错误:

docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latestError response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

这意味着你没有将你的主机(节点)配置成一个 Swarm 管理者manager。你可以在这台主机上初始化 Swarm 集群或是让它加入一个现有的集群。由于我们目前还没有一个现成的集群,我们将初始化它(LCTT 译注:指初始化 Swarm 集群并使当前节点成为 manager):

docker swarm initSwarm initialized: current node (dm58mmsczqemiikazbfyfwqpd) is now a manager.

为了向这个 Swarm 集群添加一个工作者worker,请执行下面的指令:

docker swarm join \--token SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \10.0.2.15:2377

为了向这个 Swarm 集群添加一个管理者manager,请执行 docker swarm join-token manager 并按照指示操作。

操作后的输出不用解释已经很清楚明了。我们成功的创建了一个 Swarm 集群。新的节点们将需要正确的令牌token来加入这个 Swarm 集群。如果你需要配置防火墙,你还需找到它的 IP 地址和端口(LCTT 译注:指 Docker 的 Swarm 模式通讯所需的端口,默认 2377)。此外,你还可以向 Swarm 集群中添加管理者节点。现在,重新执行刚刚的服务创建指令:

docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest6lrx1vhxsar2i50is8arh5ud1

测试连通性

现在,我们来验证下我们的服务是否真的工作了。从某些方面讲,这很像我们在 Vagrant 和 coreOS 中做的事情那样。毕竟它们的原理几乎相同。相同指导思想的不同实现罢了(LCTT 译注:笔者观点,无法苟同)。首先需要确保 docker ps 能够给出正确的输出。你应该能看到所创建服务的多个容器副本。

docker psCONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS              NAMEScda532f67d55        my-apache2:latest   "httpd-foreground"  2 minutes ago       Up 2 minutes        80/tcp              frontend.1.2sobjfchdyucschtu2xw6ms9a75fe6e0aa77b        my-apache2:latest   "httpd-foreground"  2 minutes ago       Up 2 minutes        80/tcp              frontend.4.ag77qtdeby9fyvif5v6c4zcpc3ce824d3151f        my-apache2:latest   "httpd-foreground"  2 minutes ago       Up 2 minutes        80/tcp              frontend.2.b6fqg6sf4hkeqs86ps4zjyq65eda01569181d        my-apache2:latest   "httpd-foreground"  2 minutes ago       Up 2 minutes        80/tcp              frontend.5.0rmei3zeeh8usagg7fn3olsp4497ef904e381        my-apache2:latest   "httpd-foreground"  2 minutes ago       Up 2 minutes        80/tcp              frontend.3.7m83qsilli5dk8rncw3u10g5a

我也测试了不同的、非常规的端口,它们都能正常工作。对于你如何连接服务器和收取请求你将会有很多可配置的余地。你可以使用 localhost 或者 Docker 网络接口(笔者注:应该是指 Docker 的默认网桥 docker0,其网关为 172.17.0.1) 的 IP 地址的正确端口去访问。下面的例子使用了端口 1080:

Replicated Web service works

至此,这是一个非常粗略、简单的开始。真正的挑战是创建一个优化过的、可扩展的服务,但是它们需要一个准确的技术用例。此外,你还会用到 docker info 和 docker service(还有 inspect 和 ps)命令来详细了解你的集群是如何工作的。

可能会遇到的问题

你可能会在把玩 Docker 和 Swarm 时遇到一些小的问题(也许没那么小)。比如 SELinux 也许会抱怨你正在执行一些非法的操作(LCTT 译注:指在强制访问控制策略中没有权限的操作)。然而,这些错误和警告应该不会对你造成太多阻碍。

SELinux alert

  • docker service 不是一条命令(docker service is not a docker command)当你尝试执行必须的命令去创建一个复制模式replicated的服务时,你可能会遇到一条错误说 docker: ‘service’ is not a docker command(LCTT 译注:见下面的例子)。这表示你的 Docker 版本不对(使用 -v 选项来检查)。我们将在将来的教程讨论如何修复这个问题。

    docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latestdocker: 'service' is not a docker command.
  • docker tag 无法识别(docker tag not recognized)你也许会看到下面的错误:

    docker service create -name frontend -replicas 5 -p 80:80/tcp my-apache2:latestError response from daemon: rpc error: code = 3 desc = ContainerSpec: "-name" is not a valid repository/tag

    关于这个错误已经有多个相关的讨论和帖子了。其实这个错误也许相当无辜。你也许是从浏览器粘贴的命令,在浏览器中的横线也许没被正确解析(笔者注:应该用 –name 而不是 -name)。就是这么简单的原因所导致的。

关于"Docker的引擎Swarm怎么用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Docker的引擎Swarm怎么用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

0