docker1.12版本之后集成了swarm模块,直接使用dokcer-engin就能很方便地创建一个docker集群,不用再像以前那样第三方配置。
环境:
manager/node1 : swarm_node1
node2 : swarm_node2
1:首先在各节点上安装最新版dokcer
1
2
3
|
# curl -fsSL https://test.docker.com/ | sh
# docker -v
Docker version 1.12.0-rc4, build e4a0dbc
|
2:在node1上初始化一个swarm集群
swarm_node1:
1
2
3
4
5
6
7
8
|
[root@swarm_node1 ~]
# docker swarm init
No --secret provided. Generated random secret:
dm18yjza2eb00wsbbk1hleq8q
Swarm initialized: current node (4abdf6see9vqr83emyhdf529s) is now a manager.
To add a worker to this swarm, run the following
command
:
docker swarm
join
--secret dm18yjza2eb00wsbbk1hleq8q \
--ca-
hash
sha256:cda112fa02a5c17850852b4d65366bb8484bcb204a46ae97063648b5545e277d \
192.168.1.131:2377
|
3:根据提示,把node2添加进swarm集群
swarm_node2:
1
2
|
[root@swarm_node2 ~]
# docker swarm join --secret dm18yjza2eb00wsbbk1hleq8q --ca-hash sha256:cda112fa02a5c17850852b4d65366bb8484bcb204a46ae97063648b5545e277d 192.168.1.131:2377
This node joined a Swarm as a worker.
|
提示节点添加成功。
4:查看集群状态,需在管理节点node1上:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
[root@swarm_node1 ~]
# docker swarm inspect
[
{
"ID"
:
"0kx8spry37citf16ty448y65e"
,
"Version"
: {
"Index"
: 11
},
"CreatedAt"
:
"2016-08-05T02:09:17.248225691Z"
,
"UpdatedAt"
:
"2016-08-05T02:09:17.861408652Z"
,
"Spec"
: {
"Name"
:
"default"
,
"AcceptancePolicy"
: {
"Policies"
: [
{
"Role"
:
"worker"
,
"Autoaccept"
:
true
,
"Secret"
:
"$2a$10$oqvNfMPFiKIrEvYrZENRGOxsJly8.QnzNZ7XDKkP20MN8027N3gxm"
},
{
"Role"
:
"manager"
,
"Autoaccept"
:
false
,
"Secret"
:
"$2a$10$oqvNfMPFiKIrEvYrZENRGOxsJly8.QnzNZ7XDKkP20MN8027N3gxm"
}
]
},
"Orchestration"
: {
"TaskHistoryRetentionLimit"
: 10
},
"Raft"
: {
"SnapshotInterval"
: 10000,
"LogEntriesForSlowFollowers"
: 500,
"HeartbeatTick"
: 1,
"ElectionTick"
: 3
},
"Dispatcher"
: {
"HeartbeatPeriod"
: 5000000000
},
"CAConfig"
: {
"NodeCertExpiry"
: 7776000000000000
}
}
}
]
[root@swarm_node1 ~]
# docker node ls
ID HOSTNAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
4abdf6see9vqr83emyhdf529s * swarm_node1 Accepted Ready Active Leader
cs95yh0c4c0fo892996m5wozk swarm_node2 Accepted Ready Active
|
可以看到各节点的状态(Active)和角色(Leader)等。
5:service管理
1.12新增了service命令,用于管理一个服务。例如我们需要一个test的服务,需要两个容器,运行ping的命令:
1
2
3
4
5
6
7
8
9
10
11
|
[root@swarm_node1 ~]
# docker service create --name test --replicas 2 centos ping 127.0.0.1
bgach5ib1uoubo2ljarrx48xu
[root@swarm_node1 ~]
# docker service ls
ID NAME REPLICAS IMAGE COMMAND
bgach5ib1uou
test
0
/2
centos
ping
127.0.0.1
[root@swarm_node1 ~]
# docker service tasks test
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
5rw3fr6xdl3kojhh28qzg8yos
test
.1
test
centos Preparing 21 seconds ago Running swarm_node1
1l9siyzbflljowd543c5ehdil
test
.2
test
centos Preparing 21 seconds ago Running swarm_node2
|
--repicas 2指定了服务的个数为2,可以看到在node1,node2上分别跑了一个容器,组成了一个test的服务。
6:service的错误恢复与容器迁移。
service的新特性最大的亮点是错误迁移与恢复的机制,如果某一个节点上的docker服务下线了,或者服务器出现故障,swarm集群会检测service是否发生变动,如果发现某个节点故障,会在另外的节点恢复容器,以保证service的完整。
比如,这时,我让swarm_node2退出swarm集群:
1
2
|
[root@swarm_node2 ~]
# docker swarm leave
Node left the swarm.
|
再查看test服务:
1
2
3
4
|
[root@swarm_node1 ~]
# docker service tasks test
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
5rw3fr6xdl3kojhh28qzg8yos
test
.1
test
centos Preparing 5 minutes ago Running swarm_node1
9pzt555uzeswik14lj6bp96hf
test
.2
test
centos Preparing about a minute ago Running swarm_node1
|
可以看到test这个服务依旧保持了2个容器,而且由于node2已经下线,容器全部迁移到了node1。
本文转自 icenycmh 51CTO博客,原文链接:http://blog.51cto.com/icenycmh/1834643,如需转载请自行联系原作者