Swarm介绍
Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群管理和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。
Docker Engine CLI和API包括了管理Swarm节点命令,比如添加、删除节点,以及在Swarm中部署和编排服务。也增加了服务栈(Stack)、服务(Service)、任务(Task)概念。
Swarm特点
1. 集成集群管理
使用Docker Engine CLI 创建一个Docker Engine的Swarm模式,在集群中部署应用程序服务。
2. 去中心化设计
Swarm角色分为Manager和Worker节点,Manager节点故障不影响应用使用。
3. 扩容缩容
可以声明每个服务运行的容器数量,通过添加或删除容器数自动调整期望的状态。
4. 期望状态协调
Swarm Manager节点不断监视集群状态,并调整当前状态与期望状态之间的差异。
5. 多主机网络
可以为服务指定overlay网络。当初始化或更新应用程序时,Swarm manager会自动为overlay网络上的容器分配IP地址。
6. 服务发现
Swarm manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器。
7. 负载均衡
实现服务副本负载均衡,提供入口访问。
8. 安全传输
Swarm中的每个节点使用TLS相互验证和加密,确保安全的其他节点通信。
9. 滚动更新
升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到先前版本。
集群部署
使用Swarm前提
Docker版本1.12+
集群节点之间保证TCP 2377(集群管理)、TCP/UDP 7946(容器网络发现)和UDP 4789(Overlay网络)端口通信
节点规划
操作系统:CentOS7.4_x64
Manager | Worker |
---|---|
Manager | 192.168.0.211 |
Worker01 | 192.168.0.212 |
Worker02 | 192.168.0.213 |
管理节点初始化Swarm
docker swarm init --advertise-addr 192.168.0.211
工作节点加入Swarm
docker swarm join --token SWMTKN-1-XXX 192.168.0.211:2377
管理Swarm
docker swarm COMMAND
管理Swarm节点
docker node COMMAND
集群管理
服务管理
创建服务
docker service create --replicas 1 --name hello busybox
显示服务详细信息
docker service inspect --pretty hello # 易于阅读显示 docker service inspect hello # json格式返回
服务实例数扩容
docker service scale hello=3
查看服务任务
docker service ls docker service ps hello docker service ps -f 'desired-state=running' hello
滚动更新服务
docker service create \ --replicas 3 \ --name redis \ --update-delay 10s \ redis:3.0.6 docker service update --image redis:3.0.7 redis
创建服务时设定更新策略
docker service create \ --name my_web \ --replicas 10 \ --update-delay 10s \ #更新间隔 --update-parallelism 2 \ #一次最多更新多少任务 --update-failure-action continue \ #失败继续,默认暂停 nginx:1.12
创建服务时设定回滚策略
docker service create \ --name my_web \ --replicas 10 \ --rollback-parallelism 2 \ #同时回滚任务数 --rollback-monitor 20s \ #监控状态20s --rollback-max-failure-ratio .2 \ #20%失败率 nginx:1.12
服务更新
docker service update --image nginx:1.13 my_web
手动回滚
docker service update --rollback my_web
数据挂载
Volume 创建数据卷
docker service create \ --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> \ --name myservice \ <IMAGE>
查看数据卷详细信息
docker volume inspect <VOLUME-NAME>
读写挂载
docker service create \ --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> \ --name myservice \ <IMAGE>
只读挂载
docker service create \ --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,ro \ --name myservice \ <IMAGE>
管理应用程序数据 – NFS数据持久存储
$ docker service create \ --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volumeopt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"' --name myservice \ <IMAGE>
服务发现与负载均衡
# 进容器查看DNS记录 nslookup hello # 获取虚拟IP docker service inspect -f '{{json .Endpoint.VirtualIPs}}' hello # 设置DNS轮询模式 docker service create \ --replicas 3 \ --name my-web \ --network my-network \ --endpoint-mode dnsrr \ nginx
发布服务
docker service create --name my_web -p 88:80 --replicas 3 nginx:1.12 docker service create --name my_web -p 89:81/udp --replicas 3 nginx:1.12
服务发现
服务发现:Swarm模式内置DNS组件,自动为每个服务分配DNS记录,然后服务的DNS名称在集群内的服务直接分发请求。
# 进容器查看DNS记录 nslookup hello # 获取虚拟VIP docker service inspect -f '{{json .Endpoint.VirtualIPs}}' hello # 设置DNS轮询模式 docker service create \ --replicas 3 \ --name my-web \ --network my-network \ --endpoint-mode dnsrr \ nginx
负载均衡
负载均衡:在Swarm集群中创建服务时,Ingress网络会自动为其分配一个虚拟IP(VIP),在DNS解析时返回VIP,流入该VIP的流量将自动发送(IPVS)该服务的所以健康任务(容器)。
docker network create --driver overlay my-web docker network ls docker service create --replicas 3 --network my-web --name web01 nginx docker service create --replicas 3 --network my-web --name busybox01 busybox
高可用架构
docker node --hlep docker node promote worker01 #备用作为mangger节点
配置文件管理
1、生成一个基本的Nginx配置文件
# cat site.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } }
2、将site.conf保存到docker配置中
docker config create site.conf site.conf docker config ls docker config inspect site.conf
3、创建一个Nginx并应用这个配置
# docker service create \ --name nginx \ --config source=site.conf,target=/etc/nginx/conf.d/site.conf \ --publish 8080:80 \ nginx
应用案例
部署LNMP架构
使用 docker stack deploy 进部署
#cat stack.yaml version: '3.3' services: nginx: image: 192.168.0.213:5000/nginx:v1 ports: - 88:80 networks: - lnmp_net deploy: mode: replicated replicas: 3 endpoint_mode: vip resources: limits: cpus: '0.50' memory: 500M reservations: cpus: '0.25' memory: 300M volumes: - type: bind source: /nfs/lnmp_wwwroot target: /usr/local/nginx/html configs: - source: nginx_config target: /usr/local/nginx/conf/vhost/site.conf depends_on: - php php: image: 192.168.0.213:5000/php:v1 networks: - lnmp_net deploy: mode: replicated replicas: 3 endpoint_mode: vip volumes: - type: bind source: /nfs/lnmp_wwwroot target: /usr/local/nginx/html mysql: image: mysql:5.6 networks: - lnmp_net deploy: placement: constraints: - node.role == manager endpoint_mode: dnsrr volumes: - type: volume source: db-data target: /var/lib/mysql # - "db-data:/var/lib/mysql" command: --character-set-server=utf8 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wp123456 networks: lnmp_net: driver: overlay volumes: db-data: configs: nginx_config: file: ./site.conf
docker stack deploy -c stack.yaml lnmp docker stack --help docker stack ls docker stack services lnmp
停留在世界边缘,与之惜别