🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] > [教程](https://www.cnblogs.com/stulzq/p/9064828.html)> ## 概述 1. 首先创建 swarm-manager 与 swarm-work* 2. 把所有的work 节点加入到 manager 3. 接下来所有的操作(扩容,升级等)都只需要在 manager 完成 ### 需要先安装 docker-machine 1. 下载 docker-machine`https://github.com/docker/machine/releases/` 1. 下载boot2docker.iso# 从这个地址下载: `https://github.com/boot2docker/boot2docker/releases` 放到`C:\Users\<用户名>\.docker\machine\cache\` 2. 下载 VMware Workstation 驱动 下载 `https://github.com/pecigonzalo/docker-machine-vmwareworkstation/releases/`复制到`C:\Program Files\Docker\Docker\resources\bin` ## 创建集群 ``` // 创建主节点 docker-machine create -d=vmwareworkstation swarm-manager // 连接 docker-machine ssh swarm-manager docker swarm init --advertise-addr 192.168.99.107 #这里的 IP 为创建机器时分配的 ip。 //创建后复制里面的 docker swarm join --token SWMTKN-1-6bw1nt... // 如 docker swarm join --token SWMTKN-1-6bw1nt1vdbwbvbej68ugbj0cmimv9ewnxhh59hfe250ga3y4cw-// 04iabu1strejy904reishm67m 92.168.113.129:2377 // 创建 work1节点 docker-machine create -d=vmwareworkstation swarm-work1 docker-machine ssh swarm-work1 // 执行 join docker swarm join --token SWMTKN-1-6bw1nt1vdbwbvbej68ugbj0cmimv9ewnxhh59hfe250ga3y4cw-// 04iabu1strejy904reishm67m 92.168.113.129:2377 // 创建 work2 节点 docker-machine create -d=vmwareworkstation swarm-work2 docker-machine ssh swarm-work1 // 执行 join docker swarm join --token SWMTKN-1-6bw1nt1vdbwbvbej68ugbj0cmimv9ewnxhh59hfe250ga3y4cw-// 04iabu1strejy904reishm67m 92.168.113.129:2377 // 验证节点是否添加成功,并且node 数量是否是3 docker-machine ssh swarm-manager docker info ... Swarm: active NodeID: vxis2ju3g1zdw3jadj3zo5ogn Is Manager: true ClusterID: thks6vzuhj0dc42pfebf17tai Managers: 1 Nodes: 3 ... ``` ## 部署服务到集群中 ``` docker-machine ssh swarm-manager docker service create --replicas 1 --name helloworld alpine ping docker.com // 查看部署信息 docker service inspect --pretty helloworld ID: hls28u2zjeytx2wed8thvi2g6 Name: helloworld Service Mode: Replicated Replicas: 1 ... // 扩展集群服务.容器数量可大于节点数量,会在一个节点中创多个相同的容器 docker service scale helloworld=2 // 查看可以看到两个服务在运行 docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lyd8e0fdxexy helloworld.1 alpine:latest swarm-manager Running Running 5 minutes ago gm8s96xi1k11 helloworld.2 alpine:latest swarm-work1 Running Running about a minute ago // 删除集群 docker service rm helloworld ``` ## 滚动升级服务 模拟 redis 的服务升级 ``` docker-machine ssh swarm-manager docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6 //查看 docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS g77wc7mvg1mt redis.1 redis:3.0.6 swarm-work1 Running Running 4 minutes ago /滚动升级redis docker service update --image redis:3.0.7 redis ``` ## 停止某个节点接收新的任务 主要用来排除把 master 节点运行业务容器 ``` > docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION vxis2ju3g1zdw3jadj3zo5ogn * swarm-manager Ready Active Leader 19.03.12 soifxxowwqscqzpktdi7o5yz7 swarm-work1 Ready Active Reachable 19.03.12 kmab2t8a3rzuclj2r9v8hydy1 swarm-work2 Ready Active 19.03.12 // 可以看到当前节点都是 Active 状态 // 排除管理节点 > docker node update --availability drain swarm-manager ``` ### NFS 共享数据卷 ``` yum -y install nfs-utils rpcbind // 启动服务 sudo service rpcbind start sudo service nfs start // 共享目录设置权限: > vi /etc/exports /data/k8s *(rw,sync,no_root_squash) //共享目录设置权限: chmod 755 /data/k8s/ // 重新加载NFS配置 sudo exportfs -rav //查看共享的目录 sudo exportfs -rav 查看共享目录列表 showmount -e 192.168.52.141 // 测试挂载目录 sudo mkdir /mynfs sudo mount -t nfs 192.168.52.141:/nfs /mynfs // 在/mynfs目录中创建文件,然后在NFS服务端的共享目录中查看文件是否存在,存在则代表共享成功。 umount /mynfs ``` 创建数据卷 ``` volumes: my-vol: driver_opts: type: "nfs" o: "addr=192.168.52.141,rw" device: ":/volume1/swarm" ``` 创建服务 ``` docker service create \ --mount type=volume,source=<Volume-Name>,destination=<Container-Path> \ --replicas 2 \ <Image> // 如 docker service create --name nfs-service \ --mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.2.58,rw,nfsvers=4,async"' \ -d p 8010:80 --replicas 3 nginx:latest ```