Docker Swarm:

  准备三台机器,都装上 Docker

  docker swarm是docker官方提供的一套容器编排系统。它的架构如下:

swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两个角色,manager或者worker。

  1. manager节点:Docker Swarm集群需要至少一个manager节点,节点之间使用Raft consensus protocol进行协同工作。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
  2. worker节点:worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为worker节点,但在生产环境中,我们不建议这样做。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。

搭建Swarm集群:

1.设置 manager

  1. docker swarm init --advertise-addr=192.168.0.11

  这个时候需要注意观察日志。拿到worker node加入manager node的信息

  1. docker swarm join --token SWMTKN-1-0a5ph4nehwdm9wzcmlbj2ckqqso38pkd238rprzwcoawabxtdq-arcpra6yzltedpafk3qyvv0y3 192.168.0.11:2377

2.切换机器,分别执行上面的命令加入 swarm 集群。

3.进入到manager node查看集群状态 docker node ls

4.node类型的转换:

  1. #可以将worker提升成manager,从而保证manager的高可用
  2. docker node promote worker01-node
  3. docker node promote worker02-node
  4.  
  5. #降级可以用demote
  6. docker node demote worker01-node

   Swarm基本操作:

  1. docker service create --name my-tomcat tomcat --创建一个tomcatservice
  2.  
  3. docker service ls --查看当前swarmservice
  4.  
  5. docker service logs my-tomcat --查看service的启动日志
  6.  
  7. docker service inspect my-tomcat --查看service的详情
  8.  
  9. docker service ps my-tomcat --查看my-tomcat运行在哪个node
  10.  
  11. docker service scale my-tomcat=3 --水平扩展service 可以发现 其他node上都运行了一个my-tomcatservice
  12. docker service ls
  13. docker service ps my-tomcat

    docker service rm my-tomcat -- 删除service

  如果某个node上的my-tomcat挂掉了,这时候会自动扩展

多机通信overlay网络:

  业务场景:workpress+mysql实现个人博客搭建

传统手动方式实现:

01-创建mysql容器[创建完成等待一会,注意mysql的版本]

  1. docker run -d --name mysql -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=examplepass -e MYSQL_DATABASE=db_wordpress mysql:5.6

02-创建wordpress容器[将wordpress的80端口映射到centos的8080端口]

  1. docker run -d --name wordpress --link mysql -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=examplepass -e WORDPRESS_DB_NAME=db_wordpress -p 8080:80 wordpress

03-查看默认bridge的网络,可以发现两个容器都在其中

  1. docker network inspect bridge

04-访问测试:浏览器中输入:ip[centos]:8080,一直下一步

使用docker compose创建:

  docker-compose的方式还是在一台机器中,网络这块很清晰

01-创建wordpress-mysql文件夹

  1. mkdir -p /tmp/wordpress-mysql
  2. cd /tmp/wordpress-mysql

02-创建docker-compose.yml。文件内容 yml :

  1. version: '3.1'
  2.  
  3. services:
  4.  
  5. wordpress:
  6. image: wordpress
  7. restart: always
  8. ports:
  9. - 8080:80
  10. environment:
  11. WORDPRESS_DB_HOST: db
  12. WORDPRESS_DB_USER: exampleuser
  13. WORDPRESS_DB_PASSWORD: examplepass
  14. WORDPRESS_DB_NAME: exampledb
  15. volumes:
  16. - wordpress:/var/www/html
  17.  
  18. db:
  19. image: mysql:5.7
  20. restart: always
  21. environment:
  22. MYSQL_DATABASE: exampledb
  23. MYSQL_USER: exampleuser
  24. MYSQL_PASSWORD: examplepass
  25. MYSQL_RANDOM_ROOT_PASSWORD: '1'
  26. volumes:
  27. - db:/var/lib/mysql
  28.  
  29. volumes:
  30. wordpress:
  31. db:

03-根据docker-compose.yml文件创建service

  1. docker-compose up -d

04-访问测试:win10浏览器ip[centos]:8080,一直下一步

05-值得关注的点是网络

  1. docker network ls
  2. docker network inspect wordpress-mysql_default

Swarm中实现:

  还是wordpress+mysql的案例,在docker swarm集群中怎么玩呢?

(1)创建一个overlay网络,用于docker swarm中多机通信 , 在 manager-node中执行:

  1. docker network create -d overlay my-overlay-net
  2. docker network ls[此时worker node查看不到]

(2)创建mysql的service,在manager-node节点上执行:

  1. docker service create --name mysql --mount type=volume,source=v1,destination=/var/lib/mysql --env MYSQL_ROOT_PASSWORD=examplepass --env MYSQL_DATABASE=db_wordpress --network my-overlay-net mysql:5.6
    #查看service
    docker service ls
    docker service ps mysql

