網上亂七八糟的資料實在是太多了, 亂, 特別亂, 而看書呢, 我讀了2本書, 一本叫做<<第一本 Docker 書>>, 另一本叫做<< Docker進階與實戰>> 在 服務發現這塊講的又不清不楚的, 坑死個人. 今天特意記錄下, 並整理下來,以防自己哪天又忘了, 也給同在研究Docker 的朋友們一個安裝教程.
我單位測試機一共四臺, 各位可以起4個虛擬機器對應, 假定分別是141,142,143,144. 都是 CentOS 6.x 系統.
Step1. 升級 CentOS 核心到3.10版本以上
首先升級141, 其它機器也是同樣的方法.
訪問elrepo.org, 按照網站上的提示一步步的安裝public key.
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
然後141是 CentOS6.x, 所以選擇安裝CentOS 6.x 的版本
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
裝好了後, 點選elrepo 網站最上面的Packages 選單, 找到 kernel-lt
http://elrepo.org/tiki/kernel-lt
按照提示直接裝最新版的 kernel long term 版本
yum --enablerepo=elrepo-kernel install kernel-lt
然後編輯/etc/grub.conf 檔案, 找到 default=1, 改成 default=0, 然後重啟 linux, 就搞定了!!!
其它伺服器依照此方法分別都更新. 更新完了, 用下面的命令看是否核心正確呼叫了.
# uname -r
4.1.2-1.el6.elrepo.x86_64
Step2. 安裝 Docker
訪問 Docker 官網, 找到針對CentOS 的安裝指示頁面.
https://docs.docker.com/engine/installation/linux/centos/
安裝官方的安裝說明安裝吧, 我就不為了顯擺而複述了. 其它機器也是這樣安裝. 裝好了請不要著急啟動 docker deamon...
因為還有坑... 請執行下面的命令修改 Docker 的預設啟動引數.
針對 ubuntu, 修改下面的檔案:
vi /etc/default/docker
新增這麼一行:
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
針對 CentOS, 則改為下面的這個檔案:
vi /etc/sysconfig/docker
修改 other_args 為
other_args="-H unix:///var/run/docker.sock -H 0.0.0.0:2375"
然後你就可以啟動Docker服務了.
service start docker
Step3. Consul
這就開始了, 因為有了docker,所以千萬千萬就不要老想著原始碼安裝了,那樣太 low B 了, 恩. consul 的概念請閱讀 consul 官網的資料(當然跟上面一樣都是英文的).
https://www.consul.io/intro/getting-started/install.html
上面是原理, 看懂了就得了, 因為安裝的話我們是用 Docker 來部署的, 恩, 經過本人各種嘗試, 和各種百度以及FQ Google, 終於搭建起來了可以跨主機互聯的服務發現, 下面是我的總結:
docker run -d \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:53 \
-p 8600:53/udp \
-h dev141 \
--restart=always \
--name=consul progrium/consul -server -bootstrap -ui-dir=/ui -advertise 192.168.123.141 -client 0.0.0.0
解釋下各個引數:
-d
容器在後臺執行, detached mode--restart=always
重啟模式, always 表示永遠-p 8400:8400
對映 consul的 rpc 埠8400-p 192.168.123.141:8500:8500
對映到公共 IP 這樣方便我們使用 UI 介面.-p 172.17.42.1:53:53/udp
繫結udp 埠53(預設 DNS埠)在 docker0 bridge 地址上.-advertise 192.168.123.141
服務對外公佈的 IP, 這裡特意設定為141, 否則 service 會顯示為內部的容器的 IP 地址, 這樣就訪問不到了.-client 0.0.0.0
consul 監聽的地址.
然後我們們開始部署其它三臺consul agent機器, 這次要增加 -join 引數, 先部署142, 假設142的 docker0的 bridge 地址依然是172.17.42.1
docker run -d --restart=always \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-h dev142 \
--name=consul progrium/consul -server -join 192.168.123.141 -advertise 192.168.123.142 -client 0.0.0.0
然後是143伺服器
docker run -d --restart=always \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-h dev143 \
--name=consul progrium/consul -join 192.168.123.141 -advertise 192.168.123.143 -client 0.0.0.0
144
docker run -d --restart=always \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-h dev144 \
--name=consul progrium/consul -join 192.168.123.141 -advertise 192.168.123.144 -client 0.0.0.0
看看 consul 的節點是不是增加了.
Step4. Swarm+Shipyard
swarm的資料在 docker 官網上有給, 所以你可以先看看 docker 官網的介紹資料, 恩, 還是那句話, 你先看看, 部署的話不要用那個... 下面有講.
https://docs.docker.com/swarm/overview/
恩, swarm 的比較知名的而且經過我實際測試的非常牛逼的docker管理系統 是 shipyard, 官網是
http://www.shipyard-project.com
看完shipyard 介紹請移步它的安裝頁面.
http://www.shipyard-project.com/docs/deploy/manual/
不要看著 Deploy 有個自動的就想去裝自動那個啊, 自動那個是 etcd 不是 consul 的, consul 是 docker 官網推薦的, 阿里雲啊, 新浪啊都是 consul 流派, 另外我看著名字好聽也是傾向 consul 啊.
先在141伺服器裝 rethinkdb 資料庫, 按照我給的命令來裝哈, 要不然你會裝不成功, 當然我這個是入門基礎搭建教程, 不是原理教程, 先搭起來你再慢慢想唄?
docker run -d --restart=always --name shipyard-rethinkdb rethinkdb
然後下一步shipped 的 discovery 的就不要裝了,還有 proxy 那個也不用裝了.
我們們在141上繼續裝 swarm manager, 請參照下面的命令來安裝, IP-OF-CONSUL-HOST替換為你的 consul 安裝的 ip地址.
docker run -d -p 3375:3375 --restart=always --name shipyard-swarm-manager swarm:latest manage --host tcp://0.0.0.0:3375 consul://192.168.123.141:8500
然後在142,143,144上分別安裝 swarm agent. ip-of-host是指你部署的機器的 ip 地址, 你在哪臺機器上部署swarm agent容器你就設定哪個地址.
docker run -d --restart=always --name shipyard-swarm-agent swarm:latest join --addr <ip-of-host>:2375 consul://192.168.123.141:8500
然後回到141機器部署 shipyard.
docker run -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard:latest server -d tcp://swarm:3375
然後你就可以在瀏覽器訪問141這臺機器的8080埠, 就能看到 shipyard 的登入頁面拉, 預設賬戶是 admin
, 密碼shipyard
.
Step5. Registrator
registrator 是基於 docker 的 sock 檔案來做服務發現的一個第三方的方案, 我試了下, 使用起來非常簡單. 在141-143機器上執行下面的命令分別安裝registrtator
docker run -d --restart=always --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -ip <ip-of-host> consul://localhost:8500
引數解釋:
-v /var/run/docker.sock:/tmp/docker.sock
對映 docker 的 socket 到 container 中的對應位置, 這樣 registration 就能監控有哪些服務啟動了.<ip-of-host>
registration 所屬的主機 IP, 一定要設定此屬性, 否則服務IP會顯示為127.0.0.1consul://localhost:8500
consul 繫結到本地的 consul 介面上
參考資料:
Docker DNS & Service Discovery with Consul and Registrator
裝個 nginx, 掛個域名, 再裝個 registry 啥的都是後續的玩法, 前面我們們已經搭起來玩的環境了, 我後面再寫服務發現的例子, 這些夠大家玩了, have fun, 自己體會吧.
本篇文章是我原創, 未經本人允許, 請勿轉載. 謝謝!!