本文介紹基礎的 Docker Swarm 該如何使用

建立測試機並建立測試環境

我們這邊用 Docker-Machine 建立測試環境也可以用一般的VM 建立測試環境都OK,只要確保環境上網路能連通 Docker 能用即可!

Docker-Machine (用來建立虛擬機 for virtualbox):

docker/machine (github.com) ⇒ 改名為 docker-machine.exe

Windows:放在 C:\Windows\System32

Linux:放在 /usr/bin ⇒ chmod 755 docker-machine

Docker Swarm 腳色:

  • Manager 叢集管理 目的就是負責來管理叢集的宿主機,並調用安排每個需要的服務容器應該要被放在哪一台來做啟動,當服務停止時也要負責啟動服務容器使之正常來做服務的提供。

  • Worker Nodes 工作節點 Node翻譯成節點,簡單說就是代表一台台的宿主機,而執行Service的地方就是在任意的Node節點上。

Docker Swarm 優點:

  • Scaling 自動擴展 Scaling本身概念簡單,也是雲端能帶來的其中一項價值所需,當回應需求服務數量或連線流量過大時,能透過自動擴展機制一次啟動多個相應的服務同時處理需求回應與因應流量,直到流量或需求恢復正常,就可以透過縮容來減少服務數量,以節省主機成本。

  • Load Balacning 負載平衡 當流量進到Docker Swarm的服務中,會透過像輪詢(Round Robin)的機制去把進來的流量做分流,也就是輪流把流量送到各服務去,舉例第一個進來給A容器,第二個進來給B容器,第三個進來再給A,以此類推…

  • Service Discovery 服務探索 在 Docker swarm 中每個服務都可以定義自己服務獨有的DNS,而接下來就可以讓其他容器透過自訂的DNS來使用服務。

Docker Swarm 整體架構圖:

Docker-Swarm-Arch

Docker Swarm 網路架構圖:

Docker-Swarm-Network

Docker Swarm Command:

查看 cluster 內的 server:docker node ls

建立服務:docker service create --replicas <數量> --name=<service_name> -p <host_port>:<container_port> <image>

刪除服務:docker service rm <service_name>

查看服務:docker service ps <service_name>

查看服務 Log:docker service logs <service_name> -f

更新服務參數:docker service update <option> <service_name>

查看服務詳細參數:docker service inspect <service_name>

Docker Swarm 搭建基礎實作:

  1. init docker swarm (in master)

    docker swarm init
    機台上有多個 ip 請使用下面的
    docker swarm init --advertise-addr <互ping的到的ip>
    

    IP 太多的 Error message: ErrorMessage

    init 成功: init-success

  2. docker swarm join (in node)

    docker swarm join --token <docker_swarm_token> <IP>:2377
    

    連結成功: Link-success

  3. 查看 node 是否正確

    docker node ls
    

    node-ls

  4. 建立服務

    docker service create
    

    service-create

  5. 查看服務是否建立

    docker service ps "gyhello"
    

    check-service-create

  6. 查看服務是否正常啟用 check-service-status

  7. 查看服務 Logs

    docker service logs gyhello -f
    

    service-logs

Docker Swarm Load Balancer 實作:

這邊是示範後端設定 , 前端還需要掛載一個 nginx 去做 Load Balancer , 連到前端 nginx 後會自動導入後端兩台其中一個 ip 去使用服務

擴增(scaling up):

docker service scale <service_name>=<數量>
Ex: docker service scale gyhello=5

scaling-up

befor-service-status

縮容(scaling down):

docker service scale <service_name>=<數量>
Ex: docker service scale gyhello=2

scaling-down

after-service-status

負載平衡驗證:

Linux Command:
iptables -L -t nat

filter : 是流量進到宿主機本身來決定是否 Accept or Drop or Forward的方式。
NAT : 流量本身跟此台宿主機並無直接關係,主要作為來源與目的 IP & Port間轉至後端容器主機。
Mangle : 屬特殊表格,會去標記某些規格並改寫封包。

驗證會被導入到 172.18.0.2:8080

iptables

ifconfig 確認 docker_gwbridge 網路介面相關聯,透過 Node建立Container 後在與容器建立連線,故節點中涵蓋一組容器 IP:172.18.0.2

ifconfig

docker network inspect docker_gwbridge

這裡有一個被隱藏的 Container 叫 ingress-sbox,看起來流量是先進入此 Container 後再把流量分配到真正的 Service

net_inspect

Ingress:

docker swarm 跟 k8s 依樣是透過在 Master端 建立網段可以與外網溝通並利用 ipvs 方式把 iptables 加在每個 node 中並導出服務的 port , 達到外網只要連線到 master端ip:port 就能使用服務

Reference:

深入浅出Swarm(Blog DaoCloud)

【云原生】一文理解Swarm解决docker server的集群化管理和部署(知乎)

Docker Swarm 網路架構介紹 - load balancing traffic path