专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
51好读  ›  专栏  ›  分布式实验室

使用Docker Swarm来运行服务

分布式实验室  · 公众号  · 后端  · 2016-10-10 07:45

正文


Docker的最新版本v1.12,包含了很多更新和Docker Swarm提供的功能。在今天的文章中,我们将探讨如何使用Docker Swarm来部署服务。

在Ubuntu 16.04中激活Swarm模式

在我们使用Docker Engine Swarm部署服务之前,我们需要建立一个Swarm集群。因为我们需要1.12新添加的功能,所以我们也要安装Docker Engine的最新版本。

以下步骤将指导你在Ubuntu 16.04上安装Docker Engine。对于其他平台和版本,你可以参考Docker的官方安装文档(https://docs.docker.com/engine/installation/#installation)。

设置Docker Apt仓库

我们会使用Ubuntu的标准安装方式,依赖于Apt包管理器。因为我们需要安装最新版本的Docker Engine,所以我们需要配置Apt,从Docker官方Apt仓库来安装 docker-engine ,而不是从系统预配置的仓库。

添加Docker公钥

配置Apt来使用新仓库的第一步是想Apt缓存中添加该库的公钥。使用 apt-key 命令:

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

以上的 apt-key 命令向密钥服务器 p80.pool.sks-keyservers.net 请求一个特定的密钥( 58118E89F3A912897C070ADBF76221572C52609D )。公钥将会被用来验证从新仓库下载的所有包。

指定Docker仓库的位置

引入Docker的公钥,我们可以配置Apt使用Docker的仓库服务器。我们可以在 /etc/apt/sources.list.d/ 目录中添加一个条目。

# echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" >> /etc/apt/sources.list.d/docker.list

当我们刷新Apt缓存时,Apt将会搜索 sources.list.d/ 目录下的所有文件,来寻找新的包仓库。上述命令会创建一个新文件 docker.list ,其中包含了一个添加了 apt.dockerproject.org 仓库的条目。

更新Apt包缓存

运行 apt-get 命令的 update 选项,来刷新Apt包缓存。

# apt-get update

这会触发Apt重新读取配置文件,刷新仓库列表,包含进我们添加的那个仓库。该命令也会查询这些仓库来缓存可用的包列表。

安装 linux-image-extra

在安装Docker Engine之前,我们需要安装一个先决软件包(prerequisite package)。 linux-image-extra 包是一个内核相关的包,Ubuntu系统需要它来支持 aufs 存储设备驱动。Docker会使用该驱动来加载卷。

为了安装该包,我们将使用 apt-get 命令的 install 选项。

# apt-get install linux-image-extra-$(uname -r)

apt-get 命令中, $(uname -r) 将返回正在运行的内核的版本。任何对于该系统的内核更新应当包括安装 linux-image-extra ,它的版本需要与新内核版本相一致。如果该包没有正确更新的话,Docker加载卷的功能可能受到影响。

安装Docker Engine

在Apt配置好和 linux-image-extra 安装好之后,我们可以继续安装Docker Engine了。我们可以使用 apt-get 命令的 install 选项来安装 docker-engine 包。

# apt-get install docker-engine

此时,我们应该已经安装好了 Docker Engine v1.12.0 或者更新版本。我们可以执行 docker 命令的 version 选项来验证我们已经安装了最新版本。

# docker version
Client:
Version:      1.12.0
API version:  1.24
Go version:   go1.6.3
Git commit:   8eab29e
Built:        Thu Jul 28 22:11:10 2016
OS/Arch:      linux/amd64

Server:
Version:      1.12.0
API version:  1.24
Go version:   go1.6.3
Git commit:   8eab29e
Built:        Thu Jul 28 22:11:10 2016
OS/Arch:      linux/amd64

我们可以看到,Server版本和Client版本都是 1.12.0 。接下来,我们会创建Swarm集群。

创建一个Docker Swarm集群

在这一小节中,我们将在多台机器上执行多个任务。为了更清楚地表述,我会在例子中包含主机名。

我们会使用两个节点来启动Swarm集群。此时,两个节点都按照上述步骤安装了Docker Engine。

当创建Swarm集群时,我们需要指定一个manager节点。在这个例子中,我们会使用主机名为 swarm-01 的主机作为manager节点。为了使 swarm-01 成为manager节点,我们需要首先在 swarm-01 执行命令来创建Swarm集群。这个命令就是 docker 命令的 swarm init 选项。

root@swarm-01:~# docker swarm init --advertise-addr 10.0.0.1
Swarm initialized: current node (awwiap1z5vtxponawdqndl0e7) is now a manager.

To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb \
10.0.0.1:2377

To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-bwex7fd4u5aov4naa5trcxs34 \
10.0.0.1:2377

在上述命令中,除了 swarm init 之外,我们还指定了 --advertise-addr 10.0.0.1 。Swarmmanager节点会使用该IP地址来广告Swarm集群服务。虽然该地址可以是私有地址,重要的是,为了使节点加入该集群,那些节点需要能通过该IP的 2377 端口来访问manager节点。

在运行 docker swarm init 命令之后,我们可以看到 swarm-01 被赋予了一个节点名字( awwiap1z5vtxponawdqndl0e7 ),并被选为Swarm集群的管理器。输出中也提供了两个命令:一个命令可以添加worker节点到swarm中,另一个命令可以添加另一个manager节点到该Swarm中。

Docker Swarm Mode可以支持多个manager节点。然而,其中的一个会被选举为主节点服务器,它会负责Swarm的编排。

添加worker节点到Swarm集群中

Swarm集群建立之后,我们需要添加一个新的worker节点。

root@swarm-02:~# docker swarm join \
> --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb \
> 10.0.0.1:2377
This node joined a swarm as a worker.

在本例中,我们将 swarm-02 添加到了swarm中,作为worker节点。Swarm集群中的worker节点的角色是用来运行任务(tasks)的;在该例中,任务(tasks)就是容器(containers)。另一方面,manager节点的角色是管理任务(容器)的编排,并维护Swarm集群本身。

除此之外,manager节点本身也是worker节点,也可以运行任务。

查看当前的Swarm节点

我们现在有了一个最基本的两节点的Swarm集群。我们可以执行 docker 命令的 node ls 选项来验证集群的状态。

root@swarm-01:~# docker node ls
ID                           HOSTNAME              STATUS  AVAILABILITY  MANAGER STATUS
13evr7hmiujjanbnu3n92dphk    swarm-02.example.com  Ready   Active        
awwiap1z5vtxponawdqndl0e7 *  swarm-01.example.com  Ready   Active        Leader

从输出中可以看到, swarm-01 swarm-02 都处于 Ready Active 状态。因此,我们可以继续在Swarm集群上部署服务了。

Docker网络选择

在Docker Swarm Mode中,服务是指一个长期运行(long-running)的Docker容器,它可以被部署到任意一台worker节点上,可以被远端系统或者Swarm中其他容器连接和消费(consume)的。

在本例中,我们会部署一个Redis服务。

部署一个有副本的服务

一个有副本的服务是一个Docker Swarm服务,运行了特定数目的副本(replicas)。这些副本是由多个Docker容器的实例组成的。在本例中,每个副本都是一个独立的Redis实例。







请到「今天看啥」查看全文