使用python自动生成docker nginx反向代理配置

时间:2021-08-01 06:44:48

由于在测试环境上用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 反向代理配置&lpar;一&rpar;

    文章参考: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 反向代理配置&period;

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

  9. nginx反向代理配置

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

随机推荐

  1. day1学习

    python 2 和 3 的区别 1.用户输入的命令:python 2 中是raw_input(""):python 3 中是input(""). 2.默认字符 ...

  2. ios项目记录

    1,如何隐藏状态栏 在基类中重载UIViewController.h中的这个方法 - (BOOL)prefersStatusBarHidden { // iOS7后,[[UIApplication s ...

  3. Ubontu使用技巧

    1. ctrl + alt + T  =>  打开命令行窗口 2. sudo su => 开启root权限 3. cd  => 打开文件夹 4. cd "Program F ...

  4. echarts 修改y轴刻度间隔问题

    其中min.max可以自定义可以动态获取数据 yAxis : [ {                        type : 'value',                        axi ...

  5. 新加坡100M带宽&comma;国内延迟70ms&comma;仅800元

    ▇ 新加坡100M带宽,延迟80msE3_8G_1TB_100M_5IP_800元促:E3_32G_1TB SSD_1200元 ▇ 马来西亚,独享带宽,延迟70msL5630_16G_1TB_15M_ ...

  6. Windows安装zookeeper 单机版

    首先需要安装JdK,从Oracle的Java网站下载,安装很简单,就不再详述. 1.下载zookeeper, https://mirrors.tuna.tsinghua.edu.cn/apache/z ...

  7. Latex 公式居中

    这么简单的功能要是还要加工具包,LaTeX也不用混了~ 公式用\[...\]来写可以达到公式居中效果. 或者在equation环*加center环境: \begin{center} \begin{e ...

  8. python socket编程函数介绍

    网上看到一个socket中常用函数的介绍,记录一下 https://blog.csdn.net/rebelqsp/article/details/22109925

  9. mysql常见字符串处理函数

  10. JavaScript正则表达式练习

    校验邮政编码(由六位组成). var reg = /^\d{6}$/; var str = "130400"; var b = str.match(reg); if (b === ...