目录
- Docker 构建集群/服务/Compose/分布式服务栈
- 集群
- 初始化集群服务
- 安装docker-machine
- 管理节点和工作节点
- docker集群构建完成
- 集群中部署应用
- 集群服务访问特性
- 集群交换端口
- 服务(负载均衡)
- 定义服务通过docker-compose.yml
- 启动服务
- 停止服务
- docker-compose
- 集群分布式服务栈
- 构建集群分布式服务栈
- docker stack, docker swarm 与 docker compose 关系
- 集群分布式服务栈之间的网络通信配置
- docker-compose.yml文件
- PS
- 小结
- 集群
Docker 构建集群/服务/Compose/分布式服务栈
既然docker是操作系统级别的轻量化标准容器,那么标准化让docker接下来有了很多特性,像弹性扩展。利用这一特性,把将应用通过docker构建集群。docker内置了提供集群构建的功能的,开启集群服务后,可以结合docker容器网络,利用overlay可以构建跨多台主机的虚拟网络,然后再此基础上还能构建负载均衡服务。
集群
集群cluster or swarm,集群是一组机器通过某种可通行关系(如底层以太网,或更上层应用层,或者我们这里提到的docker服务集群)
初始化集群服务
docker swarm init
启动集群服务
安装docker-machine
参考:https://docs.docker.com/machine/install-machine/#installing-machine-directly
管理节点和工作节点
两种节点的区别:只有swarm manage节点可以执行力docker命令,工作节点只能提供服务。
- Swarm managers : 执行docker swarm init
Workers nodes:执行docker swarm join 。。。manager的token
查看集群所有节点及开启状态
docker node ls
docker info |grep -i swarm # 查看集群服务开启状态
docker集群构建完成
添加节点,构建网docker集群后,我们在单机上的docker操作就要提升为集群的操作响应了。也就是说,当前我们所在节点机上,如果我们使用docker-cli进行操作,其实是当前节点机所在集群的操作,docker-cli所面临的对象从单即docker,变为了docker swarm manager对象,这个对象就是集群的代表对象。
集群中部署应用
管理节点中部署
工作节点中部署
集群服务访问特性
前提知识:如果是水平扩展服务集群,通常要求是提供单入口访问服务,那么集群中怎么提供单入口提供服务呢?那就要看入口是什么?入口:对于web服务,ip+port就是入口,然而集群时多机器,每个机器由ip+port。所以需要负载均衡器(load balancer), 通过load balancer对外提供单一入口ip+port, 然后对集群中提供水平服务的节点分发请求。回到docker集群,如果提供web服务由多个相同应用容器提供,docker将每个服务进行抽象,抽象成:定义一个服务(入口),那么提供服务有对应的APP镜像,可以调整运行几个容器来服务,那么每个服务就要有一个负载均衡策略配置到docker的swarm load balancer对象中。这就是docker swarm 提供负载均衡服务的原理。
基于这一原理,有了以下特性:
- 集群中每个节点都开启了集群服务。
- 集群中每个节点都有一个负载均衡器对象。
- 集群网络是利用docker容器的overlay网络模型。
- 集群节点都启动了相同的对外服务,利用负载均衡器对象。
- 集群节点无论是否有实际的APP应用容器运行,都可以通过负载均衡器对象转发到集群中算法命中的节点。
集群交换端口
只要开启了集群mode,都会有以下端口开启,用于集群节点间通信实际
- Port 7946 TCP/UDP for container network discovery.
- Port 4789 UDP for the container ingress network.
服务(负载均衡)
可以通过docker stack 再你哟管compose-file 中定义的服务,来创建基于容器的服务,服务由多个容器提供,使用docker 内置负载均衡来分发服务请求到多个容器中。
如:
定义服务通过docker-compose.yml
启动服务
docker stack deploy -c docker-compose.yml getstartedlab
停止服务
docker stack rm getstartedlab
docker-compose
下载参考:https://github.com/docker/compose/releases/tag/1.24.1
集群分布式服务栈
也就是在利用docker swarm集群分布式部署应用到集群节点,而应用可能基于依赖其它应用,或者被其它应用所需要,所以就堆成了栈结构,一层一层。就叫做集群分布式服务栈。
还要明确集群服务层次间的关系是:有些服务是提供给多个服务,如数据库服务集群,可能提供给多个web应用服务。而上层服务与下层服务间,通过节点中任意一节点即可,也就是集群中服务栈中的多个服务复用同一个docker load balancer负载均衡器。
构建集群分布式服务栈
docker stack deploy
- 利用这个命令可以从docker-compose.yml文件中读取与部署服务
docker stack, docker swarm 与 docker compose 关系
- swarm 与 compse都是对多个容器进行编排管理,swarm是针对集群实在集群服务层面,而compse是不是集群,是对单docker服务机器进行编排多个应用容器。 docker stack 是在swarm开启基础上,进行部署多层服务栈的。
- docker-compose.yml在着三者间的作用,首先用到docer-compose.yml的只有docker compose和docker stack , docker swarm只是提供集群基础服务,对于部署应用到swarm是通过docker stack. 也就是得出结论:docker-compose.yml 如果里面定义了服务,单机和集群都能用,只是两者只会使用自己有用的信息,单机取单机信息,集群都集群信息。
集群分布式服务栈之间的网络通信配置
- 因为每一个服务在集群中,容器时处于集群容器网络中的,docker利用服务名作为网络的主机域名作用,所以通过可以使用服务名作为ip地址的域名来配置访问。
docker-compose.yml文件
version: "3"services:
web: # 服务
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer: # 服务
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes: # 数据卷
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement: # 部署位置定义
constraints: [node.role == manager] # 只部署在manager
networks:
- webnetnetworks:
webnet:
PS
- 利用docker stack如果报错“Error response from daemon: rpc error: code = 4 desc = context deadline exceeded”,检查几次yml文件,在阿里云上的话可能是网络问题,一般第一次不会成功,执行力第二次就成功了。
- docker stack 由于是集群部署,所有几点必须能访问通一个docker hub(无论公私),所以yml中的镜像必须是hub上的,因为每个节点本地不一定有相同镜像。
- 对于docker EE版本,提供了http routing mesh,即docker集群中,定义的服务名可以当作域名进行使用。在docker集群容器网络中,这个服务名是可以被解析到相应的节点上,并提供访问的。
小结
- container+image+service+swarm+stack+scaling+load-balancing+volumes+ placement-constraints
- 首先构建我们自己的app镜像,可以进行分布式部署,即应用可以水平无限扩展,基础件如redis,mysql在集群中单服务(或者主主热备),app镜像中配置好服务。push我们的app镜像到集群的docker-hub总,然后定义docker-compse.yml,在其中定义服务栈,规划volume,和对外端口。然后启动swarm服务,最后部署docker stack deploy 我们的服务。