本文共 9071 字,大约阅读时间需要 30 分钟。
docker-engine
,而不是从系统预配置的仓库。 apt-key
命令: # apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
apt-key
命令向密钥服务器 p80.pool.sks-keyservers.net
请求一个特定的密钥( 58118E89F3A912897C070ADBF76221572C52609D
)。公钥将会被用来验证从新仓库下载的所有包。 /etc/apt/sources.list.d/
目录中添加一个条目。 # echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" >> /etc/apt/sources.list.d/docker.list
sources.list.d/
目录下的所有文件,来寻找新的包仓库。上述命令会创建一个新文件 docker.list
,其中包含了一个添加了 apt.dockerproject.org
仓库的条目。 apt-get
命令的 update
选项,来刷新Apt包缓存。 # apt-get update
linux-image-extra
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加载卷的功能可能受到影响。 linux-image-extra
安装好之后,我们可以继续安装Docker Engine了。我们可以使用 apt-get
命令的 install
选项来安装 docker-engine
包。 # apt-get install docker-engine
Docker Engine v1.12.0
或者更新版本。我们可以执行 docker
命令的 version
选项来验证我们已经安装了最新版本。 # docker versionClient:Version: 1.12.0API version: 1.24Go version: go1.6.3Git commit: 8eab29eBuilt: Thu Jul 28 22:11:10 2016OS/Arch: linux/amd64Server:Version: 1.12.0API version: 1.24Go version: go1.6.3Git commit: 8eab29eBuilt: Thu Jul 28 22:11:10 2016OS/Arch: linux/amd64
1.12.0
。接下来,我们会创建Swarm集群。 swarm-01
的主机作为manager节点。为了使 swarm-01
成为manager节点,我们需要首先在 swarm-01
执行命令来创建Swarm集群。这个命令就是 docker
命令的 swarm init
选项。 root@swarm-01:~# docker swarm init --advertise-addr 10.0.0.1Swarm 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:2377To 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中。 root@swarm-02:~# docker swarm join \> --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb \> 10.0.0.1:2377This node joined a swarm as a worker.
swarm-02
添加到了swarm中,作为worker节点。Swarm集群中的worker节点的角色是用来运行任务(tasks)的;在该例中,任务(tasks)就是容器(containers)。另一方面,manager节点的角色是管理任务(容器)的编排,并维护Swarm集群本身。 docker
命令的 node ls
选项来验证集群的状态。 root@swarm-01:~# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS13evr7hmiujjanbnu3n92dphk swarm-02.example.com Ready Active awwiap1z5vtxponawdqndl0e7 * swarm-01.example.com Ready Active Leader
swarm-01
和 swarm-02
都处于 Ready
和 Active
状态。因此,我们可以继续在Swarm集群上部署服务了。 docker
命令的 service create
选项。以下命令将创建一个名为 redis
的服务,包含 2
个副本,并在集群中发布 6379
端口。 root@swarm-01:~# docker service create --name redis --replicas 2 --publish 6379:6379 rediser238pvukeqdev10nfmh9q1kr
service create
选项之外,我们还指定了 --name
为 redis
, --replicas
表示该服务需要运行在 2
个不同的节点上。我们可以运行 docker
命令的 service ls
选项来验证该服务是运行在两个节点上的。 root@swarm-01:~# docker service lsID NAME REPLICAS IMAGE COMMANDer238pvukeqd redis 2/2 redis
2
个副本都在运行。如果我们想看到这些任务的更多细节,我们可以运行 docker
命令的 service ps
选项。 root@swarm-01:~# docker service ps redisID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR5lr10nbpy91csmc91cew5cul1 redis.1 redis swarm-02.example.com Running Running 40 minutes ago 1t77jsgo1qajxxdekbenl4pgk redis.2 redis swarm-01.example.com Running Running 40 minutes ago
service ps
选项会显示特定服务的任务(容器)。在本例中,我们可以看到 redis
服务有一个任务(容器)运行在两个Swarm节点上。 redis-cli
客户端来连接该服务。 vagrant@vagrant:~$ redis-cli -h swarm-01.example.com -p 6379swarm-01.example.com:6379>
redis
服务。这意味着我们的服务已经运行起来了。 redis
服务时,我们使用了 --publish
选项。该选项用来告知Docker将端口 6379
发布为 redis
服务的可用端口。 docker
命令来检查集群状态。 root@swarm-01:~# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS13evr7hmiujjanbnu3n92dphk swarm-02.example.com Ready Active awwiap1z5vtxponawdqndl0e7 * swarm-01.example.com Ready Active Leadere4ymm89082ooms0gs3iyn8vtl swarm-03.example.com Ready Active
swarm-01
和 swarm-02
上分别创建了任务(容器)。即便我们添加了另一个worker节点,我们可以看到情况仍然是这样的。 root@swarm-01:~# docker service ps redisID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR5lr10nbpy91csmc91cew5cul1 redis.1 redis swarm-02.example.com Running Running 55 minutes ago 1t77jsgo1qajxxdekbenl4pgk redis.2 redis swarm-01.example.com Running Running 55 minutes ago
redis
服务时,我们指定了 2
个副本。这就意味着,即便我们有了第三个节点,Docker也没有理由在新节点上创建一个新任务。 3
个Swarm节点中的 2
个上运行了服务。在non-swarm的世界中,这就意味着当连接第三个Swarm节点时, redis
服务将变得不可用。然而,Swarm Mode中,情况却不是这样的。 swarm-03
的 redis
端口时,会发生什么呢。 vagrant@vagrant:~$ redis-cli -h swarm-03.example.com -p 6379swarm-03.example.com:6379>
swarm-03
上并未运行任何 redis
容器,但是连接成功了。这是因为,在内部,Docker将 redis
服务流量重路由到运行了 redis
容器的worker节点。 redis
服务的终端用户可以连接到任意一个worker节点。他们会被重定向到运行了任务(容器)的两个Docker宿主机之一。 redis
服务,运行了 2
个副本,这意味着, 3
个节点中的 2
个正在运行容器。 redis
服务在每一个worker节点上运行一个实例,我们可以简单地修改服务的副本数目,从 2
增加到 3
。这意味着,如果我们增加或者减少worker节点数目,我们需要调整副本数目。 redis
服务为Global Service。 root@swarm-01:~# docker service create --name redis --mode global --publish 6379:6379 redis5o8m338zmsped0cmqe0guh2to
docker service create
命令,唯一的区别是指定了 --mode
参数为 global
。 docker
命令的 service ps
选项,我们可以看到,Docker是如何分发该服务的。 root@swarm-01:~# docker service ps redisID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR27s6q5yvmyjvty8jvp5k067ul redis redis swarm-03.example.com Running Running 26 seconds ago 2xohhkqvlw7969qj6j0ca70xx \_ redis redis swarm-02.example.com Running Running 38 seconds ago 22wrdkun5f5t9lku6sbprqi1k \_ redis redis swarm-01.example.com Running Running 38 seconds ago
原文链接:(翻译:夏彬)
原文发布时间为:2016-10-08
本文作者:夏彬
本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。
原文标题:使用Docker Swarm来运行服务
转载地址:http://oxuio.baihongyu.com/