Docker使用Swarm组建集群的方法
Swarm在Docker1.12版本之前属于一个独立的项目,在Docker1.12版本发布之后,该项目合并到了Docker中,成为Docker的一个子命令。目前,Swarm是Docker社区提供的唯一一个原生支持Docker集群管理的工具。它可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。
Docker使用Swarm可以很方便的在多个主机上创建容器集群,并且容器之间可以跨主机网络通信。
Swarm的集群分为Manager节点和Worker节点。
Swarm中使用Service来创建/管理使用相同镜像的多个容器,多个容器同时对外提供服务,多个容器之间负载均衡。每个Service有一个浮动IP(VIP),各个容器还有自己的物理IP。创建基于Swarm的Overlay网络,将Service挂载到此网络上。然后Service中的各个容器便可以通过Service名称和IP地址实现网络互通。
下面使用了三个机器来组建一个Swarm集群
bd0 192.168.0.109
bd1 192.168.0.192
bd2 192.168.0.193
Docker开启远程管理
默认情况下,Docker守护进程会生成一个/var/run/docker.sock文件来进行本地进程通信,而不会监听任何端口,所以默认情况下Docker只能在本地使用命令行操作。如果要在其它机器上远程操作Docker主机,就需要让Docker监听一个端口,这样才能实现远程通信。
在我的CentOS7X上,首先修改Docker配置文件/etc/sysconfig/docker中的OPTIONS参数,添加
-Hunix:///var/run/docker.sock-H0.0.0.0:5555
修改后参数类似
OPTIONS='--selinux-enabled--log-driver=journald--signature-verification=false-Hunix:///var/run/docker.sock-H0.0.0.0:5555'
然后重新启动Docker服务
$sudosystemctlrestartdocker.service
测试一下
sudodocker-H
创建Swarm集群
获取Swarm镜像
分别在三个节点上下载swarm镜像
$sudodockerpullswarm
初始化Swarm集群
首先在bd0节点上初始化Swarm集群
$sudodockerswarminit Errorresponsefromdaemon:couldnotchooseanIPaddresstoadvertisesincethissystemhasmultipleaddressesondifferentinterfaces(192.168.0.109oneth0and192.168.122.1onvirbr0)-specifyonewith--advertise-addr
第一次创建失败了,原因是我的机器有两块网卡,Swarm不知道要用那块网卡组建集群,所以需要使用--advertise-addr来指定使用那块网卡。
$sudodockerswarminit--advertise-addr192.168.0.109 Swarminitialized:currentnode(1egy2ark49q6xokudps5wykhn)isnowamanager. Toaddaworkertothisswarm,runthefollowingcommand: dockerswarmjoin\ --tokenSWMTKN-1-0x11m2uk7ps9bh7nflkxwirgv0syvacl18rut3hilz4i9lgis3-d9m22hixt0b57hjj81im8bqdl\ 192.168.0.109:2377
Toaddamanagertothisswarm,run'dockerswarmjoin-tokenmanager'andfollowtheinstructions.
然后分别在bd1和bd2节点上运行下面命令将机器加入集群
$sudodockerswarmjoin\ --tokenSWMTKN-1-0x11m2uk7ps9bh7nflkxwirgv0syvacl18rut3hilz4i9lgis3-d9m22hixt0b57hjj81im8bqdl\ 192.168.0.109:2377
Thisnodejoinedaswarmasaworker.
下面查看一下集群节点信息
$sudodockernodels IDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUS 11ochjq4o1s2m6w4u8jxb37w6bd1ReadyActive 1egy2ark49q6xokudps5wykhn*bd0ReadyActiveLeader b4e2ywnhhd6fhgfxtr1qh4gewbd2ReadyActive
创建集群跨主机网络
首先查看一下集群网络
$sudodockernetworkls NETWORKIDNAMEDRIVERSCOPE 36679de6466bbridgebridgelocal 72e853673d8bdocker_gwbridgebridgelocal b45cef05e017hosthostlocal 1zzlk9hpwyqyingressoverlayswarm
添加一个Swarm网络
$sudodockernetworkcreate--driveroverlaymyswarm a04evrfrr4cvnbvrummzvg0mn
创建后,查看一下集群网络
$sudodockernetworkls NETWORKIDNAMEDRIVERSCOPE 36679de6466bbridgebridgelocal 72e853673d8bdocker_gwbridgebridgelocal b45cef05e017hosthostlocal 1zzlk9hpwyqyingressoverlayswarm a04evrfrr4cvmyswarmoverlayswarm
部署服务
这里使用nginx服务来演示一下怎样创建一个服务集群。
下载nginx镜像
$sudodockerpullnginx
创建服务
$sudodockerservicecreate--replicas2--namemynginx-p8000:80--network=myswarmnginx 5xrm96xveqw5gq63srts1rbhw
这里创建了需要两个nginx实例的nginx服务。同时,为了能被外网地址访问,我们做了一下端口映射,映射到物理主机的8000端口。
查看服务
$sudodockerservicels IDNAMEREPLICASIMAGECOMMAND 5xrm96xveqw5mynginx2/2nginx $sudodockerservicepsmynginx IDNAMEIMAGENODEDESIREDSTATECURRENTSTATEERROR 1crmc5ecsjoci8xavxzbnbks3mynginx.1nginxbd0RunningRunning23secondsago divhrq89xhxka8bvb8r9zqqhzmynginx.2nginxbd2RunningRunning20secondsago $sudodockerserviceinspectmynginx ... "VirtualIPs":[ { "NetworkID":"1zzlk9hpwyqyocloxy9j9vct7", "Addr":"10.255.0.6/16" }, { "NetworkID":"a04evrfrr4cvnbvrummzvg0mn", "Addr":"10.0.0.2/24" } ] ...
在bd0上查看
$sudodockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES e480d427fd51nginx:latest"nginx-g'daemonoff"41secondsagoUp40seconds80/tcpmynginx.1.1crmc5ecsjoci8xavxzbnbks3
在bd2上查看
$sudodockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES c12d4f9eb457nginx:latest"nginx-g'daemonoff"56secondsagoUp52seconds80/tcpmynginx.2.divhrq89xhxka8bvb8r9zqqhz
服务已经创建并启动了,下面我们在浏览器访问http://bd0:8000来验证一下nginx服务的状态。
服务的Failover
首先我们查看一下当前服务的状态
$sudodockerservicepsmynginx IDNAMEIMAGENODEDESIREDSTATECURRENTSTATEERROR 1crmc5ecsjoci8xavxzbnbks3mynginx.1nginxbd0RunningRunning23secondsago divhrq89xhxka8bvb8r9zqqhzmynginx.2nginxbd2RunningRunning20secondsago
然后在bd2上将其上的服务停止
$sudodockerkillmynginx.2.divhrq89xhxka8bvb8r9zqqhz mynginx.2.divhrq89xhxka8bvb8r9zqqhz
再次观察服务状态,如下:
$sudodockerservicepsmynginx IDNAMEIMAGENODEDESIREDSTATECURRENTSTATEERROR 1crmc5ecsjoci8xavxzbnbks3mynginx.1nginxbd0RunningRunning6minutesago br5iyie0dr945ixnq7s77kunrmynginx.2nginxbd1RunningRunning4secondsago divhrq89xhxka8bvb8r9zqqhz\_mynginx.2nginxbd2ShutdownFailed5secondsago"task:non-zeroexit(137)"
可以看到在bd1上又起了一个实例用来接替原来在bd2上的实例。
服务的扩容/缩容
增加服务实例
$sudodockerservicescalemynginx=3 mynginxscaledto3 $sudodockerservicepsmynginx IDNAMEIMAGENODEDESIREDSTATECURRENTSTATEERROR 1crmc5ecsjoci8xavxzbnbks3mynginx.1nginxbd0RunningRunning7minutesago br5iyie0dr945ixnq7s77kunrmynginx.2nginxbd1RunningRunningaboutaminuteago divhrq89xhxka8bvb8r9zqqhz\_mynginx.2nginxbd2ShutdownFailedaboutaminuteago"task:non-zeroexit(137)" 985tln0aprsvjthjpve0n6qmzmynginx.3nginxbd2RunningPreparing3secondsago
减少服务实例
$sudodockerservicescalemynginx=2 mynginxscaledto2 $sudodockerservicepsmynginx IDNAMEIMAGENODEDESIREDSTATECURRENTSTATEERROR 1crmc5ecsjoci8xavxzbnbks3mynginx.1nginxbd0RunningRunning7minutesago br5iyie0dr945ixnq7s77kunrmynginx.2nginxbd1ShutdownShutdownlessthanasecondago divhrq89xhxka8bvb8r9zqqhz\_mynginx.2nginxbd2ShutdownFailedaboutaminuteago"task:non-zeroexit(137)" 985tln0aprsvjthjpve0n6qmzmynginx.3nginxbd2RunningRunning5secondsago
删除服务
$sudodockerservicermmynginx
总结
以上所述是小编给大家介绍的Docker使用Swarm组建集群的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!