天天看點

docker-8-docker swarm docker stack

想要學習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

docker swarm建議建立的時候使用overlay驅動的網絡,并設定attachable,這樣可以将其他的鏡像加到swarm中

docker 網絡

docker network --help

docker-8-docker swarm docker stack

docker network ls

docker-8-docker swarm docker stack

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 指定監聽位址

docker-8-docker swarm docker stack

框起來的部分是加入swarm的認證資訊,将其複制到client加點運作,client就會作為worker加入swarm

docker-8-docker swarm docker stack

建立網絡

docker network create --driver=overlay --attachable swarm_network

建立該網絡是為了友善docker swarm外部網絡連接配接

在repository上檢視叢集資訊(隻能在leader上看)

docker-8-docker swarm docker stack

報錯

docker-8-docker swarm docker stack

這種報錯就是無法連接配接的問題,看互相之間能不能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-8-docker swarm docker stack

docker service ls

docker-8-docker swarm docker stack

id是service的id,name是stackname+containername ,replicated模式是可複制的,replicas 數量,image建構使用的鏡像,ports端口映射關系,前面的是主控端的

docker container ls -a

docker-8-docker swarm docker stack

通路測試

通路8080端口-visualizer通路

通路80端口-httpd服務

docker-8-docker swarm docker stack
docker-8-docker swarm docker stack

visualizer上面顯示兩個空白為可以看出docker swarm 排程上确實存在一些缺陷

删除服務

docker service rm `docker service ls -q`

docker service ls -q是擷取docker service 的id,然後docker service rm删除

檢視stack(删除service後stack為空)

docker-8-docker swarm docker stack

删除網絡

docker-8-docker swarm docker stack

docker network rm httpd_swarm_webnet

docker network rm swarm_network

docker-8-docker swarm docker stack

删除docker swarm

worker節點(client)

docker swarm leave

docker-8-docker swarm docker stack

leader節點(repository)

docker swarm leave --force

docker-8-docker swarm docker stack

leader節點必須使用--force強制退出swarm

忘記docker swarm join認證資訊檢視方法

docker swarm join-token worker

docker-8-docker swarm docker stack

docker swarm join-token manager

docker-8-docker swarm docker stack

docker swarm網絡問題

docker swarm通路其中的服務速度慢處理方法

情況一、僅主機模式下測試docker swarm,所有的包 都在本地倉庫準備好了,建構完成後通路發現速度很慢,簡單的測試頁面都要40s隻有

通過iftop觀察網絡情況發現即使在所有images在本地都準備好的情況下,docker還是會連接配接公共倉庫,在聯網的情況下建構然後斷網不會有這種問題,具體原因不明

情況二、網絡正常,防火牆端口開放,docker swarm建構正常、狀态正常,通路leader節點容器或負載均衡到某個機器上的容器時發現速度非常慢,無論是重新開機docker還是重新建構都無法解決

分析:出現這種情況大部分都是網絡上的問題,docker在建立docker swarm時會再建立幾個虛拟網絡

docker-8-docker swarm docker stack

正常來說删除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

這是docker swarm排程的問題,暫時沒有找到自動排程的方法,隻能手動配置設定

首先,重新建構stack,app的數量翻倍

docker-8-docker swarm docker stack

将3改為了6

docker deploy -c docker-compose.yml test_httpd

docker-8-docker swarm docker stack

檢視visualizer(如果重新建構還是不能配置設定帶worker,請退出swarm然後重新連接配接)

docker-8-docker swarm docker stack

再還原為3,重新建構

docker-8-docker swarm docker stack

docker deploy -c docker-compose.yml test_httpd

docker-8-docker swarm docker stack

檢視visualizer

docker-8-docker swarm docker stack

參考:官方文檔docker stack