Docker Swarm概念與基本用法

Docker Swarm是Docker公司開發的容器集羣管理服務。 從1.12.0版本開始,已是Docker安裝後自帶的一部分(捆綁軟件)了,又稱爲Swarm Mode,無需額外安裝。node

與Kubernetes相比,Docker Swarm是一個簡單的軟件,彷佛不堪大用。 可是它與docker-compose兼容的優勢,能夠彌補一切。 對於沒有集羣使用經驗的小白,用Docker Swarm起步,是一個很好的選擇。docker

概念

Docker Swarm,主要包含如下概念:網絡

  • Swarm
  • Node
  • Stack
  • Service
  • Task
  • Load balancing

Swarm自己就是「羣」的意思,人羣、蜂羣。 這裏就是指計算機集羣(cluster)在用Docker鏈接後的狀態。 docker swarm命令能夠建立、加入、離開一個集羣。負載均衡

Node就是計算機節點,也能夠認爲是一個Docker節點。 Node分爲兩類:Manager和Worker。 一個Swarm至少要有一個Manager,部分管理命令只有在Manager上才能使用。 兩類Node均可以運行Service,但只有Manager上才能執行運行命令。 好比,在Manager才能使用docker node命令能夠查看、配置、刪除Node。ide

Stack是一組Service,和docker-compose相似。 默認狀況下,一個Stack共用一個Network,相互可訪問,與其它Stack網絡隔絕。 這個概念只是爲了編排的方便。 docker stack命令能夠方便地操做一個Stack,而不用一個一個地操做Service。this

Service是一類容器。 對用戶來講,Service就是與Swarm交互的最核心內容。 Service有兩種運行模式,一是replicated,指定一個Service運行容器的數量; 二是global,在全部符合運行條件的Node上,都運行一個這類容器。 docker service命令能夠操做Swarm中的Service。spa

Task就是指運行一個容器的任務,是Swarm執行命令的最小單元。 要成功運行一個Service,須要執行一個或多個Task(取決於一個Service的容器數量),確保每個容器都順利啓動。 一般用戶操做的是Service,而非Task。代理

Load balancing即負載均衡,也包含反向代理。 Swarm使用的是Ingress形式的負載均衡,即訪問每一個節點的某個Published端口,均可自動代理到真正的服務。 大體原理以下圖所示。code

ingress network

Replicated Mode

services:
  some-serivce:
    ...
    deploy:
      mode: replicated
      replicas: 3

默認狀況下,mode就是replicated,因此這行能夠省略。 默認replicas數目爲1,表明這個Service只啓動1個容器。 這個模式,能夠按需啓動多個服務,Swarm會自動調節,有時一個Node會啓動多個容器。blog

Global Mode

services:
  some-serivce:
    ...
    deploy:
      mode: global
      placement:
        ...

全部可部署的Node,都部署一個。 經過placement,能夠限定知足條件的Node,而避免在不合適的Node進行部署。

操做

這裏列出一些經常使用的具體操做。

建立第一個Node

docker swarm init --advertise-addr $IP

$IP是當前Node的外部可訪問IP,便於其它Node尋址。

這樣,一個Swarm就被初始化完成了,它僅有一個Manager節點。

添加新的Node到Swarm

在Manager節點,執行如下命令可查看到如何加入一個Node:

$ docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-ezs4fylj526e801b3cl0pojr5 10.174.28.52:2377

$ docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-164iqklrfv8o3t55g088hylyk 10.174.28.52:2377

在一個未加入任何Swarm的機器上,執行以上顯示的命令docker swarm join --token ..., 便可成爲這個Swarm的Manage或Worker節點。

設置節點Label

在Manager節點,能夠對任意節點設置標籤:

docker node update $node_name --label-add main=true

$node_name就是要設置節點的ID或HOSTNAME。 Label是鍵值對形式,main=true中的main就是鍵、true就是值。

設置了Label之後,在Compose文件中就能夠用placement中的constraints來對可用節點做出限制。

services:
  some-serivce:
    ...
    deploy:
      placement:
        constraints:
          - node.labels.main == true
      ...

以上配置,讓some-service僅在Label被設置爲main=true的節點,才能使用。

啓動、中止服務

docker stack deploy $stack_name -c docker-compose.yaml -c other.yaml ...

$stack_name是Stack名稱。 能夠用-c指定多個docker-compose文件,也可在相同Stack下分批次deploy多個文件。 這些YAML文件的寫法,和原先用docker-compose命令執行的沒有本質區別,只是多加了如下獨特配置,而且會忽略一些Swarm場景下不支持的配置。

推薦使用docker-compose文件來編排Stack,而非直接用docker service create來手工建立。 詳細配置項,可參考《Compose file version 3 reference | Docker Documentation》。

須要中止Stack的全部服務時,能夠執行如下命令。

docker stack rm $stack_name

更新已運行服務的鏡像

docker service update --image $image:$tag $service_name

原文來自:https://note.qidong.name/2018/11/docker-swarm/做者:匿蟒

相關文章
相關標籤/搜索