1.前言
刚开始找资料搭建时,发现网上有两种搭建方式:
第一种:docker run --rm swarm create 一代 Swarm,也被称为 Docker Swarm第二种:docker swarm init 二代 Swarm,这是内置的 Swarm
本文采用第二种方式搭建swarm集群
2.搭建
假设有三台机器:192.168.20.201 192.168.20.202 192.168.20.203,准备用 201 作为master
2-1创建管理节点
docker swarm init --advertise-addr 192.168.20.201
执行完会显示token,创建工作节点时需要该token,Manager和Worker节点之间通信端口是2377
2-2创建子节点
分别在 192.168.20.202 和 192.168.20.203 上执行命令,指定IP:--advertise-addr 192.168.20.202,
我用的是三台云主机,内网不通,必须用 --advertise-addr 指定当前机器IP,否则会造成后面网络不通
docker swarm join --advertise-addr 192.168.20.202 --token 上面的token 192.168.20.202:2377
docker swarm join --advertise-addr 192.168.20.203 --token 上面的token 192.168.20.203:2377
2-3查看集群信息
该命令只能在master上执行
docker node ls
2-4查看节点IP信息
docker node inspect masterdocker node inspect slave01docker node inspect slave02
可以分别查看swarm中各主机的IP,如果跟机器IP不一样,网络会访问不通
3.配置跨主机网络访问
3-1配置docker启动参数
在 /usr/lib/systemd/system/docker.service 中找到 ExecStart=/usr/bin/dockerd 并在其后添加 :
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 结果如下:3-2新建overlay网络
docker network create -d overlay central
4.测试
4-1从仓库拉取一个tomcat镜像
docker pull tomcatdocker tag docker.io/tomcat tomcat
4-2启动镜像,指定网络类型
docker service create -p 8080:8080 --replicas 3 --name web --network central tomcat
4-3查看相关信息
docker service ls
#web为启动镜像时的名称docker service ps web
4-4查看是否在同一网络中
docker network inspect central
central 是我们启动服务时使用的 overlay 网络,由于服务分到了三台机器上,这三台机器都加入了central网络,这样三台主机才能互通
4-4访问测试
分别在 三台机器上 docker ps 均能看见Tomcat项目在运行,用浏览器分别访问:192.168.20.201-3:8080 都会出现tomcat首页
4-5主机互通测试
分别在 master 和 slave01 执行命令,查看到二者的容器IP:
# 查看容器信息,记下这里的 CONTAINER ID 和 NAMESdocker ps# 查看容器详细信息docker inspect f884d3151995
进入 slave02 的容器:
docker psdocker exec -it da10f3f58af7 /bin/bash
测试网络,如果能ping通,则成功,如果不成功,兄弟,那就看缘分了
# 容器IPping 10.0.0.17ping 10.0.0.18# 容器NAMESping web.2.yru4aykeld6h5kgg3nryw0m74ping web.1.7gqta8k7sf8vbsvyvcxnx8vhd
另外,docker stop其中一台机器上的服务,服务会重新自动新建一个:
移除运行项目,必须在master执行:
docker service rm web
4.删除swarm
首先在所有子节点机器执行:
# 子节点退出swarmdocker swarm leave
然后master执行:
# 主节点移除子节点docker node rm slave01 docker node rm slave02# 主节点退出集群docker swarm leave --force