## 使用
在使用 swarm 管理集群前,需要把集群中所有的節點的 docker daemon 的監聽方式更改為 `0.0.0.0:2375`。
可以有兩種方式達到這個目的,第一種是在啟動docker daemon的時候指定
```sh
sudo docker -H 0.0.0.0:2375&
```
第二種方式是直接修改 Docker 的配置文件(Ubuntu 上是 `/etc/default/docker`,其他版本的 Linux 上略有不同)
在文件的最后添加下面這句代碼:
```sh
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
```
需要注意的是,一定要在所有希望被 Swarm 管理的節點上進行的。修改之后要重啟 Docker
```sh
sudo service docker restart
```
Docker 集群管理需要使用服務發現(Discovery service backend)功能,Swarm支持以下的幾種方式:DockerHub 提供的服務發現功能,本地的文件,etcd,counsel,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,用來標識要管理的集群。
```sh
sudo docker run --rm swarm create
```
我們在84這臺機器上執行這條命令,輸出如下:
```sh
rio@084:~$ sudo docker run --rm swarm create
b7625e5a7a2dc7f8c4faacf2b510078e
```
可以看到我們返回的 token 是 `b7625e5a7a2dc7f8c4faacf2b510078e`,每次返回的結果都是不一樣的。這個 token 一定要記住,后面的操作都會用到這個 token。
#### 加入集群
在所有要加入集群的節點上面執行 `swarm join` 命令,表示要把這臺機器加入這個集群當中。在本次試驗中,就是要在 83、84 和 124 這三臺機器上執行下面的這條命令:
```sh
sudo docker run --rm swarm join --addr=ip_address:2375 token://token_id
```
其中的 ip_address 換成執行這條命令的機器的 IP,token_id 換成上一步執行 `swarm create` 返回的 token。
在83這臺機器上面的執行結果如下:
```sh
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` 命令:
```sh
sudo docker run -d -p 2376:2375 swarm manage token://b7625e5a7a2dc7f8c4faacf2b510078e
```
執行結果如下:
```sh
rio@083:~$ sudo docker run -d -p 2376:2375 swarm manage token://b7625e5a7a2dc7f8c4faacf2b510078e
83de3e9149b7a0ef49916d1dbe073e44e8c31c2fcbe98d962a4f85380ef25f76
```
這條命令如果執行成功會返回已經啟動的 Swarm 的容器的 ID,此時整個集群已經啟動起來了。
現在通過 `docker ps` 命令來看下有沒有啟動成功。
```sh
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` 命令:
```sh
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 支持的命令。
```sh
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可能會因為網絡的原因會出現類似于下面的這個問題:
```sh
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這臺機器上面操作:
```sh
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` 這條命令:
```sh
rio@083:~$ sudo docker run -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster
364af1f25b776f99927b8ae26ca8db5a6fe8ab8cc1e4629a5a68b48951f598ad
```
使用`docker ps`來查看有沒有啟動成功:
```sh
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命令查看集群的節點信息:
```sh
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
```
- 前言
- Docker 簡介
- 什么是 Docker
- 為什么要用 Docker
- 基本概念
- 鏡像
- 容器
- 倉庫
- 安裝
- Ubuntu
- CentOS
- 鏡像
- 獲取鏡像
- 列出
- 創建
- 存出和載入
- 移除
- 實現原理
- 容器
- 啟動
- 守護態運行
- 終止
- 進入容器
- 導出和導入
- 刪除
- 倉庫
- Docker Hub
- 私有倉庫
- 配置文件
- 數據管理
- 數據卷
- 數據卷容器
- 備份、恢復、遷移數據卷
- 使用網絡
- 外部訪問容器
- 容器互聯
- 高級網絡配置
- 快速配置指南
- 配置 DNS
- 容器訪問控制
- 端口映射實現
- 配置 docker0 網橋
- 自定義網橋
- 工具和示例
- 編輯網絡配置文件
- 實例:創建一個點到點連接
- 實戰案例
- 使用 Supervisor 來管理進程
- 創建 tomcat/weblogic 集群
- 多臺物理主機之間的容器互聯
- 標準化開發測試和生產環境
- 安全
- 內核名字空間
- 控制組
- 服務端防護
- 內核能力機制
- 其它安全特性
- 總結
- Dockerfile
- 基本結構
- 指令
- 創建鏡像
- 底層實現
- 基本架構
- 名字空間
- 控制組
- 聯合文件系統
- 容器格式
- 網絡
- Docker Compose 項目
- 簡介
- 安裝
- 使用
- 命令說明
- YAML 模板文件
- Docker Machine 項目
- 簡介
- 安裝
- 使用
- Docker Swarm 項目
- 簡介
- 安裝
- 使用
- 調度器
- 過濾器
- Etcd 項目
- 簡介
- 安裝
- 使用 etcdctl
- Fig 項目
- 簡介
- 安裝
- 命令參考
- fig.yml參考
- 環境變量參考
- 實戰 Django
- 實戰 Rails
- 實戰 wordpress
- CoreOS 項目
- 簡介
- 工具
- 快速搭建CoreOS集群
- Kubernetes 項目
- 簡介
- 快速上手
- 基本概念
- kubectl 使用
- 架構設計
- Mesos 項目
- 簡介
- 安裝與使用
- 原理與架構
- 配置項解析
- 常見框架
- 附錄一:命令查詢
- 附錄二:常見倉庫介紹
- Ubuntu
- CentOS
- MySQL
- MongoDB
- Redis
- Nginx
- WordPress
- Node.js
- 附錄三:有用的資源