UDN-企业互联网技术人气社区

板块导航

浏览  : 1790
回复  : 0

[技术交流] Docker完整解决方案实践(上)

[复制链接]
芭芭拉的头像 楼主
发表于 2016-7-18 10:23:14 | 显示全部楼层 |阅读模式
本帖最后由 芭芭拉 于 2016-7-18 10:31 编辑

  Docker从2013年发布第一个版本以来,已经火遍全球,技术迭代也比较频繁,其周边产品和技术也越来越丰富。Docker的轻量级容器不仅实现了资源隔离,而且几乎可以运行在任何地方,使得部署和扩展变得非常容易,随着Docker的日趋完善,目前Docker已经被越来越多的公司应用到生产环境中。

  一、环境

  1.1、宿主机操作系统环境

  Centos7.1-64

  1.2、Docker版本

  Server Version: 1.9.1

  1.3、集群网络环境

  master:10.2.0.80

  slave1:10.2.0.77

  slave2:10.2.0.134

  服务发现:10.2.0.99

  二、介绍一下各组件

  1、Docker

  Docker daemon引擎

  2、consul

  服务发现和配置共享的服务软件

  3、swarm

  基于Docker的集群调度管理软件,Docker 1.2版本中已经自动集成集群功能了。

  4、rethinkdb

  RethinkDB是一个完全支持Memcached协议、数据可持久化的工业级key-value存储系统,它自带了cluster和web资源管理功能。

  5、shipyard

  Docker可视化资源管理平台

  6、registrator

  服务自动注册

  7、nginx

  web服务代理软件

  8、consultemplate

  Docker服务自动发现软件,这个要结合nginx使用,当我们在宿主机上启动一个容器服务时,这时候consultemplate就会自动从consul服务上发现在这个容器,并更新nginx配置文件。

  9、cadvisor

  google公司开源的Docker容器资源监控软件

  10、influxdb

  InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。

  11、grafana

  图表展现服务,功能非常强大。

  12、graylog+ Elasticsearch

  具有报警选项的可插入日志和事件分析服务器

  三、安装Docker

  具体的安装方法可以参考官方文档:

  https://docs.Docker.com/engine ... ntos/

  针对 CentOS, 则需要修改以下配置文件:
  1. vim /etc/sysconfig/Docker
复制代码

  如果没有个Docker配置文件,可以把以下这段直接加上,
  1. #

  2. /etc/sysconfig/Docker

  3. #
  4. Other arguments to pass to the Docker daemon process

  5. These will be parsed by the sysv initscript and appended

  6. to the arguments list passed to Docker -d

  7. other_args="-g /opt/test/Docker -H tcp://127.0.0.1:2375 -H unix:///var/run/Docker.sock --insecure-registry registry.intra.test.com:5000 "

  8. Docker_CERT_PATH=/etc/Docker

  9. Resolves: rhbz#1176302 (Docker issue #407)

  10. Docker_NOWARN_KERNEL_VERSION=1

  11. Location used for temporary files, such as those created by

  12. # Docker load and build operations. Default is /var/lib/Docker/tmp

  13. # Can be overriden by setting the following environment variable.

  14. # Docker_TMPDIR=/var/tmp

  15. Docker_TMPDIR=/opt/Docker/tmp
  16. #
复制代码

  以上配置文件主要修改3点

  1、Docker安装的一些初始化信息变更。例如原来容器安装完,它们相关的信息默认是存储在/var/lib/Docker目录下,我现在把安改到/opt/Docker目录下,因为以后所有容器产生的日志等相关数据都会存在这个目录下,所以尽量选择一个大的分区。

  2、Docker daemon的socket绑定信息

  3、增加了私有仓库地址,如果没有私有仓库,那就可以不用改。

  然后你就可以启动Docker服务了.

  systemctl enable Docker && service start Docker

  四、安装consul服务

  这就开始了,因为有了Docker,所以千万就不要再想着用源代码或者rpm方式来安装相关服务,那样就显得太low了,以后一切的服务皆可用容器方式来运行。consul相关的资料请参考官网https://www.consul.io/intro/ge ... .html,如果还有不理解的就查查google吧,与它类似的服务还有etcd,zookeeper,doozerd等,这方面我就不多说了。因为consul的高可用集群最少需要3台机器,但是这3台,只要其中一台故障这个consul的集群就挂了,按官方的建 议最好5台,这样可以同时故障2台,但是我为节省资源就用3台。所以我在master,slave1,slave2的机器都安装了consul服务

  4.1、master:10.2.0.80
  1. Docker run -d \
  2. -p 8300:8300 \
  3. -p 8301:8301 \
  4. -p 8301:8301/udp \
  5. -p 8302:8302 \
  6. -p 8302:8302/udp \
  7. -p 8400:8400 \
  8. -p 8500:8500 \

  9. -p 8600:53 \
  10. -p 53:53/udp \
  11. -v /opt/test/data/consul:/data \
  12. -h $HOSTNAME \
  13. --restart=always \
  14. --name=consul progrium/consul:latest -server -bootstrap -ui-dir=/ui -advertise 10.2.0.80 -client 0.0.0.0
