docker-compose 搭建 consul, registrator, consul-template,nginx环境。

为了真实近似模拟线上,下面的配置都是一个服务一个docker-compose.yml文件。


consul

version: '3.3'
services:
  consul:
    image: consul
    container_name: consul_server
    network_mode: bridge 
    ports:
      - 8300:8300
      - 8301:8301
      - 8301:8301/udp
      - 8302:8302
      - 8302:8302/udp
      - 8400:8400
      - 8500:8500
      - 53:53/udp
    command: consul agent -data-dir=/tmp/consul -server -bootstrap -domain=zhenhe.li -client=0.0.0.0
 
 

2018-04-22 23:06 做出更改:

1.镜像image由原来的progrium/consul 修改为官方的consul, 原因是原来的镜像中consul版本过低没有新特性。官方目前是1.0.7

2.参数变更为 consul agent 开头,同时新版本中要求参数要加入 -client=x.x.x.x 否则默认127.0.0.1 不允许外部ip 访问

新特性包含critical服务定时清除,允许Tags定义覆盖,增加Meta属性(非常有用,在后面的 template 中使用):

请求示例:

{
  "ID": "redis1",
  "Name": "redis",
  "Tags": [
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",
  "Port": 8000,
  "Meta": {
    "redis_version": "4.0"
  },
  "EnableTagOverride": false,
  "Check": {
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://localhost:5000/health",
    "Interval": "10s"
  }
}

响应示例:

{
	"redis1": {
		"ID": "redis1",
		"Service": "redis",
		"Tags": ["primary", "v1"],
		"Address": "127.0.0.1",
		"Meta": {
			"redis_version": "4.0"
		},
		"Port": 8000,
		"EnableTagOverride": false,
		"CreateIndex": 0,
		"ModifyIndex": 0
	}
}



registrator

version: '3.3'
services:
  registrator:
    image: gliderlabs/registrator
    container_name: docker_consul_registrator 
    network_mode: bridge
    external_links:
      - consul_server:consul
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
    command: consul://consul:8500
    

上述配置文件中。 network_mode 使用的bridge ,这其中也踩过坑。网上有很多示例是host, 意思是docker 可以与宿主机共有一网套络,就是说进入容器执行ifconfig与宿主机看到的可能是一样的,暴露的端口也占用宿主机端口。后来反复测试发现在mac os中,network_mode=host 这个配置不能达到上述要求。最终在一篇讨论看到结论:Should docker run –net=host work?

讨论中说network_mode=host在linux中可以正常运行,有时间我验证一下。




nginx+consul-template, 这个网上或docker hub上有别人已经做好了,但是模板ctmpl文件都是根据自己的环境编写的,有可能不符合自己的要求,所以这一步还是要自己去pull nginx镜像,加入最新版consul-template,然后commit, push到hub上或自己的仓库中使用。

之所以要用自己的镜像,一个非常重要的原因是consul-template版本还是变更非常快的,它要随着consul版本的变更而变更Struct,用来解析最新的nodes, services等等json结构。 举例,我们本例中会用到的Meta属性就是目前网上现有的consul-template-nginx镜像中包含的consul-template所不能解析的。


自己基于官方nginx 镜像加入最新版的 consul-template,加入自己的ctmpl 模板文件

自定义consul-template-nginx

Dockerfile  

FROM nginx
MAINTAINER LiZhenhe <zhenhe.li@vcg.com>

RUN apt-get update && \
    apt-get install --no-install-recommends --no-install-suggests -y unzip && \
    rm -r /var/lib/apt/lists/*


ENV CONSUL_TEMPLATE_VERSION 0.19.4
ADD https://releases.hashicorp.com/consul-template/${CONSUL_TEMPLATE_VERSION}/consul-template_${CONSUL_TEMPLATE_VERSION}_linux_amd64.zip /tmp/consul-template.zip

RUN unzip /tmp/consul-template.zip -d /usr/bin && \
    chmod +x /usr/bin/consul-template && \
    rm /tmp/consul-template.zip
RUN mkdir /etc/ctmpl
COPY ctmpl /etc/ctmpl
WORKDIR /etc/ctmpl

ENTRYPOINT ["/usr/bin/consul-template"]


ctmpl模板文件, 内容还需要改造。这个模板来自网上,稍后,我基于这个模板加入Meta进行多域名解析的改造,适应我们现在线上环境的需求


{{range services}}
  upstream {{.Name}} {
    least_conn;{{range service .Name}}
    server {{.Address}}:{{.Port}};{{end}}
  }
{{end}}

server {
    listen 80;
    proxy_set_header            Host $host;
    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    {{range services}}
          location {{.Name}} {
            proxy_read_timeout 180;
            proxy_pass http://{{.Name}}/{{.Name}};
          }
    {{end}}
}

线上使用Tags,但不严谨, 应该使用Meta最为严谨安全

{{range services}} 
	{{$name := .Name}} 
	{{$service := service .Name}} 
	{{$tags := .Tags}}
	
	upstream {{$name}} {
		zone upstream-{{$name}} 64k;
		{{range $service}}
			server {{.Address}}:{{.Port}}  max_fails=3 fail_timeout=60 weight=1;
		{{else}}
			server 127.0.0.1:65535;
		{{end}}
	} 
	server {
		listen 80;
		listen 443;
		charset utf-8;
		server_name {{range $tags }} {{.}} {{else}}localhost{{end}};	
		access_log  /var/log/nginx/{{$name}}.log;
		location / {
			proxy_pass http://{{$name}};
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			client_max_body_size    1000m;
			proxy_buffering off;
		}
	} 
{{end}}

注意这个ctmpl文件要与上面的Dockerfile放在同上目录下。


执行docker build -t="zhenheli/consul-template-nginx" -f Dockfile .来构建镜像


consul-template-nginx

version: '3'
services:
  consul-template:
    container_name: consul-template-nginx
    image: zhenheli/consul-template-nginx
    network_mode: bridge
    external_links:
      - consul_server:consul
    command: -consul-addr=consul:8500 -wait=5s -template="/etc/ctmpl/ctmpl:/etc/nginx/conf.d/app.conf:nginx -s reload"
    ports:
      - 80:80


最终由于spring-cloud-consul-client版本过低也无法提供nodeMeta, 退回到使用tags, 不过为了安全起见, 制定了一个规则,

以vcg_domain:开头的才看作是要获取的域名的tag,具体实现如下:


{{range services}} {{$name := .Name}} {{$service := service .Name}} {{$tags := .Tags}}
upstream {{$name}} {
zone upstream-{{$name}} 64k;
{{range $service}}server {{.Address}}:{{.Port}}  max_fails=3 fail_timeout=60 weight=1;
{{else}}server 127.0.0.1:65535;{{end}}
}
server {
        listen 80;
        listen 443;
        charset utf-8;
        access_log  /var/log/nginx/{{.Name}}.log;
        server_name {{range $tag := .Tags}} {{if $tag|contains "vcg_domain:"}} {{$tag|replaceAll "vcg_domain:" ""}}{{else}}localhost{{end}}{{else}}localhost{{end}};
        location / {
                proxy_pass http://{{.Name}};
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                client_max_body_size    1000m;
                proxy_buffering off;
        }
} {{end}}






未完。更新日期:2018年04年24日 13:12

----------------------------------------

原创作品,版权归zhenhe.li@vcg.com所有,转载请标记出处。

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值