网上乱七八糟的资料实在是太多了, 乱, 特别乱, 而看书呢, 我读了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 来部署的, 恩, 经过本人各种尝试, 和各种百度以及* 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.1 -
consul://localhost:8500
consul 绑定到本地的 consul 接口上
参考资料:
Docker DNS & Service Discovery with Consul and Registrator
装个 nginx, 挂个域名, 再装个 registry 啥的都是后续的玩法, 前面咱们已经搭起来玩的环境了, 我后面再写服务发现的例子, 这些够大家玩了, have fun, 自己体会吧.
本篇文章是我原创, 未经本人允许, 请勿转载. 谢谢!!