由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建、停止的时候,自动生成nginx反向代理,然后reload nginx

我的原则是尽量简单,轻量,内存占用少

目标很明确,只要能监听到docker的容器启动/停止事件,即可

网上查了一下可以用docker events来监听docker事件,试了一下,发现基本可以满足,于是用python写了一段程序,用来监听docker事件

python

  1. #!/usr/bin/python
  2. # coding: utf8
  3. import os
  4. import json
  5. import re
  6. import subprocess
  7. def override(path, text):
  8. if not os.path.exists(path) and os.path.exists(path+"_temp"):
  9. os.rename(path+"_temp",path)
  10. fw = open(path+"_temp", 'wb')
  11. fw.write(text)
  12. fw.close()
  13. if os.path.exists(path):
  14. os.remove(path)
  15. os.rename(path+"_temp", path)
  16. def read(path):
  17. try:
  18. fr = open(path, "rb")
  19. except IOError:
  20. print "The file don't exist, Please double check!"
  21. return
  22. lines = fr.readlines()
  23. ret = ''
  24. for line in lines:
  25. ret += line
  26. return ret
  27. def read_jsonfile(path):
  28. return json.loads(read(path))
  29. def cmd(command):
  30. return os.popen(command).read()
  31. def get_name(container):
  32. return cmd("docker inspect -f '{{.Name}}' " + container).replace("/", "").replace('\n', '')
  33. def get_ip(container):
  34. return cmd("docker inspect -f '{{.NetworkSettings.IPAddress}}' " + container).replace('\n', '')
  35. def get_port(container):
  36. return cmd("docker inspect -f '{{.Config.ExposedPorts}}' " + container).replace('/tcp:{}]', '').replace('map[', '').replace('\n', '')
  37. def get_info(container):
  38. filename = "/var/lib/docker/containers/" + container + "/config.v2.json"
  39. config = read_jsonfile(filename)
  40. name = config['Name'].replace("/", "")
  41. port = config['Config']['ExposedPorts'].keys()[0].replace('/tcp', '')
  42. ip = cmd("docker inspect -f '{{.NetworkSettings.IPAddress}}' " + name)
  43. # ip = config['NetworkSettings']['Networks']['bridge']['IPAddress']
  44. ret = {'name': name, 'port': port, 'ip': ip}
  45. return ret
  46. tpl = """
  47. server {
  48. listen 80;
  49. server_name $name.test.com;
  50. location / {
  51. proxy_set_header X-Real-IP $remote_addr;
  52. proxy_set_header Host $http_host;
  53. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  54. proxy_pass http://$ip:$port;
  55. }
  56. }
  57. """
  58. def generate_conf():
  59. print "generate_conf"
  60. out = cmd("docker ps | grep -v CONTAINER | awk '{print $1}'")
  61. containers = out.split("\n")
  62. servers = ''
  63. hosts = ''
  64. for con in containers:
  65. if con != '':
  66. name = get_name(con)
  67. ip = get_ip(con)
  68. port = get_port(con)
  69. print ip, port
  70. if len(port) >= 2:
  71. servers += tpl.replace("$name", name).replace("$ip", ip).replace("$port", port)
  72. hosts += "11.12.13.14 " + name + ".test.com\n"
  73. override('/usr/local/openresty/nginx/conf/vhost.conf', servers)
  74. override('/usr/local/openresty/nginx/html/vhost.html', "<pre>" + hosts + "</pre>")
  75. def reload_nginx():
  76. print "reload nginx"
  77. cmd('nginx -s reload')
  78. def auto_reload():
  79. generate_conf()
  80. reload_nginx()
  81. print " ==================== docker events ==================== "
  82. # auto_reload()
  83. proc = subprocess.Popen(["docker", "events"],
  84. # shell=True, # windows: true, linux: false
  85. stdout=subprocess.PIPE)
  86. while 1:
  87. out = proc.stdout.readline()
  88. event = re.sub('\(|\)', "", out).split(" ")
  89. if out.find('container stop') != -1:
  90. auto_reload()
  91. print ' container stop '
  92. elif out.find('container start') != -1:
  93. auto_reload()
  94. print ' start container '
  95. if out == '':
  96. print "out "
  97. break

启动命令:

  1. nohup ./docker.py > /dev/null 2>&1 &

程序会在后台运行,断开ssh也不会结束

主要就是生成一个 conf 文件,这个文件要在nginx.conf里面引入,然后每次有容器启动/停止都生成这个文件,然后重启nginx,我这了还把容器名加上一个域名,组合成了一个子域名,然后把对应的映射关系生成了一个html文件,通过浏览器可以访问这个文件,然后把对应的代码 复制到本机的 hosts 文件里面,可以实现通过域名访问应用,当然只是开发测试的时候会这么做,但是也足够了。

使用python自动生成docker nginx反向代理配置的更多相关文章

  1. nginx反向代理配置及优化

    nginx反向代理配置及优化前言: 由于服务器apache抗不住目前的并发.加上前端squid配置后,问题依然无法解决.而页面程序大部分是动态.无法使用fastcgi来处理.因此想使用nginx做为反 ...

  2. nginx反向代理配置实例分享

    nginx反向代理配置一例. 配置内容如下: user www www; worker_processes 8; error_log /usr/local/webserver/nginx/logs/n ...

  3. nginx 反向代理配置(一)

    文章参考:https://blog.csdn.net/physicsdandan/article/details/45667357       什么是代理?       代理在普通生活中的意义就是本来 ...

  4. 前端跨域实现的几种方式?及使用Nginx反向代理配置。

    早期为了防止CSRF(跨域请求伪造)的攻击,浏览器引入了同源策略(SOP)来提高安全性.而所谓"同源策略",即同域名(domain或ip).同端口.同协议的才能互相获取资源,而不能 ...

  5. Nginx反向代理配置教程(php-fpm)

    1.安装nginx http://www.cnblogs.com/lsdb/p/6543441.html 2.安装php-fpm yum install -y php-fpm 3.配置Nginx反向代 ...

  6. Nginx反向代理配置可跨域

    由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...

  7. Nginx反向代理配置配置实例

    为了节省支出,公司需要将分布在不同机器的站点都迁移到一台机器,而目前不同机器运行的是不同的web服务,部分是nginx,部分是apache,由于牵涉较多rewrite规则,为了节省修改功夫,打算迁移后 ...

  8. Linux 下的 Nginx 反向代理配置.

    最近实践中遇到了需要利用 nginx 进行反向代理服务器请求的需求,以前没怎么碰触过,因此花了1个多小时,快速阅览了一下nginx官网在反向代理服务中给出的基本定义: 说实话,官网给予的定义是精准的, ...

  9. nginx反向代理配置

    最近在项目中使用nginx反向代理,根据不同的请求路径,将请求分发到不同服务.下面的示例主要完成如下功能 /prod/路径的请求分发到prod服务 /test/路径的请求分发到test服务 创建文件夹 ...

随机推荐

  1. NodeJs之child_process

    一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...

  2. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  3. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  4. SASS教程sass超详细教程

    SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...

  5. 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入

    说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) 中,介绍过采集用的工具,其实很Low的,分析 ...

  6. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  7. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  8. 【Linux大系】Linux的概念与体系

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...

  9. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...

  10. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...