手動部署docker swarm集群
前言
Docker Swarm是一個Dockerized化的分布式應用程序的本地集群,支持用戶創建可運行Docker Daemon的主機資源池,然后在資源池中運行Docker容器。它是官方的Docker集群管理工具,提供和docker基本一致的api,把多個主機虛擬化成一個獨立的主機,相對于marathon/mesos以及k8s,它更易于部署,并且由于和docker api一致,更容易上手。接下來本文將基于官方文檔,搭建一個docker swarm測試環境。
系統環境
本文測試時使用兩臺虛擬機A、B,配置如下:
- 操作系統:ubuntu 14.04
- docker server/client版本: 1.11.1
- docker API版本: 1.23
- 網卡信息: A: 192.168.56.4 B: 192.168.56.5
- docker配置: /etc/default/docker,內容如下:
- DOCKER_OPTS="--registry-mirror=http://houchaohann.m.alauda.cn -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
注意:如果先在其中一個虛擬機中部署Docker并配置好,然后通過克隆的方法復制第二個節點,會造成docker節點ID相同,此時需要手動刪除/etc/docker/key.json文件,再重啟docker服務即可。務必在此之前檢查docker節點的ID是否存在沖突:
- root@ubuntu-5:/etc/docker# docker info | grep ID
- ID: L2SK:T2RD:RQH2:YC2O:NJKA:EQH2:Q35Z:C26T:J75Y:RPDK:M5OX:FW6S
以上所有節點的ID不能出現重復!
安裝服務發現組件
docker swarm依賴于服務發現組件,支持的后端包括etcd、zookeeper、consul等,本文將使用consul作為服務發現后端:
為了簡化部署,本文不考慮服務發現組件的高可用,因此只有單節點,部署在A機器上:
- #!/bin/bash
- NAME=consul
- docker rm -f $NAME 2>/dev/null
- docker run -d --restart=always -p 8500:8500 --name=$NAME --hostname $NAME progrium/consul -server -bootstrap
配置Swarm集群
首先我們需要部署swarm manager節點,為了避免單點故障,我們部署兩個swarm master節點來保證高可用,在A機器中執行:
- #!/bin/bash
- MY_IP=192.168.56.4
- CONSUL_IP=192.168.56.4
- NAME=swarm-master-1
- docker rm -f $NAME &>/dev/null
- docker run -d -p 4000:4000 --restart=always --name $NAME --hostname $NAME swarm manage -H :4000 --replication --advertise $MY_IP:4000 consul://$CONSUL_IP:8500
在B機器上執行:
- #!/bin/bash
- MY_IP=192.168.56.5
- CONSUL_IP=192.168.56.4
- NAME=swarm-master-2
- docker rm -f $NAME &>/dev/null
- docker run -d -p 4000:4000 --name $NAME --hostname $NAME --restart=always swarm manage -H :4000 --replication --advertise $MY_IP:4000 consul://$CONSUL_IP:8500
部署好swarm manager節點后,就可以增加我們的計算節點了,由于我們的節點有限,計算節點同樣部署在A、B機器上:
在A節點運行:
- #!/bin/bash
- CONSUL_IP=192.168.56.4
- MY_IP=192.168.56.4
- NAME=swarm-node-1
- docker rm -f $NAME &>/dev/null
- docker run -d --name $NAME --hostname $NAME --restart=always swarm join --advertise=$MY_IP:2375 consul://$CONSUL_IP:8500
在B節點上運行:
- #!/bin/bash
- CONSUL_IP=192.168.56.4
- MY_IP=192.168.56.5
- NAME=swarm-node-2
- docker rm -f $NAME &>/dev/null
- docker run -d --name $NAME --hostname $NAME --restart=always swarm join --advertise=$MY_IP:2375 consul://$CONSUL_IP:8500
檢查集群
以上工作均完成以后,就可以手動測試是否工作了:
- docker -H :4000 info
輸出:
- Containers: 6
- Running: 5
- Paused: 0
- Stopped: 1
- Images: 8
- Server Version: swarm/1.2.2
- Role: primary
- Strategy: spread
- Filters: health, port, containerslots, dependency, affinity, constraint
- Nodes: 2
- ubuntu-4: 172.16.1.24:2375
- └ ID: N2NA:VXFI:KKUR:FEJL:NG72:B5YN:HEP3:WENB:V6AZ:EGGK:RAC3:KXKH
- └ Status: Healthy
- └ Containers: 4
- └ Reserved CPUs: 0 / 1
- └ Reserved Memory: 0 B / 1.018 GiB
- └ Labels: executiondriver=, kernelversion=4.2.0-36-generic, operatingsystem=Ubuntu 14.04.4 LTS, storagedriver=aufs
- └ Error: (none)
- └ UpdatedAt: 2016-05-10T17:13:30Z
- └ ServerVersion: 1.11.1
- ubuntu-5: 172.16.1.178:2375
- └ ID: L2SK:T2RD:RQH2:YC2O:NJKA:EQH2:Q35Z:C26T:J75Y:RPDK:M5OX:FW6S
- └ Status: Healthy
- └ Containers: 2
- └ Reserved CPUs: 0 / 1
- └ Reserved Memory: 0 B / 1.018 GiB
- └ Labels: executiondriver=, kernelversion=4.2.0-36-generic, operatingsystem=Ubuntu 14.04.4 LTS, storagedriver=aufs
- └ Error: (none)
- └ UpdatedAt: 2016-05-10T17:13:31Z
- └ ServerVersion: 1.11.1
- Plugins:
- Volume:
- Network:
- Kernel Version: 4.2.0-36-generic
- Operating System: linux
- Architecture: amd64
- CPUs: 2
- Total Memory: 2.036 GiB
- Name: swarm-master
- Docker Root Dir:
- Debug mode (client): false
- Debug mode (server): false
從結果中我們發現,我們一共有兩個節點,務必檢查每個節點的Status為Healthy。
【本文是51CTO專欄作者“付廣平”的原創文章,如需轉載請通過51CTO獲得聯系】