使用

在使用 swarm 管理叢集前,需要把叢集中所有的節點的 docker daemon 的監聽方式更改為 0.0.0.0:2375

可以有兩種方式達到這個目的,第一種是在啟動docker daemon的時候指定

sudo docker -H 0.0.0.0:2375&

第二種方式是直接修改 Docker 的設定檔(Ubuntu 上是 /etc/default/docker,其它版本的 Linux 上略有不同)

在檔案的最後加入下面這句程式碼:

DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"

需要注意的是,一定要在所有希望被 Swarm 管理的節點上進行的。修改之後要重啟 Docker

sudo service docker restart

Docker 叢集管理需要使用服務發現(Discovery service backend)功能,Swarm支援以下的幾種方式:DockerHub 提供的服務發現功能,本地的檔案,etcd,consul,zookeeper 和 IP 清單,本文會詳細講解前兩種方式,其它的使用方式都是大同小異的。

先說一下本次試驗的環境,本次試驗包括三台機器,IP位址分別為192.168.1.84,192.168.1.83和192.168.1.124.利用這三台機器組成一個docker叢集,其中83這台機器同時充當swarm manager節點。

使用 DockerHub 提供的服務發現功能

建立叢集 token

在上面三台機器中的任何一台機器上面執行 swarm create 指令來取得一個叢集標誌。這條指令執行完畢後,Swarm 會移至轉到 DockerHub 上內建的發現服務中取得一個全球唯一的 token,用來識別要管理的叢集。

sudo docker run --rm swarm create

我們在84這台機器上執行這條指令,輸出如下:

rio@084:~$ sudo docker run --rm swarm create
b7625e5a7a2dc7f8c4faacf2b510078e

可以看到我們傳回的 token 是 b7625e5a7a2dc7f8c4faacf2b510078e,每次傳回的結果都是不一樣的。這個 token 一定要記住,後面的作業都會用到這個 token。

加入叢集

在所有要加入叢集的節點上面執行 swarm join 指令,表示要把這台機器加入這個叢集當中。在本次試驗中,就是要在 83、84 和 124 這三台機器上執行下面的這條指令:

sudo docker run -d swarm join --addr=ip_address:2375 token://token_id

其中的 ip_address 換成執行這條指令的機器的 IP,token_id 換成上一步執行 swarm create 傳回的 token。

在83這台機器上面的執行結果如下:

rio@083:~$ sudo docker run -d swarm join --addr=192.168.1.83:2375 token://b7625e5a7a2dc7f8c4faacf2b510078e
3b3d9da603d7c121588f796eab723458af5938606282787fcbb03b6f1ac2000b

這條指令透過 -d 參數啟動了一個容器,使得83這台機器加入到叢集。如果這個容器被停止或是被刪除,83這台機器就會從叢集中消失。

啟動swarm manager

因為我們要使用 83 這台機器充當 swarm 管理節點,所以需要在83這台機器上面執行 swarm manage 指令:

sudo docker run -d -p 2376:2375 swarm manage token://b7625e5a7a2dc7f8c4faacf2b510078e

執行結果如下:

rio@083:~$ sudo docker run -d -p 2376:2375 swarm manage token://b7625e5a7a2dc7f8c4faacf2b510078e
83de3e9149b7a0ef49916d1dbe073e44e8c31c2fcbe98d962a4f85380ef25f76

這條指令如果執行成功會傳回已經啟動的 Swarm 的容器的 ID,此時整個叢集已經啟動起來了。

現在透過 docker ps 指令來看下有沒有啟動成功。

rio@083:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
83de3e9149b7        swarm:latest        "/swarm manage token   4 minutes ago       Up 4 minutes        0.0.0.0:2376->2375/tcp   stupefied_stallman

可以看到,Swarm 已經成功啟動。 在執行 Swarm manage 這條指令的時候,有幾點需要注意的:

  • 這條指令需要在充當 swarm 管理者的機器上執行
  • Swarm 要以 daemon 的形式執行
  • 對應的連接埠可以使任意的除了 2375 以外的並且是未被佔用的連接埠,但一定不能是 2375 這個連接埠,因為 2375 已經被 Docker 本身給佔用了。

