一、Docker swarm搭建

Docker swarm是多节点容器编排技术,另外一个主流多节点容器编排技术就是k8s;所以前提是需要准备多台Linux机器(并且这些机器能够相互通信,机器名称要有区分,便于观察是哪台机器)以及每台机器都安装docker环境 centOS安装docker 这里以三台机器搭建Docker swarm集群,一台manager节点,两台worker节点;在新版本的docker中已经内置了Docker swarm环境,所以这里只需要将这三台机器按照,一台manager和两台worker的模式进行构建集群即可。

1、manager节点创建
在决定作为manager节点的机器中执行下面的命令

docker swarm init

在这里插入图片描述

--advertise-addr 192.168.117.128 该参数的作用是指定manager节点的ip地址,该参数可不写

上面执行成功之后有一句输出是:
docker swarm join --token SWMTKN-1-2zji96p1mbmzmgq2tm6slb3r48zadhcpbcfkvqrm1umsfr03u0-7jf3i9s9uuy9zitvz957ii35w 192.168.117.128:2377
这句命令就是想要将机器加入到manager节点的集群中需要执行的命令。
2、将worker节点加入到集群中
在两台worker节点的机器中分别执行下面的命令

docker swarm join --token SWMTKN-1-2zji96p1mbmzmgq2tm6slb3r48zadhcpbcfkvqrm1umsfr03u0-7jf3i9s9uuy9zitvz957ii35w 192.168.117.128:2377

即刚刚创建manager节点提示的命令。
在这里插入图片描述
有可能会遇到以下报错:
Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = “transport: Error while dialing dial tcp 192.168.117.128:2377: connect: no route to host”
意思是不能和 192.168.117.128:2377 通信,但是我们在创建这三台Linux机器的时候使用ping命令保证了这三台机器可以通信,其实这里主要就是Docker swarm使用了2377端口进行通信,但是2377端口未在防火墙中打开,导致不能通信的,所以解决办法两种:一种是关闭manager节点防火墙,一种是manager节点防火墙放开2377端口,如果manager节点是阿里云服务器需要在安全组中放开2377端口。

systemctl stop firewalld.service  #关闭防火墙
firewall-cmd --zone=public --add-port=2377/tcp --permanent  #防火墙放开2377端口
firewall-cmd --reload  #刷新防火墙,不论是关闭防火墙还是放开某个端口都需要刷新才会生效
firewall-cmd --list-all --permanent  #查看防火墙放开了哪些端口
systemctl status firewalld.service  #查看防火墙状态

然后在worker节点中再次执行上面的join命令,就可以成功将worker节点加入到Docker swarm的集群中。
3、查看集群中有哪些节点加入

docker node ls  #该命令只能在manager节点中执行

在这里插入图片描述
这样我们需要的三台机器搭建的集群就成功了。

二、Docker swarm常用命令

docker swarm leave: 将本机离开集群-针对于worker节点,该worker节点离开集群后,Docker swarm会将这个worker节点标记为Down状态,并且本机上Docker swarm使用的network也会被删除
在这里插入图片描述
在这里插入图片描述
docker swarm leave --force:将本机离开集群-针对于manager/worker节点,manager节点离开集群后,该集群就不存在了,并且本机上Docker swarm使用的network也会被删除
在这里插入图片描述
docker node promote 机器ID/HOSTNAME:将集群中的某台机器升级为manager(如果使用HOSTNAME需要保证集群中机器的HOSTNAME不重复,推荐使用HOSTNAME),这样这台机器在manager挂了的情况下就有权参与新的manager的选举
docker node demote 机器ID/HOSTNAME:将集群中的某台机器降级为worker(如果使用HOSTNAME需要保证集群中机器的HOSTNAME不重复,推荐使用HOSTNAME)
在这里插入图片描述
docker node ls:查看当前集群中的机器信息
docker service ls:查看当前集群中的服务信息,如果某个服务有多个容器的话也只有一条信息
docker service rm 服务名称:删除当前集群中的某个服务,其所有的容器也会被删除
docker service create --name 服务名称 image:在当前集群中创建某个服务,该命令创建的服务会分配运行在集群中的机器上(以容器的形式体现),通过docker ps命令可在对应的机器上查看到运行的容器
可选参数:

--env:和docker的 -e 命令同样的效果及用法(也就是同样的--env只能写一个可选参数键值,要想再写可选参数键值需要再写 --env )
--mount type=volume,source=v1,destination=/var/lib/mysql:和docker的-v v1:/var/lib/mysql一样的效果
--network:指定使用的网络和docker的 --network或--net作用一致,只是这里没有--net的简写,必须是--network;该参数一般指定的网络类型会是overlay类型的网络而非常见的bridge、host、null类型的网络,因为overlay类型的网络才能实现多机通信,而Docker swarm就是管理多机的容器编排的,如果在manager节点创建service的时候指定--network,Docker swarm又将容器运行在了worker节点,那么会将指定的网络同步到worker节点中,这样就实现了访问集群中任意一台机器的对应端口都能访问到这个容器。
-p:指定端口映射,如:-p 8080:8080
--replicas:指定该服务在集群中运行的容器的数量,如:--replicas=3就是为该服务在集群中创建3个容器,和后面的scale命令等效

docker run的可选参数基本Docker service create都有,比如 -d。
在这里插入图片描述

docker service ps 服务名称:查看某个服务名称的容器信息,服务名称一定要写,如果某个服务有多个容器会有多条信息
在这里插入图片描述
docker service scale 服务名称=容器数量:扩缩容某个服务的容器数量,前提是Docker swarm集群中有这个名称的服务,水平扩容的容器会根据Docker swarm的调度分配在集群中的机器上,比如将某个服务扩容为容器数量3个,如果其中一个容器挂掉了,Docker swarm会再去自动创建一个该服务的容器。
在这里插入图片描述
docker service logs 服务名称:查看某个服务的日志信息
在这里插入图片描述
docker service inspect 服务名称:查看某个服务的详情
在这里插入图片描述
其他的命令和docker的命令类似,只是需要docker service开头。

三、Docker swarm yml文件

和docker-compose的yml文件编写一致,注意需要使用 deploy 指令,作用也是方便多容器的编排而不用每次写很多命令。
docker-compose常用命令及yml文件编写

使用docker stack命令运行yml文件:docker stack deploy -c yml文件 服务名称
如:docker stack deploy -c service.yml test-service
docker stack命令官方文档
docker-compose.yml文件官方文档

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