swarm基础架构:
manager之间通信靠分布式存储Raft,worker靠Gossip network。
filter功能:
● 约束过滤器(Constraint Filter)
约束过滤器通过启动Docker守护进程时指定的标签label来查找合适的被管理主机。label是通过启动参数的方式在启动时被固定的:
--label datacenter=us-east1
这个参数加入到之前说过的docker.service,或者手动加在启动docker的命令后面等等。
而在启动容器时通过这样的方式来指定过滤器:
docker -H 127.0.0.1:8888 run -e constraint:datacenter==us-east1 -d --name www-use1 nginx
-e后面跟过滤器,constraint指出了约束过滤器,后面的约束标签支持==,!=两种判断,后面可以写字符串和正则表达式如us-east*。
● 亲和过滤器(Affinity Filter)
亲和过滤器以现有的某个容器为基准,让新容器运行在/不在已经运行了某个现有容器的主机上运行。
docker run -d -e --name db affinity:container!=www-use1 mysql
比如上面这条命令说的就是要根据mysql镜像启动一个名为db的容器,但是这个容器不能在已经预www-use1容器运行的主机上运行。
● 端口过滤器
端口过滤器严格来说并不是一个真的过滤器。。它只是在启动容器时通过-p参数来申请对一个主机端口的使用权。如果一台主机上这个端口正在被使用那么自然是不能把容器放到这个主机上运行的。
除了上述三种,过滤器还有很多,可以通过swarm manage --help或者去官网查。总的来说,过滤器是一种主动指定主机的手段,配合swarm自身的自动分配机制,可以灵活地确定一台主机来运行容器。
如果当前集群中swarm找不到一台符合条件的主机来运行容器,那么swarm会明确指出哪个过滤器条件得不到满足,从而启动容器失败。
策略:
random策略:随机选择节点。一般用于开发测试阶段。
spread策略:默认策略,swarm优先选择占用资源(如CPU、内存等)最少的节点,能保证集群中所有节点资源的均匀使用。
它的好处是,保证
binpack策略:与spread相反,它的目的是尽可能地填满一个节点,以保证更多空余的节点。
服务发现:
配置manager节点
docker swam init --advertise-addr=192.168.205.10
增加worker节点:
docker swarm join --token xxxx 192.168.205.10:2377
查看所有节点:
docker node ls
Service的创建与维护:
创建service:
docker service create --name demo <image>
查看service:
docker service ls
区别docker name和docker service name:
demo是service的name,不是container的name。
service水平扩展:
docker service scale demo=5
5个service平均分部在manager和worker:
当一个service挂掉时,swarm为了保证数量,会重新部署一个service。
删除service:
docker service rm demo
service会先删除,容器删除会比较慢。
用Service部署wordpress
部署mysql:
--mount等于docker里的-v。
部署wordpress:
swarm为了保证service之间的通信,会同步network的创建,就是说另外的机器上也能看到其他机器上的network。
查看dns:
nslookup www.imooc.com
10.0.0.7是虚拟ip
10.0.0.7相当于VIP,以上是internal的体现。
Internal是通过LVS实现,Ingress是通过IPVS实现。
Internal Load Balancing实现方式:
有两种实现方式dns rr和vip形式,在dns rr 的情况下可能会存在一定是的问题,当容器重启后dns的解析会存在一定时间的延迟。vip则是由vip+内核ipvs来实现。docker swarm默认使用的是vip,这里就以vip的形式来解析。
当访问的节点没有服务的时候会转发到有服务的端口。
查看ip防火墙:
iptables -nL -t nat
查看docker的网络命名空间:
ls /var/run/docker/netns
进入命名空间:
nsenter --net=/var/run/docker/netns/ingress_sbox
DockerStack
docker stack deploy wordpress --compose-file=docker-compose.yml
docker stack ls
docker stack ps wordpress
docker-compose和新命令docker stack commands都可以处理版本号为3的docker-compose.yml文件。对于版本号为2的文件,你不得不继续使用docker-compose.
stack --> service --> task(container)
visualizer是官方的简单容器状态可视化工具。
Secret
创建方式1:
docker secret create <name> <filename> rm -rf <file>
docker secret ls
创建方式2:
echo "123" | docker secret create my-pw2 -
更新