在 Docker 1.12 版本发布之后,swarm合并到了 Docker 中,成为 Docker 的一个子命令。Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具,它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。
本章节将要讲解docker compose、docker machine、docker swarm中的docker swarm ,这三个项目都是docker的原生支持,号称docker三剑客,掌握后基本可以帮助您管理docker集群。
Docker Swarm 优点
Docker swarm节点分为manager管理节点和worker工作节点。
Task任务是swarm中的最小调度单位,可以理解为一个单一的容器。
Services服务是指一组任务的集合,服务定义了任务的属性。
docker swarm相比kubernetes、mesos项目,还是显得单薄,更加适合小规模docker集群。
准备虚拟机,server1负责私有harbor仓库,server2负责docker swarm 集群leader , server3、server4为集群后端
server1:
配置harbor私有容器仓库,详细配置步骤可查看本人博客:
企业运维实战–最全Docker学习笔记2.本地容器仓库加密认证、harbor远程容器仓库搭建
配置好harbor后,启动(第一次执行脚本安装后无需此操作)
docker-compose up -d
上传镜像myapp到容器仓库
docker load -i myapp.tar
打标签
docker tag ikubernetes/myapp:v1 hyl.westos.org/library/myapp:v1
docker tag ikubernetes/myapp:v2 hyl.westos.org/library/myapp:v2
docker push hyl.westos.org/library/myapp:v1
docker push hyl.westos.org/library/myapp:v2
server2:
初始化集群
docker swarm init
docker node ls
为server3、server4安装docker-ce,解决warning
cd /etc/sysctl.d/
scp docker.conf [email protected]:/etc/sysctl.d/
scp docker.conf [email protected]:/etc/sysctl.d/
server3、server4连接仓库,传递认证key和仓库json文件
cd /etc/docker/
ls
cat daemon.json
{
"registry-mirrors": ["https://hyl.westos.org"]
}
scp daemon.json root@172.25.9.3:/etc/docker/
scp daemon.json root@172.25.9.4:/etc/docker/
scp -r certs.d/ root@172.25.9.3:/etc/docker/
scp -r certs.d/ root@172.25.9.4:/etc/docker/
server3、4:
安装docker-ce服务,配置连接server1仓库,加入servre2docker swarm集群
# 取消warning
sysctl --system
# 密钥和仓库文件接收完成后,reload docker
systemctl reload docker
# 加入172.25.9.2的集群当中,需要配置好docker才可操作
docker swarm join --token SWMTKN-1-1ttb8r7xm8d390mczvei5wpgi1fmjsdykoyp1h8oa7d9v91wq4-0zu8b6xmia2nocdctozzvt6kp 172.25.9.2:2377
server2:
创建集群服务,名为webservice 端口映射80:80 开启三个节点 镜像为myapp:v1
docker service create --name webservice --publish 80:80 --replicas 3 myapp:v1
查看集群和集群节点服务
docker service ls
docker service ps webservice
可以在worker主机中查看镜像myapp已经pull到本地
测试访问:curl 172.25.9.2/hostname.html 可以看到访问的主机节点负载均衡
命令扩容:添加集群数量到6个
docker service scale webservice=6
docker service ps webservice
再次访问,六台worker主机均负载均衡,采用算法为默认的rr轮询
使用yaml脚本添加监控visualizer并更新设定swarm镜像版本
harbor容器仓库主机server1操作:
将visualizer镜像压入harbor仓库,
编写docker-compose脚本
vim docker-compose.yml
version: "3.8"
services:
web:
image: myapp:v2
ports:
- "80:80" #端口映射,主机80映射容器80
networks:
- webnet #网络接口为webnet
deploy:
replicas: 6 #20 拉起容器的数量
update_config:
parallelism: 2 #5 每次更新的数量
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:
使用脚本拉起swarm服务集群,名为mycluster
docker stack deploy -c docker-compose.yml mycluster
查看集群状态
docker stack ls
docker stack ps mycluster
网页访问监控visualizer,映射端口到主机的8080
firefox:172.25.9.2:8080
修改yaml脚本,重新拉起容器即视为更新版本
swarm集群在创建成功时会自动添加虚拟网卡
docker network ls
在前面的操作中,我们采用命令行的方式建立了swarm集群,但是这样的命令行并不是每一个运维或开发人员都熟记的,而且操作起来会比较麻烦。所以需要添加为swarm集群管理添加图形化管理界面。
将准备好的镜像压入harbor容器仓库
docker load -i portainer-agent.tar
docker load -i portainer.tar
创建harbor新项目,portainer
注意:此处一定要将仓库设置为公开,否则无法匿名push镜像!!
添加标签,压入仓库
docker tag portainer/portainer:latest hyl.westos.org/portainer/portainer:latest
docker tag portainer/agent:latest hyl.westos.org/portainer/agent:latest
docker push hyl.westos.org/portainer/portainer:latest
docker push hyl.westos.org/portainer/agent:latest
查看镜像是否上传完成
在manager主机中执行脚本
scp portainer-agent-stack.yml root@172.25.9.2:
docker stack deploy -c portainer-agent-stack.yml portainer
docker service ls
查看测试脚本
cat 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:
网页访问图形管理界面,映射端口为9000
172.25.9.2:9000
输入账户密码,即可进入管理界面,首次进入需要设定管理账户和密码
关闭并离开集群:
manager主机:
docker swarm leave --force
worker主机:
docker swarm leave