由于在测试环境上用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. Ngrok让你的本地Web应用暴露在公网上

    1.Ngrok介绍 Ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道.Ngrok可捕获和分析所有通道上的流量,便于后期分析和重放.简单来说,利用 Ngrok可以 ...

  2. 谈一谈NOSQL的应用,Redis/Mongo

    1.心路历程 上年11月份来公司了,和另外一个同事一起,做了公司一个移动项目的微信公众号,然后为了推广微信公众号,策划那边需要我们做一些活动,包括抽奖,投票.最开始是没有用过redis的,公司因为考虑 ...

  3. 菜鸟Python学习笔记第二天:关于Python黑客。

    2016年1月5日 星期四 天气:还好 一直不知道自己为什么要去学Python,其实Python能做到的Java都可以做到,Python有的有点Java也有,而且Java还是必修课,可是就是不愿意去学 ...

  4. bzoj1079--记忆化搜索

    题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...

  5. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  6. Flexible 弹性盒子模型之CSS flex-shrink 属性

    实例 让第二个元素收缩到其他元素的三分之一: 效果预览 div:nth-of-type(2){flex-shrink:3;} 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. 紧跟在 - ...

  7. Linux根文件系统分析之init和busybox

    Hi,大家好!我是CrazyCatJack.今天给大家讲解Linux根文件系统的init进程和busybox的配置及编译. 先简单介绍一下,作为一个嵌入式系统,要想在硬件上正常使用的话.它的软件组成大 ...

  8. 修改MySQL默认字符集编码

    好记心不如烂笔头,很多东西当时没记下来,过了就忘了,下次用到时又得浪费好多时间才能解决.今天又遇到修改MySQL默认字符集编码的问题,折腾了半天解决了,赶快记录下来,以后就不用每次折腾了. 查看MyS ...

  9. Bluemix中国版体验(二)

    从上一篇到现在大概有一个多月了.时隔一个月再登录中国版Bluemix,发现界面竟然更新了,现在的风格和国际版已经基本保持一致!这次我们来体验一下Mobile Service.不过mobile serv ...

  10. Markdown学习笔记

    分为两步: 1.阅读Markdown中文官网的文档 2.下载MarkdownPad2将中文官网中文档的例子敲一遍,其中Markdownpad2为官网中推荐的编辑器 备注: 如果只看中文官网文档,不边看 ...