docker1.12版本之后集成了swarm模块,直接使用dokcer-engin就能很方便地创建一个docker集群,不用再像以前那样第三方配置。
环境:
manager/node1 : swarm_node1
node2 : swarm_node2
1:首先在各节点上安装最新版dokcer
#curl-fsSLhttps://test.docker.com/|sh #docker-v Dockerversion1.12.0-rc4,builde4a0dbc
2:在node1上初始化一个swarm集群
swarm_node1:
[root@swarm_node1~]#dockerswarminit No--secretprovided.Generatedrandomsecret: dm18yjza2eb00wsbbk1hleq8q Swarminitialized:currentnode(4abdf6see9vqr83emyhdf529s)isnowamanager. Toaddaworkertothisswarm,runthefollowingcommand: dockerswarmjoin--secretdm18yjza2eb00wsbbk1hleq8q\ --ca-hashsha256:cda112fa02a5c17850852b4d65366bb8484bcb204a46ae97063648b5545e277d\ 192.168.1.131:2377
3:根据提示,把node2添加进swarm集群
swarm_node2:
[root@swarm_node2~]#dockerswarmjoin--secretdm18yjza2eb00wsbbk1hleq8q--ca-hashsha256:cda112fa02a5c17850852b4d65366bb8484bcb204a46ae97063648b5545e277d192.168.1.131:2377 ThisnodejoinedaSwarmasaworker.
提示节点添加成功。
4:查看集群状态,需在管理节点node1上:
[root@swarm_node1~]#dockerswarminspect [ { "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~]#dockernodels IDHOSTNAMEMEMBERSHIPSTATUSAVAILABILITYMANAGERSTATUS 4abdf6see9vqr83emyhdf529s*swarm_node1AcceptedReadyActiveLeader cs95yh0c4c0fo892996m5wozkswarm_node2AcceptedReadyActive
可以看到各节点的状态(Active)和角色(Leader)等。
5:service管理
1.12新增了service命令,用于管理一个服务。例如我们需要一个test的服务,需要两个容器,运行ping的命令:
[root@swarm_node1~]#dockerservicecreate--nametest--replicas2centosping127.0.0.1 bgach5ib1uoubo2ljarrx48xu [root@swarm_node1~]#dockerservicels IDNAMEREPLICASIMAGECOMMAND bgach5ib1uoutest0/2centosping127.0.0.1 [root@swarm_node1~]#dockerservicetaskstest IDNAMESERVICEIMAGELASTSTATEDESIREDSTATENODE 5rw3fr6xdl3kojhh28qzg8yostest.1testcentosPreparing21secondsagoRunningswarm_node1 1l9siyzbflljowd543c5ehdiltest.2testcentosPreparing21secondsagoRunningswarm_node2
--repicas 2指定了服务的个数为2,可以看到在node1,node2上分别跑了一个容器,组成了一个test的服务。
6:service的错误恢复与容器迁移。
service的新特性最大的亮点是错误迁移与恢复的机制,如果某一个节点上的docker服务下线了,或者服务器出现故障,swarm集群会检测service是否发生变动,如果发现某个节点故障,会在另外的节点恢复容器,以保证service的完整。
比如,这时,我让swarm_node2退出swarm集群:
[root@swarm_node2~]#dockerswarmleave Nodelefttheswarm.
再查看test服务:
[root@swarm_node1~]#dockerservicetaskstest IDNAMESERVICEIMAGELASTSTATEDESIREDSTATENODE 5rw3fr6xdl3kojhh28qzg8yostest.1testcentosPreparing5minutesagoRunningswarm_node1 9pzt555uzeswik14lj6bp96hftest.2testcentosPreparingaboutaminuteagoRunningswarm_node1
可以看到test这个服务依旧保持了2个容器,而且由于node2已经下线,容器全部迁移到了node1。