Docker swarm
Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm 使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发。
Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息
Swarm 的结构图
实验环境
系统:rhel7
server1 172.25.41.11
server2 172.25.41.12
server3 172.25.41.13
物理机 172.25.41.250
一·搭建集群
三台主机都需要安装
[root@server1 ~]# ls
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
[root@server1 ~]# yum install -y *
[root@server1 ~]# systemctl start docker
root@server1 ~]# yum install -y bash-* #下载后需要退出再次登陆
[root@foundation41 images]# ssh [email protected]
[root@server1 ~]# docker swarm init
Swarm initialized: current node (297d6raqk1k6wv9b9totipqw6) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2ygj71qpcyda7k802zu0adgk6ly8z3e80jyd0bcxg3g9ajhnl9-bh2zozew8cg76t0i6jscn9dgb \
172.25.41.11:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@server2 ~]# docker swarm join \
> --token SWMTKN-1-2ygj71qpcyda7k802zu0adgk6ly8z3e80jyd0bcxg3g9ajhnl9-bh2zozew8cg76t0i6jscn9dgb \
> 172.25.41.11:2377
[root@server3 ~]# docker swarm join \
> --token SWMTKN-1-2ygj71qpcyda7k802zu0adgk6ly8z3e80jyd0bcxg3g9ajhnl9-bh2zozew8cg76t0i6jscn9dgb \
> 172.25.41.11:2377
[root@server1 ~]# docker node ls
三台主机都需要添加解析
[root@server1 ~]# vim /etc/hosts
172.25.41.250 westos.org
[root@foundation41 westos.org]# cd /tmp/docker/
[root@foundation41 docker]# pwd
/tmp/docker
[root@foundation41 docker]# docker run -d --restart=always --name registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2
[root@foundation41 docker]# docker ps -a
[root@foundation41 docker]# cd /etc/docker/
[root@foundation41 docker]# scp -r certs.d/ [email protected]:/etc/docker/
[root@foundation41 docker]# scp -r certs.d/ [email protected]:/etc/docker/
[root@foundation41 docker]# scp -r certs.d/ [email protected]:/etc/docker/
[root@foundation41 docker]# docker push westos.org/nginx
[root@server1 ~]# docker pull westos.org/nginx
[root@server1 ~]# docker service create --name nginx --publish 80:80 --replicas 3 westos.org/nginx
#在manager节点部署nginx服务,服务数量为3个,公开指定端口是8080映射容器80,使用nginx镜像
[root@server1 ~]# docker service ls
[root@server1 westos.org]# docker service ps nginx
[root@server1 westos.org]# docker service scale nginx=6
[root@server1 westos.org]# docker service ps nginx
# 实现负载均衡
网页访问会发现实现负载均衡
【物理机】
[root@foundation41 docker]# docker load -i visualizer.tar
[root@foundation41 docker]# docker images
[root@foundation41 docker]# docker tag dockersamples/visualizer westos.org/visualizer
[root@foundation41 docker]# docker push westos.org/visualizer
【server1】
root@server1 westos.org]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock westos.org/visualizer
[root@server1 westos.org]# docker service ls
网页访问:172.25.41.11:8080
[root@server1 ~]# docker service scale nginx=3
[root@server1 ~]# docker service ps nginx
[root@server1 ~]# docker ps
[root@server1 ~]# echo server1 > index.html
[root@server1 ~]# docker container cp index.html nginx.5.alzrk6pwrp5cwkkhwxaeon92c:/usr/share/nginx/html
【server2】
[root@server2 ~]# docker ps
[root@server2 ~]# echo server2 > index.html
[root@server2 ~]# docker container cp index.html nginx.4.fbvrxu0hq4392ghog1fdwjw4t:/usr/share/nginx/html
【server3】
[root@server3 ~]# echo server3 > index.html
[root@server3 ~]# docker ps
[root@server3 ~]# docker container cp index.html nginx.2.85yy62a6253peqjx2vyobnuzc:/usr/share/nginx/html
在物理机测试,是否实现负载均衡
[root@foundation41 docker]# for i in {1..10}; do curl 172.25.41.11;done
滚动更新
物理机
root@foundation41 docker]# docker tag rhel7:v1 westos.org/rhel7:v1
[root@foundation41 docker]# docker push westos.org/rhel7:v1
server1
[root@server1 ~]# docker service scale nginx=30
[root@server1 ~]# docker service update --image westos.org/rhel7:v1 --update-parallelism 3 --update-delay 10s nginx
[root@server1 ~]# docker service ps nginx