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

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

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

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

python

#!/usr/bin/python
# coding: utf8
import os
import json
import re
import subprocess def override(path, text):
if not os.path.exists(path) and os.path.exists(path+"_temp"):
os.rename(path+"_temp",path)
fw = open(path+"_temp", 'wb')
fw.write(text)
fw.close()
if os.path.exists(path):
os.remove(path)
os.rename(path+"_temp", path) def read(path):
try:
fr = open(path, "rb")
except IOError:
print "The file don't exist, Please double check!"
return
lines = fr.readlines()
ret = ''
for line in lines:
ret += line
return ret def read_jsonfile(path):
return json.loads(read(path)) def cmd(command):
return os.popen(command).read() def get_name(container):
return cmd("docker inspect -f '{{.Name}}' " + container).replace("/", "").replace('\n', '') def get_ip(container):
return cmd("docker inspect -f '{{.NetworkSettings.IPAddress}}' " + container).replace('\n', '') def get_port(container):
return cmd("docker inspect -f '{{.Config.ExposedPorts}}' " + container).replace('/tcp:{}]', '').replace('map[', '').replace('\n', '') def get_info(container):
filename = "/var/lib/docker/containers/" + container + "/config.v2.json"
config = read_jsonfile(filename) name = config['Name'].replace("/", "")
port = config['Config']['ExposedPorts'].keys()[0].replace('/tcp', '')
ip = cmd("docker inspect -f '{{.NetworkSettings.IPAddress}}' " + name)
# ip = config['NetworkSettings']['Networks']['bridge']['IPAddress'] ret = {'name': name, 'port': port, 'ip': ip}
return ret tpl = """
server {
listen 80;
server_name $name.test.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://$ip:$port;
}
}
""" def generate_conf():
print "generate_conf"
out = cmd("docker ps | grep -v CONTAINER | awk '{print $1}'")
containers = out.split("\n")
servers = ''
hosts = ''
for con in containers:
if con != '':
name = get_name(con)
ip = get_ip(con)
port = get_port(con)
print ip, port
if len(port) >= 2:
servers += tpl.replace("$name", name).replace("$ip", ip).replace("$port", port)
hosts += "11.12.13.14 " + name + ".test.com\n"
override('/usr/local/openresty/nginx/conf/vhost.conf', servers)
override('/usr/local/openresty/nginx/html/vhost.html', "<pre>" + hosts + "</pre>") def reload_nginx():
print "reload nginx"
cmd('nginx -s reload') def auto_reload():
generate_conf()
reload_nginx() print " ==================== docker events ==================== " # auto_reload() proc = subprocess.Popen(["docker", "events"],
# shell=True, # windows: true, linux: false
stdout=subprocess.PIPE) while 1:
out = proc.stdout.readline()
event = re.sub('\(|\)', "", out).split(" ")
if out.find('container stop') != -1:
auto_reload()
print ' container stop '
elif out.find('container start') != -1:
auto_reload()
print ' start container '
if out == '':
print "out "
break

启动命令:

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. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  2. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

  3. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  4. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

  5. C# 生成验证码图片时消除锯齿

    引言 基于生成图片实现了一个手机号转图片的需求. 内容也很简单,直接用手机号生成一个png图片.就是为了背景透明以便其他地方调用. 有无锯齿主要依靠一句代码:g.TextRenderingHint= ...

  6. Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误——SHH框架

    SHH框架工程,Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误 1.查看配置文件web.xml中是否配置.or ...

  7. 如何使用swing创建一个BeatBox

    首先,我们需要回顾一些内容(2017-01-04 14:32:14): 1.Swing组件 Swing的组件(component,或者称之为元件),是较widget更为正确的术语,它们就是会放在GUI ...

  8. 说一说python的牛比与不爽

    本人写了10年php了.今年开始改写python了.不是说php有什么不好,php在自己的势力范围内还是很牛比的.只是我已经不能满足于php那两亩地了. 习惯了脚本,所以很自然就过度到python了. ...

  9. 关于DDD的学习资料汇总

    DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...

  10. BPM SharePoint解决方案分享

    一.需求分析 SharePoint作为微软推出的协同类平台产品,为客户提供了门户.内容.文档.流程.社区.搜索.BI等一系列的解决方案,然而其流程功能由于设计理念差异,不能完全满足客户的需求,主要原因 ...