想要學習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 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
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
placement:
constraints: [node.role == manager]
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
檢視
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 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
參考:官方文檔docker stack