由于在测试环境上用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. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  2. windows环境下sublime的nodejs插件详细安装图解

    前面的话   搜索了好多文档后,才成功地安装了sublime text3的nodejs插件.为了存档,也为了方便有同样需求的朋友,将其安装过程详细记录如下 安装nodejs 虽然nodejs官网提供了 ...

  3. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  4. 代码的坏味道(16)——纯稚的数据类(Data Class)

    坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...

  5. ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知

    一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...

  6. redis成长之路——(二)

    redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...

  7. WPF CheckBox 样式

    <Style x:Key="FocusVisual"> <Setter Property="Control.Template"> < ...

  8. 解决“chrome提示adobe flash player 已经过期”的小问题

    这个小问题也确实困扰我许久,后来看到chrome吧里面有人给出了解决方案: 安装install_flash_player_ppapi, 该软件下载地址:http://labs.adobe.com/do ...

  9. 初识的Spring Mvc-----原理

    一.Spring Mvc简介 Spring Mvc(Spring Web Mvc) 属于表现层的框架. 二.Spring结构图 Spring Mvc是Spring框架里面web模块的一部分,是在Spr ...

  10. 使用HTML5的cavas实现的一个画板

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...