(3)创建wordpress的service,在manager-node节点上执行:

  1. #创建service [注意之所以下面可以通过mysql名字访问,也是因为有DNS解析]
  2. docker service create --name wordpress --env WORDPRESS_DB_USER=root --env WORDPRESS_DB_PASSWORD=examplepass --env WORDPRESS_DB_HOST=mysql:3306 --env WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network my-overlay-net wordpress
  3. #查看service
  4. docker service ls
  5. docker service ps mysql
  6. #此时mysql和wordpress的service运行在哪个node上,这时候就能看到my-overlay-net的网络

(4)测试 :浏览器访问ip[manager/worker01/worker02]:8080都能访问成功

(5)查看my-overlay-net

  1. docker network inspect my-overlay-net

Routing Mesh:

  通过前面的案例我们发现,部署一个wordpress的service,映射到主机的8080端口,这时候通过swarm集群中的任意主机ip:8080都能成功访问,这是因为什么?docker swarm中有自己的分布式存储机制.把问题简化:

docker service create --name tomcat -p 8080:8080 --network my-overlay-net tomcat

(1)记得使用一个自定义的overlay类型的网络

  1. network my-overlay-net

(2)查看service情况

  1. docker service ls
  2. docker service ps tomcat

(3)访问3台机器的ip:8080测试 :发现都能够访问到tomcat的欢迎页

Internal:

  在实战wordpress+mysql的时候,发现wordpress中可以直接通过mysql名称访问,这样可以说明两点,第一是其中一定有dns解析,第二是两个service的ip是能够ping通的,不妨再创建一个service,也同样使用上述tomcat的overlay网络,然后来实验

  1. docker service create --name whoami -p 8000:8000 --network my-overlay-net -d jwilder/whoami

(1)查看whoami的情况

  1. docker service ps whoami

(2)在各自容器中互相ping一下彼此,也就是容器间的通信,tomcat容器中ping whoami

  1. docker exec -it 9d7d4c2b1b80 ping whoami
  2. 64 bytes from bogon (10.0.0.8): icmp_seq=1 ttl=64 time=0.050 ms
  3. 64 bytes from bogon (10.0.0.8): icmp_seq=2 ttl=64 time=0.080 ms

whoami容器中ping tomcat

  1. docker exec -it 5c4fe39e7f60 ping tomcat
  2. 64 bytes from bogon (10.0.0.18): icmp_seq=1 ttl=64 time=0.050 ms
  3. 64 bytes from bogon (10.0.0.18): icmp_seq=2 ttl=64 time=0.080 ms

(3)将whoami进行扩容

  1. docker service scale whoami=3
  2. docker service ps whoami #manager,worker01,worker02

(4)此时再ping whoami service,并且访问whoami服务

  1. #ping
  2. docker exec -it 9d7d4c2b1b80 ping whoami
  3. 64 bytes from bogon (10.0.0.8): icmp_seq=1 ttl=64 time=0.055 ms
  4. 64 bytes from bogon (10.0.0.8): icmp_seq=2 ttl=64 time=0.084 ms
  5.  
  6. #访问
  7. docker exec -it 9d7d4c2b1b80 curl whoami:8000 [多访问几次]
  8. I'm 09f4158c81ae
  9. I'm aebc574dc990
  10. I'm 7755bc7da921

  通过上述的实验可以发现什么?whoami服务对其他服务暴露的ip是不变的,但是通过whoami名称访问8000端口,确实访问到的是不同的service,也就是说whoami service对其他服务提供了一个统一的VIP入口,别的服务访问时会做负载均衡。

Stack:

  有没有发现上述部署service很麻烦?要是能够类似于docker-compose.yml文件那种方式一起管理该多少?这就要涉及到docker swarm中的Stack,我们直接通过前面的wordpress+mysql案例看看怎么使用咯。

(1)新建service.yml文件

  1. version: '3'
  2.  
  3. services:
  4.  
  5. wordpress:
  6. image: wordpress
  7. ports:
  8. - 8080:80
  9. environment:
  10. WORDPRESS_DB_HOST: db
  11. WORDPRESS_DB_USER: exampleuser
  12. WORDPRESS_DB_PASSWORD: examplepass
  13. WORDPRESS_DB_NAME: exampledb
  14. networks:
  15. - ol-net
  16. volumes:
  17. - wordpress:/var/www/html
  18. deploy:
  19. mode: replicated
  20. replicas: 3
  21. restart_policy:
  22. condition: on-failure
  23. delay: 5s
  24. max_attempts: 3
  25. update_config:
  26. parallelism: 1
  27. delay: 10s
  28.  
  29. db:
  30. image: mysql:5.7
  31. environment:
  32. MYSQL_DATABASE: exampledb
  33. MYSQL_USER: exampleuser
  34. MYSQL_PASSWORD: examplepass
  35. MYSQL_RANDOM_ROOT_PASSWORD: '1'
  36. volumes:
  37. - db:/var/lib/mysql
  38. networks:
  39. - ol-net
  40. deploy:
  41. mode: global
  42. placement:
  43. constraints:
  44. - node.role == manager
  45.  
  46. volumes:
  47. wordpress:
  48. db:
  49.  
  50. networks:
  51. ol-net:
  52. driver: overlay

