Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具,swarm和docker是无缝衔接,且操作简单,小巧灵活。Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络,组成docker集群。
一般来说swarm很适合小规模集群使用,性能表现良好;对于容器的调度很灵活;它提供api接口,支持更多功能模块的兼容;Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。
docker swarm节点分为manager节点和worker节点,他们之间的连接是通过http。任务 (Task)是最小的调度单位,目前来说就是一个单一的容器。服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
在 Docker 1.12 版本发布之后,swarm内嵌在docker中,成为 Docker 的一个子命令,无需额外安装,使用便利
现在准备四台虚拟机,server1(172.25.11.1)、server2(172.25.11.2)、server3(172.25.11.3)、server4(172.25.11.4)都已经安装docker,我们想在server1中部署harbor仓库,server2做Docker Swarm集群的manager,server3和server4做Docker Swarm集群的worker。
这里加入harbor仓库的目的是可以加速docker pull拉取镜像,不然本地找不到就去网上拉取,速度很慢。因为前面已经搭建harbor,这里不再赘述,详见以前博客运维实操——docker容器(四)搭建远程容器仓库harbor、漏洞扫描和内容信任.
server2、server3、sever4都提前安装了docker-ce
docker-compose up -d后台开启harbor
为了免密,通信方便,之前server1已经给了server2和server3,现在再给一份server4
server1把证书发给server2、server3、server4
为了使server2、server3、server4可以访问到仓库地址,我们需要在/etc/docker中写入daemon.json文件,告诉仓库地址。
server2、server3、server4都需要有daemon.json文件
然后都重启docker,docker info查看可以知道仓库地址
server2、server3、server4都要加入仓库的地址解析
为了后续的效果,提前给仓库导入myapp镜像,他包括myapp:v1和myapp:v2
修改标签为仓库中的library库,并上传至harbor仓库中
server2初始化swarm集群,谁初始化,谁默认就是manager
注意初始化的结果里有其他节点加入的token,保留好
在server2中,docker node ls查看节点是否成功加入,可以看到server2是leader
docker service create --name webservice --publish 80:80 --replicas 3 myapp:v1
创建集群服务,命名为webservice,物理机的80端口映射到容器内的80端口,副本数量为3,使用myapp:v1镜像
curl 172.25.9.2/hostname.html 可以看到访问的服务自动负载均衡,三个服务,一人一次
curl 172.25.9.2/hostname.html 可以看到访问的服务自动负载均衡,六个结点,一人一次
github上可以搜索visualizer
我们想要有个监控方便查看
首先导入visualizer镜像
修改标签为仓库library中,上传镜像
创建服务,副本6个。
创建监控,名字叫viz,8080端口映射到8080。
访问172.25.11.2:8080,可以看到六个服务,一个监控
把原来的v1更新为v2,parallelism参数是表示一次更新几个,这里是一次更新五个;delay参数是表示延迟几秒,这里是每隔5秒更新一次。网页也可以清晰的看出这个过程
在前面的操作中,我们采用命令行的方式建立了swarm集群,但是这样的命令行并不是每一个运维或开发人员都熟记的,而且操作起来会比较麻烦,想要一个脚本直接执行。
编写docker-compose脚本
[root@server2 ~]# cat docker-compose.yml
version: "3.8"
services:
web:
image: myapp:v1
ports:
- "80:80" %端口映射,主机80映射容器80
networks:
- webnet %网络接口为webnet
deploy:
replicas: 6 %副本数量为6
update_config:
parallelism: 2 %每次更新的数量为2
delay: 5s %更新时间间隔
restart_policy:
condition: on-failure
visualizer:
image: visualizer:latest
ports:
- "8080:8080" %监控端口为主机映射8080到容器的8080
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
networks:
webnet:
docker stack ps mycluster,查看到原来的v1也在,这是为了回滚的时候有。
光有监控还是不够理想,想要为swarm集群管理添加图形化管理界面。
准备portainer-agent.tar和portainer.tar
为了更好的区分,在仓库中新建一个项目portainer,公开
编写portainer-agent-stack.yml文件
version: '3.2'
services:
agent:
image: portainer/agent
environment:
# REQUIRED: Should be equal to the service name prefixed by "tasks." when
# deployed inside an overlay network
AGENT_CLUSTER_ADDR: tasks.agent
# AGENT_PORT: 9001
# LOG_LEVEL: debug
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9000:9000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
执行portainer-agent-stack.yml文件部署服务
输入账户密码,即可进入管理界面,首次进入需要设定管理账户和密码
监控到六个
如果要离开集群
对于worker输入docker swarm leave
对于manager输入docker swarm leave --force