目的
學習docker的集群管理,摸索出高可用的docker微服務架構方案。本篇文章只初步的了解下swarm(docker新版已集成了swarm)的使用,了解docker的發現服務的基礎方法(docker hub 提供的內置方法,其他的比如:etcd、consul、zookeeper)
環境
三台虛擬主機:
192.168.139.128 (master,node1)
192.168.139.129(node2)
192.168.138.130(node3)
操作系統:centos7.3
Docker version 1.13.1, build 092cba3
一、安裝Docker
docker的安裝(略)
由於后面的shipyard需要docker的tcp方式訪問,需要修改docker的配置:
vi /lib/systemd/system/docker.service
修改 ExecStart:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -D -H tcp://0.0.0.0:2375
重啟docker
systemctl daemon-reload
systemctl start docker.service
當然實際用於生產環境這種方式並不安全,可用於測試。新版本doker swarm 支持TSL安全方式,后面的文章會講到。
二、安裝Swarm
swarm是一個docker集群管理工具。(swarm is a simple tool which controls a cluster of Docker hosts and exposes it as a single "virtual" host.)
1.拉取鏡像
docker pull swarm
2.配Swarm集群
在任意的docker節點創建一個全世界唯一的token(集群ID),記住這個token后面需要用到。(這里用的發現服務是dockhub內置的,當然還有其他的比如etcd、consul等。)
docker run --rm swarm create
我這里獲取到的token是:3c739bd3a589da0788978f502ea318ea
啟動swarm manger
docker run -ti -d -p 2376:2375 --restart=always --name shipyard-swarm-manager swarm:latest manage --host tcp://0.0.0.0:2375 token://3c739bd3a589da0788978f502ea318ea
啟動swarm agent,將當前docker節點加入到集群中:
這里我把三台服務器(VM)加入節點到集群,在每個docker節點上分開執行。
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --addr 192.168.139.128:2375 token://3c739bd3a589da0788978f502ea318ea
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --addr 192.168.139.129:2375 token://3c739bd3a589da0788978f502ea318ea
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --addr 192.168.139.130:2375 token://3c739bd3a589da0788978f502ea318ea
可以使用命令查看docker節點情況(任意docker節點上都可以執行):
docker run --rm swarm list token://3c739bd3a589da0788978f502ea318ea
可以使用命令查看docker集群的詳情(可在任意docker節點上執行,IP地址是裝了swarm master主機的IP):
docker -H 192.168.139.128:2376 info
三、安裝Shipyard
1.拉取鏡像
docker pull rethinkdb
docker pull shipyard/shipyard
2.啟動rethinkdb
docker run -ti -d --restart=always --name shipyard-rethinkdb -p 8082:8080 -p 28015:28015 -p 29015:29015 -v /opt/rethinkdb:/data rethinkdb
這里暴露8082端口用於查看rethinkdb的使用情況:打開http://192.168.139.128:8082顯示如下:

4.啟動shipyard
docker run -ti -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8081:8080 shipyard/shipyard server -d tcp://swarm:2375
訪問http://192.168.138.128::8001 可打開swarm的管理界面了
查看容器:

查看鏡像:

查看節點:

可能遇到的問題
1.訪問shipyard管理界面時候打不開?
答:由於采用了rethinkdb數據庫,數據庫未准備好之前是不能打開的,需要等大約1分鍾。
2.shipyard能打開,但是沒有容器和鏡像?
答:需要設置防火牆或關閉防火牆。
firewall-cmd --zone=public --permanent --add-port=2375/tcp
firewall-cmd --reload
3.在shipyard中找不到某些docker節點?
答:可能由於訪問discovery.hub.docker.com的網絡不穩定原因(超時),嘗試重啟swarm agent容器。
ERRO[0011] Post https://discovery.hub.docker.com/v1/clusters/3c739bd3a589da0788978f502ea318ea?ttl=180: net/http: TLS handshake timeout
答:需要設置防火牆或關閉防火牆。
還需要解決的問題
- 發現服務不穩定,嘗試使用其他發現服務(etcd、consul、zookeeper).
- 使用新版Docker內置的swarm的創建集群
- 使用Docker的STL安全連接
- 實現Docker集群的高可用架構(生產環境)