(2)根据service.yml创建service

  1. docker statck deploy -c service.yml my-service

(3)常见操作

  1. docker stack ls --查看stack具体信息
  2.  
  3. docker stack services my-service --查看具体的service
  4.  
  5. docker service inspect my-service-db --查看某个service

(4)访问测试:浏览器ip[manager,worker01,worker02]:8080

docker-swarm----多机容器管理的更多相关文章

  1. Docker之单多/机容器管理

    Compose是用于定义和运行多容器Docker应用程序的工具.通过Compose,您可以使用YAML文件来配置应用程序的服务.然后,使用一个命令,就可以从配置中创建并启动所有服务. Docker-C ...

  2. [docker swarm] 从单容器走向负载均衡部署

    背景 之前写过<<docker-compose真香>> 和<docker-compose.docker stack前世今生>两篇博客, 回顾一下思路: ① dock ...

  3. Docker Swarm Mode无法增加管理节点

    这两天用Docker Swarm Mode,加入新的管理节点会报以下错误(在/var/log/messages文件中可以看到): Handler for POST /v1.37/swarm/join ...

  4. Docker&持续集成与容器管理--系列教程

    一 Docker简介 Docker介绍 Docker架构 二 Docker安装 Ubuntu Docker 安装 CentOS Docker 安装 Windows Docker 安装 MacOS Do ...

  5. 不止Docker:8款容器管理开源方案

    Docker诞生于2013年,并普及了容器的概念,以至于大多数人仍然将容器的概念等同于"Docker容器". 作为第一个吃螃蟹的人,Docker设置了新加入者必须遵守的标准.例如, ...

  6. Docker 系列三(容器管理).

    一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...

  7. Docker 安装docker-compose多容器管理服务

    原文地址:https://github.com/eacdy/spring-cloud-book/blob/master/3%20%E4%BD%BF%E7%94%A8Docker%E6%9E%84%E5 ...

  8. docker(3)容器管理命令

    接着上一篇,今天说一下Docker 有关容器的常用命令.算是比较详细了吧. docker run  命令: 注:此命令作用是使用一个镜像运行启动一个容器. 在启动运行的时候 会检查docker 中是否 ...

  9. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

随机推荐

  1. SQLHelper ------ python实现

    SQLHelper ------ python实现 1.第一种: import pymysql import threading from DBUtils.PooledDB import Pooled ...

  2. Django中多表关联的展示问题:

    增加一个知识点,当表中有多对多关联时,在前端展示的时候是一个列表,所以在展示的时候需要这样做: 表结构: class ProjectEnv(models.Model): project = model ...

  3. 前端面试准备笔记之JavaScript(03)

    01. 变量声明提升 在预解析的时候,成员变量和函数,被提升到最高的位置,方便其他程序访问. 可以先使用后声明. 只提升变量名,不提升变量值 let const 声明的变量不具有变量声明提升. // ...

  4. mybatis缓存源码分析之浅谈缓存设计

    本文是关于mybatis缓存模块设计的读后感,关于缓存的思考,关于mybatis的缓存源码详细分析在另一篇文章:https://www.cnblogs.com/gmt-hao/p/12448896.h ...

  5. 善用tempfile库创建python进程中的临时文件

    技术背景 临时文件在python项目中时常会被使用到,其作用在于随机化的创建不重名的文件,路径一般都是放在Linux系统下的/tmp目录.如果项目中并不需要持久化的存储一个文件,就可以采用临时文件的形 ...

  6. editplus 5.0 破解

    先安装软件,安装步骤就不解释了,很傻瓜式的,一直下一步就行.   到了最重要的一步,请看仔细了!!!   在两个输入框中分别输入 注册名 Vovan 注册码 3AG46-JJ48E-CEACC-8E6 ...

  7. Axure RP 9版本最新版授权码和密钥 亲测可用

    分享Axure RP 9版本最新版授权码和密钥 亲测可用 声明:以下资源的获取来源为网络收集,仅供学习参考,不作商业用途,如有侵权请联系博主删除,谢谢! 自新的Axure RP 9.0 Beta版发布 ...

  8. Java 学习之路 -- day00

    Java 学习之路 -- day00 Typora 快捷键操作 标题:#+空格 2. *斜体* 3. **加粗** 4. **斜体加粗*** 5. ~~删除线~~ 6. > 引用 7. ···分 ...

  9. Spring听课笔记(专题一)

    Spring入门课程:https://www.imooc.com/learn/196 第0章: Spring是为解决企业应用程序开发复杂性而创建的一个Java开源框架,应用非常广泛.业内非常流行的SS ...

  10. Urlrewrite

    Urlrewrite  地址重写,用户得到的全部都是经过处理后的URL地址 过滤用户的所有请求,符合规则的便对其进行重定向 rule结点中from默认使用的正则表达式来匹配,若用户访问服务器时的URL ...