复制代码

  解释下各个参数:

  • -d 容器在后台运行, detached mode
  • --restart=always 重启模式, always 表示永远
  • -p 8400:8400 映射 consul的 rpc 端口8400
  • -p 8500:8500 映射 UI 界面的端口8500.
  • -p 53/udp 绑定udp 端口53(默认 DNS端口)在 Docker0 bridge 地址上.
  • -v /opt/test/data/consul:/data 这个把consul的数据文件目录挂载到宿主机上,这样万一容器重启,数据就不会丢失。
  • -advertise 10.2.0.80 服务对外公布的 IP, 否则 service 会显示为内部的容器的 IP 地址, 这样就访问不到了.
  • -client 0.0.0.0 consul 监听的地址.

  然后咱们开始部署其它2台consul agent机器, 这次要增加 -join 参数

  4.2、slave1:10.2.0.77
  1. Docker run -d \
  2. -p 8300:8300 \
  3. -p 8301:8301 \
  4. -p 8301:8301/udp \
  5. -p 8302:8302 \
  6. -p 8302:8302/udp \

  7. -p 8400:8400 \
  8. -p 8500:8500 \
  9. -v /opt/test/data/consul:/data \
  10. -h $HOSTNAME \
  11. --restart=always \
  12. --name=consul progrium/consul:latest \
  13. -server -join 10.2.0.80 -advertise 10.2.0.77 -client 0.0.0.0
复制代码

  4.3、slave2:10.2.0.134
  1. Docker run -d \
  2. -p 8300:8300 \
  3. -p 8301:8301 \
  4. -p 8301:8301/udp \
  5. -p 8302:8302 \
  6. -p 8302:8302/udp \

  7. -p 8400:8400 \
  8. -p 8500:8500 \
  9. -v /opt/test/data/consul:/data \
  10. -h $HOSTNAME \
  11. --restart=always \
  12. --name=consul progrium/consul:latest \
  13. -server -join 10.2.0.80 -advertise 10.2.0.134 -client 0.0.0.0
复制代码

  这样consul集群服务已经安装完成,这时我们进入10.2.0.80启动的consul容器查看一下consul的状态

  4.4、进入consul 容器

  Docker exec -it d638539891e7 bash

  #consul info //查看consul状态,看到leader = true和server=true说明整集群状态已经正常了。
  1. agent:
  2. check_monitors = 0
  3. check_ttls = 0
  4. checks = 0
  5. services = 29
  6. build:
  7. prerelease =
  8. revision = 9a9cc934
  9. version = 0.5.2
  10. consul:
  11. bootstrap = true
  12. known_datacenters = 1
  13. leader = true
  14. server = true
复制代码

  #consul members //看到consul集群已检测到3台server了。并且状态都正常。
  1. Node Address Status Type Build Protocol DC
  2. 10.2.0.80 10.2.0.80:8301 alive server 0.5.2 2 dc1
  3. 10.2.0.77 10.2.0.77:8301 alive server 0.5.2 2 dc1
复制代码

  10.2.0.134 10.2.0.134:8301 alive server 0.5.2 2 dc1

  #现在就可以看到consul的web平台了

  http://10.2.0.80:8500/ui/#/dc1/services

  五、安装swarm、shipyard管理平台



  但是不要看着他们的安装步骤, 就直接开始了,因为官网用的是 etcd 不是 consul 的, consul 是 Docker 官网推荐的,像大的互联网公司用的基本上是consul,所以我也推荐。

  5.1、添加master:10.2.0.80节点

  5.1.1、启动容器shipyard-rethinkdb
  1. Docker run -it -d -p 8080:8080 -h $HOSTNAME -v /opt/test/data:/data --restart=always --name shipyard-rethinkdb rethinkdb:latest
