想要学习docker的同学建议阅读官方文档,只有那里解释的最详细最正确

docker swarm官方文档

因为官方文档上使用virtualbox进行虚拟化,然后在虚拟出来的两台主机上搭建的swarm,这种不符合实际使用,故本文进行了修改,运行在了两台linux服务器上


学习docker的同学大多知道k8s(Kubernetes),k8s是docker集群的调度器,用来节点、任务分配等。docker swarm是docker自带的一个调度器,对于小的docker集群来说docker swarm已经足够了(swarm调度还是有点问题的),而对于成千上万个docker容器的集群来说,docker swarm的能力就可能不够的,这时就要使用k8s。


hostrname ip docker swarm中的角色
repository
192.168.233.159 manager
client
192.168.233.158 worker


docker swarm初始化命令

docker swarm init --help

docker-8-docker swarm docker stack_第1张图片


docker swarm建议创建的时候使用overlay驱动的网络,并设置attachable,这样可以将其他的镜像加到swarm中


docker 网络

docker network --help

docker-8-docker swarm docker stack_第2张图片

docker network ls

image.png

docker默认创建的网络有3中国,bridge桥接,host主机,none无,类似于vmware workstation的桥接,net,仅主机


创建docker swarm

初始化docker swarm

docker swarm init --advertise-addr 192.168.233.159:2377 --listen-addr 192.168.233.159:2377

--advertise-addr指定广播地址

--listen-addr 指定监听地址

image.png

框起来的部分是加入swarm的认证信息,将其复制到client加点运行,client就会作为worker加入swarm

image.png


创建网络

docker network create --driver=overlay --attachable swarm_network
创建该网络是为了方便docker swarm外部网络连接


在repository上查看集群信息(只能在leader上看)

image.png


报错

image.png

这种报错就是无法连接的问题,看互相之间能不能ping通,telnet能不能连接端口,看是不是leader防火墙拦截

防火墙规则

firewall-cmd --permanent --zone=public --add-port=2377/tcp

firewall-cmd --permanent --zone=public --add-port=2376/tcp

firewall-cmd --permanent --zone=public --add-port=2375/tcp

firewall-cmd --permanent --zone=public --add-port=3375/tcp

firewall-cmd --permanent --zone=public --add-port=3376/tcp

firewall-cmd --permanent --zone=public --add-port=7946/tcp

firewall-cmd --permanent --zone=public --add-port=4789/tcp

firewall-cmd --permanent --zone=public --add-port=4789/udp

firewall-cmd --permanent --zone=public --add-port=7046/udp

systemctl reload firewalld

2375端口,用于远程访问容器

2376端口,用于TLS远程访问容器

2377端口, 用于集群管理通信

3375端口,用于远程访问swarm

3376端口,用于TLS远程访问swarm

7946端口, 用于集群节点之间的通信

4789端口, 用于overlay网络流量


在docker swarm中构建一个httpd的集群,visualizer是docker swarm中的一个监控服务

准备docker-compose.yml

version: "3"

services:

  web:

    # replace username/repo:tag with your name and image details

    image: httpd:latest

    deploy:

      replicas: 3

      resources:

        limits:

          cpus: "0.1"

          memory: 50M

      restart_policy:

        condition: on-failure

    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]

    networks:

      - webnet

networks:

  webnet:

构建(httpd_swarm是service名称)

docker deploy -c docker-compose.yml httpd_swarm

开放端口

firewall-cmd --permanent --zone=public --add-port=8080/tcp


firewall-cmd --permanent --zone=public --add-port=80/tcp

systemctl reload firewalld

查看

docker stack ls

image.png

docker service ls

image.png

ID是service的id,name是stackname+containername ,replicated模式是可复制的,replicas 数量,image构建使用的镜像,ports端口映射关系,前面的是宿主机的

docker container ls -a

image.png

访问测试

访问8080端口-visualizer访问 访问80端口-httpd服务
docker-8-docker swarm docker stack_第3张图片 docker-8-docker swarm docker stack_第4张图片

visualizer上面显示两个空白为可以看出docker swarm 调度上确实存在一些缺陷


删除服务

docker service rm `docker service ls -q`
docker service ls -q是获取docker service 的ID,然后docker service rm删除
查看stack(删除service后stack为空)
docker stack ls
image.png
删除网络

docker network ls

docker-8-docker swarm docker stack_第5张图片

docker network rm httpd_swarm_webnet

docker network rm swarm_network

docker-8-docker swarm docker stack_第6张图片


删除docker swarm

worker节点(client)

docker swarm leave

image.png

leader节点(repository)

docker swarm leave --force

image.png

leader节点必须使用--force强制退出swarm


忘记docker swarm join认证信息查看方法

docker swarm join-token worker

image.pngdocker swarm join-token manager

image.png


docker swarm网络问题

docker swarm访问其中的服务速度慢处理方法

情况一、仅主机模式下测试docker swarm,所有的包 都在本地仓库准备好了,构建完成后访问发现速度很慢,简单的测试页面都要40s只有
通过iftop观察网络情况发现即使在所有images在本地都准备好的情况下,docker还是会连接公共仓库,在联网的情况下构建然后断网不会有这种问题,具体原因不明
情况二、网络正常,防火墙端口开放,docker swarm构建正常、状态正常,访问leader节点容器或负载均衡到某个机器上的容器时发现速度非常慢,无论是重启docker还是重新构建都无法解决

分析:出现这种情况大部分都是网络上的问题,docker在创建docker swarm时会再创建几个虚拟网络

docker-8-docker swarm docker stack_第7张图片

正常来说删除docker swarm后docker network会还原成初始的bridge、host、none这三个,其他的都会自动删除,删除swarm后如果还有其他的network,除了你docker network create 创建的以外,其他的都手动删除掉。

也有可能docker network看上去是正常的,因为很可能是docker0这个虚拟网卡出现了问题

解决方法:

删除所有docker service

    docker service rm `docker service ls -q`

关闭所有容器(最好是能删除)

    docker stop `docker ps -aq`

删除除bridge、host、none外所有docker network(没试过把初始的三个删了会怎么样)

关闭docker服务

    systemctl stop docker

安装网桥管理工具

    yum install -y bridge-utils

清空nat表

    iptables -t nat -F

查看网卡信息

   ifconfig

关闭 docker0虚拟网卡

   ifconfig docker0 down

删除网桥docker0

   brctl delbr docker0

如果ifconfig查看到的还有其他的虚拟网卡,也按照上面的方法删掉

重启docker

   systemctl start docker

重新构建

   docker depoly -c docker-compose.yml appname

访问测试,问题解决


docker swarm调度问题

docker swarm中某一个worker掉线后重新连接app不会自动分配到该worker中,如下

docker-8-docker swarm docker stack_第8张图片

这是docker swarm调度的问题,暂时没有找到自动调度的方法,只能手动分配

首先,重新构建stack,app的数量翻倍

docker-8-docker swarm docker stack_第9张图片

将3改为了6

重新构建

docker deploy -c docker-compose.yml test_httpd

image.png

查看visualizer(如果重新构建还是不能分配带worker,请退出swarm然后重新连接)

docker-8-docker swarm docker stack_第10张图片

再还原为3,重新构建

image.png

docker deploy -c docker-compose.yml test_httpd

image.png

查看visualizer

docker-8-docker swarm docker stack_第11张图片

参考:官方文档docker stack