#### 由于在测试环境上用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 文件里面,可以实现通过域名访问应用,当然只是开发测试的时候会这么做,但是也足够了。
分享到:
相关推荐
而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建、停止的时候,自动生成nginx反向代理,然后reload nginx 我的原则是尽量简单...
`nginx`作为高性能的反向代理服务器,可以将外部请求分发到不同的容器中,而`dockergen`则用于自动化这个过程,根据Docker容器的变化动态更新`nginx`的配置。 首先,让我们理解`nginx`的作用。`nginx`是一个强大的...
docker-gen为nginx生成反向代理配置,并在容器启动和停止时重新加载nginx。 请参阅了解为什么要使用它。用法要运行它: $ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-...
创建 `nginx/conf.d/default.conf` 文件,定义监听端口和反向代理到 Node.js 应用: ```nginx upstream web { server myweb:3000; } server { listen 80; listen [::]:80; server_name filterinto....
- Nginx是一款高性能的HTTP和反向代理服务器,而Nginx-Lua模块允许在Nginx中运行Lua脚本,实现动态处理请求。 - 安装Nginx:`sudo yum install epel-release`,`sudo yum install nginx`。 - 安装OpenResty(包含...
该存储库包含一个由docker-compose编排应用程序,其中Flask和Vue服务在nginx反向代理后面运行。 警告 此应用程序及其服务尚未准备好投入生产,并且没有为部署进行适当配置。 它仅用作配置nginx并使用docker-compose...
日志轮换- logrotate文件轮换容器 JSON 日志文件反向代理配置- nginx、haproxy等反向代理配置,用于将请求从主机路由到容器服务发现-脚本(python,bash等)用于在etcd,hipache等中注册容器。安装运行docker-gen有...
带有NginX + Auth-Request模块代理到Shiny应用程序的Auth-acting Django服务器的Docker示例这是通过反向代理和模块为充当应用程序的身份验证和授权服务器的应用程序的设置。 我们使用作为反向代理。 我们使用模块为...
Nginx是用于HTTP,HTTPS,SMTP,POP3和IMAP协议的开源反向代理服务器,以及负载平衡器,HTTP缓存和Web服务器(原始服务器)。Nginx项目一开始就非常关注高并发,高性能和低内存使用。它获得了两节式BSD许可,并在...
使用Nginx作为反向代理和负载均衡,Gunicorn作为WSGI服务器,能有效提高服务的稳定性和性能。 总结来说,这个项目将涉及Python3作为主要编程语言,Django作为后端框架,Vue.js作为前端框架,通过RESTful API实现...
这个Django Boilerplate快速将您的源代码封装在Nginx反向代理后面运行Gunicorn的Docker容器中。 该项目使用Fabric3来处理大多数部署和管理任务。 先决条件 pip-您可以使用安装pip brew install pip 我建议您使用来...
NGINX用作反向代理服务器。前提我已经看到太多带有不可读代码的Dockerfile。 那里的许多代码都非常详细地设置了Docker,以至于无法修改。 在这里,我尝试尽可能简化Dockerfile和Docker Compose文件,以便团队中的多...
《精通Nginx(第二版)》还会探讨如何使用Nginx进行微服务架构的构建,以及如何与Docker、Kubernetes等容器化技术集成。对于高可用性和高并发场景,Nginx的Upstream模块可以帮助创建负载均衡策略,例如轮询、权重...
配置为使用 PostgreSQL 数据库和 Nginx 反向代理。 教程 目的 使用以下命令在 Docker 上安装 Sentry: 一个 PostgreSQL 容器, Sentry 应用程序容器 一个 Nginx 反向代理容器, PostgreSQL 数据的卷容器。 整个...
9. **自动化部署**:介绍服务器运维知识,如Linux基础操作、Nginx反向代理、Gunicorn或uWSGI服务器配置、Docker容器化技术等,让学员掌握Web应用的部署和维护。 10. **持续集成/持续部署(CI/CD)**:学习使用Jenkins...
Nginx 负载均衡(反向代理)配置 Nginx 证书支持 系统状态监测 自动维护防火墙规则(白名单) 支持 TCP 被动后端节点宕机检测 支持 HTTP 主动后端节点宕机检测 运行 ...
在本项目中,Nginx作为反向代理,可以接收来自互联网的请求,将它们转发给Django应用,同时处理静态文件(如CSS、JavaScript等),提高网站性能。 6. **Docker容器化部署**: Docker是一种流行的容器化技术,它...
目录 自动PEP8 图函数依赖烧瓶使用MongoDB的烧瓶REST API烧瓶Flask Redis PubSub 带REST API的Flask Mysql 带有REST API的Flask Postgres Flask Elasticsearch 独角兽烧瓶Logstash 带有Nginx反向代理的MLFlow带Redis...
常见的部署方式有使用Gunicorn或uWSGI作为应用服务器,Nginx作为反向代理。此外,Flask也支持Heroku、Docker等云平台部署。 **8. 请求处理与响应** Flask处理HTTP请求,包括GET、POST等。你可以通过`request`对象...
7. **部署与运维**:涵盖服务器配置、Docker容器化技术、Nginx反向代理和Gunicorn应用服务器的使用,让读者学会如何将项目部署到生产环境。 8. **测试与调试**:介绍单元测试、集成测试和持续集成/持续部署(CI/CD...