想要学习docker的同学建议阅读官方文档,只有那里解释的最详细最正确
因为官方文档上使用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 swarm建议创建的时候使用overlay驱动的网络,并设置attachable,这样可以将其他的镜像加到swarm中
docker 网络
docker network --help |
docker network ls 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 指定监听地址 |
框起来的部分是加入swarm的认证信息,将其复制到client加点运行,client就会作为worker加入swarm |
创建网络
docker network create --driver=overlay --attachable swarm_network |
创建该网络是为了方便docker swarm外部网络连接 |
在repository上查看集群信息(只能在leader上看)
报错
这种报错就是无法连接的问题,看互相之间能不能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 |
docker service ls ID是service的id,name是stackname+containername ,replicated模式是可复制的,replicas 数量,image构建使用的镜像,ports端口映射关系,前面的是宿主机的 |
docker container ls -a |
访问测试
访问8080端口-visualizer访问 | 访问80端口-httpd服务 |
![]() | ![]() |
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 |
![]() |
删除网络 |
docker network ls |
docker network rm httpd_swarm_webnet docker network rm swarm_network |
删除docker swarm
worker节点(client)
docker swarm leave |
leader节点(repository)
docker swarm leave --force |
leader节点必须使用--force强制退出swarm
忘记docker swarm join认证信息查看方法
docker swarm join-token worker
docker swarm join-token manager
docker swarm网络问题
docker swarm访问其中的服务速度慢处理方法
情况一、仅主机模式下测试docker swarm,所有的包 都在本地仓库准备好了,构建完成后访问发现速度很慢,简单的测试页面都要40s只有 |
通过iftop观察网络情况发现即使在所有images在本地都准备好的情况下,docker还是会连接公共仓库,在联网的情况下构建然后断网不会有这种问题,具体原因不明 |
情况二、网络正常,防火墙端口开放,docker swarm构建正常、状态正常,访问leader节点容器或负载均衡到某个机器上的容器时发现速度非常慢,无论是重启docker还是重新构建都无法解决 |
分析:出现这种情况大部分都是网络上的问题,docker在创建docker swarm时会再创建几个虚拟网络 正常来说删除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 swarm调度的问题,暂时没有找到自动调度的方法,只能手动分配
首先,重新构建stack,app的数量翻倍 将3改为了6 重新构建 docker deploy -c docker-compose.yml test_httpd 查看visualizer(如果重新构建还是不能分配带worker,请退出swarm然后重新连接) |
再还原为3,重新构建 docker deploy -c docker-compose.yml test_httpd 查看visualizer |