叢集啟動成功以後,現在我們可以在任何一台節點上使用 swarm list 指令 檢視叢集中的節點了,本實驗在 124 這台機器上執行 swarm list 指令:

rio@124:~$ sudo docker run --rm swarm list token://b7625e5a7a2dc7f8c4faacf2b510078e
192.168.1.84:2375
192.168.1.124:2375
192.168.1.83:2375

輸出結果列出的IP位址正是我們使用 swarm join 指令加入叢集的機器的IP位址。

現在我們可以在任何一台安裝了 Docker 的機器上面透過指令(指令中要指明swarm manager機器的IP位址)來在叢集中執行container了。 本次試驗,我們在 192.168.1.85 這台機器上使用 docker info 指令來 檢視叢集中的節點的資訊。

其中 info 也可以換成其它的 Docker 支援的指令。

rio@085:~$ sudo docker -H 192.168.1.83:2376 info
Containers: 8
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 2
 sclu083: 192.168.1.83:2375
  └ Containers: 1
  └ Reserved CPUs: 0 / 2
  └ Reserved Memory: 0 B / 4.054 GiB
 sclu084: 192.168.1.84:2375
  └ Containers: 7
  └ Reserved CPUs: 0 / 2
  └ Reserved Memory: 0 B / 4.053 GiB

結果輸出顯示這個叢集中只有兩個節點,IP位址分別是 192.168.1.83 和 192.168.1.84,結果不對呀,我們明明把三台機器加入了這個叢集,還有 124 這一台機器呢? 經過排查,發現是忘了修改 124 這台機器上面改 docker daemon 的監聽方式,只要按照上面的步驟修改寫 docker daemon 的監聽方式就可以了。

在使用這個方法的時候,使用swarm create可能會因為網路的原因會出現類似於下面的這個問題:

rio@227:~$ sudo docker run --rm swarm create
[sudo] password for rio:
time="2015-05-19T12:59:26Z" level=fatal msg="Post https://discovery-stage.hub.docker.com/v1/clusters: dial tcp: i/o timeout"

使用檔案

第二種方法相對於第一種方法要簡單得多,也不會出現類似於上面的問題。

第一步:在 swarm 管理節點上新增一個檔案,把要加入叢集的機器 IP 位址和連接埠號碼寫入檔案中,本次試驗就是要在83這台機器上面作業:

rio@083:~$ echo 192.168.1.83:2375 >> cluster
rio@083:~$ echo 192.168.1.84:2375 >> cluster
rio@083:~$ echo 192.168.1.124:2375 >> cluster
rio@083:~$ cat cluster
192.168.1.83:2375
192.168.1.84:2375
192.168.1.124:2375

第二步:在083這台機器上面執行 swarm manage 這條指令:

rio@083:~$ sudo docker run -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster
364af1f25b776f99927b8ae26ca8db5a6fe8ab8cc1e4629a5a68b48951f598ad

使用docker ps來 檢視有沒有啟動成功:

rio@083:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS                    NAMES
364af1f25b77        swarm:latest        "/swarm manage file:   About a minute ago   Up About a minute   0.0.0.0:2376->2375/tcp   happy_euclid

可以看到,此時整個叢集已經啟動成功。

在使用這條指令的時候需要注意的是注意:這裡一定要使用-v指令,因為cluster檔案是在本機上面,啟動的容器 預設是存取不到的,所以要透過-v指令共享。

接下來的就可以在任何一台安裝了docker的機器上面透過指令使用叢集,同樣的,在85這台機器上執行docker info指令 檢視叢集的節點資訊:

rio@s085:~$ sudo docker -H 192.168.1.83:2376 info
Containers: 9
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
 atsgxxx: 192.168.1.227:2375
  └ Containers: 0
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 2.052 GiB
 sclu083: 192.168.1.83:2375
  └ Containers: 2
  └ Reserved CPUs: 0 / 2
  └ Reserved Memory: 0 B / 4.054 GiB
 sclu084: 192.168.1.84:2375
  └ Containers: 7
  └ Reserved CPUs: 0 / 2
  └ Reserved Memory: 0 B / 4.053 GiB

results matching ""

    No results matching ""