复制代码

  参数解释:

  -v /opt/test/data:data 把rethinkdb的数据目录挂载到宿主机的/opt/test/data目录下,这样rethinkdb容器如果重启,数据不会丢失。

  -p 8080:8080 映射rethinkdb的 web UI端口,这样可以看到rethinkdb的web可视化资源管理平台。

  为了增加rethinkdb的高可用,有条件的话可以把它做成一个cluster,具体参考https://github.com/Dockerfile/rethinkdb

  5.1.2、启动shipyard-proxy
  1. Docker run -ti -d -p 10.2.0.80:2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/Docker.sock:/var/run/Docker.sock -e PORT=2375 shipyard/Docker-proxy:latest
复制代码

  5.1.3、启动shipyard-swarm-manager
  1. Docker run -ti -d --restart=always --name shipyard-swarm-manager registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 manage --replication --addr 10.2.0.80:3375 --host tcp://0.0.0.0:3375 consul://10.2.0.80:8500
复制代码

  5.1.4、启动shipyard-swarm-agent
  1. Docker run -ti -d --restart=always --name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 join --addr 10.2.0.80:2375 consul://10.2.0.80:8500
复制代码

  5.1.5、启动shipyard-controller
  1. Docker run -it -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 80:8080 shipyard/shipyard:latest server -d tcp://swarm:3375
复制代码

  5.2、添加slave1:10.2.0.77节点

  5.2.1、启动shipyard-proxy

  Docker run -ti -d -p 10.2.0.77:2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/Docker.sock:/var/run/Docker.sock -e PORT=2375 registry.intra.test.com:5000/ops/shipyard-Docker-proxy:v0.1

  5.2.2、启动shipyard-swarm-agent
  1. Docker run -ti -d --restart=always --name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 join --addr 10.2.0.77:2375 consul://10.2.0.80:8500
复制代码


  5.2.3、添加registrator

  registrator 是基于 Docker 的 sock 文件来做服务发现的一个第三方的方案,有实力的公司也可以自已开发服务注册agent。
registrator的官网资料参考http://gliderlabs.com/registrator/latest/
  1. 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
复制代码

  例:Docker run -d --restart=always --name=registrator --net=host -v /var/run/Docker.sock:/tmp/Docker.sock gliderlabs/registrator -ip 10.2.0.77 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 接口上。

  5.3、添加slave1:10.2.0.134节点

  5.3.1、启动shipyard-proxy
  1. Docker run -ti -d -p 10.2.0.134:2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/Docker.sock:/var/run/Docker.sock -e PORT=2375 registry.intra.test.com:5000/test/ops/shipyard-Docker-proxy:v0.1
复制代码

  5.3.2、启动shipyard-swarm-agent
  1. Docker run -ti -d --restart=always --name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 join --addr 10.2.0.134:2375 consul://10.2.0.80:8500
复制代码

  5.3.3、添加registrator
  1. Docker run -d --restart=always --name=registrator --net=host -v /var/run/Docker.sock:/tmp/Docker.sock gliderlabs/registrator -ip 10.2.0.134 consul://localhost:8500
复制代码

  Docker DNS & Service Discovery with Consul and Registrator

  以上服务都启动后就可以访问shipyard的管理平台了 http://10.2.0.80/#/containers,默认的用户名:admin,密码:shipyard ,通过这个平台就可以看到这3台宿主机上启动的所有容器,可以对它进行重启,暂停,部署,扩容等各种可视化操作。这个平台满足目前开发和测试的环境,我觉得问题不大,如果要用于生产环境,还是有

  几点以下问题的思考:

  1、需要考虑shipyard管理平台本身的高可用。

  2、整个集群的资源无法进行隔离,例如:这个集群我有10台slave宿主机,我想把其中的一个服务的10个容器只部署在3台宿主机上。目前这个集群做不到。

  3、集群中的容器要做升级时,无法选择升级策略。

原文作者:佚名 来源:http://dockone.io/article/1545


  Docker完整解决方案实践(下)

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部