Try Docker Swarm

Docker 最近出了 1.6 版,Docker Swarm 也隨之更新了。

參考了以下的網站,自己嘗試做做看~ 原文連結

Docker Swarm 示意圖

開始

這邊實作的是與 docker-machine 結合的部分

  • 先產生一個 token
1
$ docker run swarm create
2
c745d2d1bd2f65579e41f3808533da86

接下來複製上面產生的 Token,後面要用到

  • 先建立 swarm-master
1
$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://c745d2d1bd2f65579e41f3808533da86 swarm-master
2
INFO[0000] Creating SSH key...
3
INFO[0000] Creating VirtualBox VM...
4
INFO[0010] Starting VirtualBox VM...
5
INFO[0010] Waiting for VM to start...
6
INFO[0087] "swarm-master" has been created and is now the active machine.
7
INFO[0087] To point your Docker client at it, run this in your shell: docker-machine env swarm-master | source
  • 接下來分別建立 swarm-node01, swarm-node02
1
$  docker-machine create -d virtualbox --swarm --swarm-discovery token://c745d2d1bd2f65579e41f3808533da86 swarm-node-01
2
INFO[0000] Creating SSH key...
3
INFO[0000] Creating VirtualBox VM...
4
INFO[0010] Starting VirtualBox VM...
5
INFO[0011] Waiting for VM to start...
6
INFO[0073] "swarm-node-01" has been created and is now the active machine.
7
INFO[0073] To point your Docker client at it, run this in your shell: docker-machine env swarm-node-01 | source
1
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://c745d2d1bd2f65579e41f3808533da86 swarm-node-02
2
INFO[0000] Creating SSH key...
3
INFO[0000] Creating VirtualBox VM...
4
INFO[0010] Starting VirtualBox VM...
5
INFO[0011] Waiting for VM to start...
6
INFO[0070] "swarm-node-02" has been created and is now the active machine.
7
INFO[0070] To point your Docker client at it, run this in your shell: docker-machine env swarm-node-02 | source
  • 執行後的結果
1
$ docker-machine ls
2
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
3
swarm-master             virtualbox   Running   tcp://192.168.99.102:2376   swarm-master (master)
4
swarm-node-01            virtualbox   Running   tcp://192.168.99.103:2376   swarm-master
5
swarm-node-02   *        virtualbox   Running   tcp://192.168.99.104:2376   swarm-master
  • 看一下 swarm-master 裡面,跑了什麼東西

如果發現,執行 docker ps 沒東西,表示你現在並非在 swarm-master 先執行一下 docker-machine active swarm-master 就可以

理論上,會有兩個 container 已經跑起來在 swarm-master,就是上面那張圖的 agent (紫色)

1
$ docker ps
2
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                              NAMES
3
a53db3d5ffc4        swarm:latest        "/swarm join --addr    35 minutes ago      Up 16 minutes       2375/tcp                           swarm-agent
4
e98fbd194f54        swarm:latest        "/swarm manage --tls   35 minutes ago      Up 16 minutes       2375/tcp, 0.0.0.0:3376->3376/tcp   swarm-agent-master
  • Swarm Cluster 的內容

先執行 eval "$(docker-machine env --swarm swarm-master)" 所以這邊就顯示了,我建立了兩個 node

1
$ docker info
2
Containers: 4
3
Strategy: spread
4
Filters: affinity, health, constraint, port, dependency
5
Nodes: 3
6
 swarm-master: 192.168.99.102:2376
7
  └ Containers: 2
8
  └ Reserved CPUs: 0 / 4
9
  └ Reserved Memory: 0 B / 1.025 GiB
10
 swarm-node-01: 192.168.99.103:2376
11
  └ Containers: 1
12
  └ Reserved CPUs: 0 / 4
13
  └ Reserved Memory: 0 B / 1.025 GiB
14
 swarm-node-02: 192.168.99.104:2376
15
  └ Containers: 1
16
  └ Reserved CPUs: 0 / 4
17
  └ Reserved Memory: 0 B / 1.025 GiB
  • 可以用下面的指令列出 swarm 的 node,如果你有建立兩個以上的 swarm-master,用的是你建立 swarm-master 的 token 來區分
1
$ docker run swarm list token://c745d2d1bd2f65579e41f3808533da86
2
192.168.99.104:2376
3
192.168.99.102:2376
4
192.168.99.103:2376

2015-05-02 更新,我之前因為使用 token 是用原文的範例指令直接執行,所以,註冊 Swarm 的時候,會與原本註冊的資料重複,如果自己產生一組 Token 就不會這樣了~

後記

其實我現在對 Docker Swarm 的了解還沒有很深入,只是先照著文章的步驟做出來而已,還在想這個可以應用在哪邊,之後如果有想到或嘗試什麼新的東西,會在寫下來

在我嘗試這篇文章的步驟時,出現了一個意料之外的狀況,就是我先把我本機的 docker 升級到 1.6,結果我建立出來的 virtualbox image 卻不是這個版本,所以就噴出了以下的錯誤:

1
FATA[0000] Error response from daemon: client and server don't have same version (client : 1.18, server: 1.17)

如果遇到這個狀況,只需要升級 swarm-master 的 boot2docker 版本就可以。 這時候就會覺得 docker-machine 很好用 .....

1
docker-machine upgrade swarm-master

然後等它做完,重新啟動 docker-machine 就好~ (建議是要重新啟動,因為我不重新啟動就不能用~)