搭建一个获取IP所在城市的容器web服务器

本文介绍如何使用Python和Tornado框架实现一个简单的IP地址地理位置定位服务,并将其容器化以便于部署和管理。服务能接收IP地址输入并返回该IP所在的城市和国家信息。

目的

搭建一个web服务,想这个传递一个IP地址,返回IP地址所在的国家城市。为了长久的使用,将服务做成容器,可以随意拉取、启动。

一、下载文件

网址
先注册账号,然后去邮箱的邮件中设置密码,然后登陆,就可以下载免费的数据了,
注意要下载mmdb数据。

二、编写python代码

这是个很简单的服务,我决定使用tornado来写,简单快捷

// 我起名叫  01.py

import json
import re
import tornado.ioloop
import tornado.web
import geoip2.database

path = r"GeoLite2-City.mmdb"


def huoqu(str2):
    if not re.match(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
                str2):
        return ["IP地址不合法"]

    reader = geoip2.database.Reader(path)
    if str2 == "127.0.0.1":
        return ["本地国家", "本地城市"]
    elif str2.split(".")[0] == "10":
        return ["本地国家", "本地城市"]
    elif str2.split(".")[0] == "192" and str2.split(".")[1] == "168":
        return ["本地国家", "本地城市"]
    else:
        response = reader.city(str2)
        country = response.country.names['zh-CN']
        if response.city.names:
            if "zh-CN" in response.city.names.keys():
                city = response.city.names['zh-CN']
            elif "en" in response.city.names.keys():
                city = response.city.names['en']
            else:
                city = "未知"
        else:
            city = "未知"
        return [country,city]


class BaseHandler(tornado.web.RequestHandler):
    #  允许跨域访问的地址
    def allowMyOrigin(self):
        allow_list = [
            'http://127.0.0.1:7100',
        ]
        if 'Origin' in self.request.headers:
            Origin = self.request.headers['Origin']
            # 域名
            re_ret = re.match(r".{1,}\.(xixi.com|haha.com)", Origin)
            # 内网和本地
            re_ret2 = re.match(r"^(192.168.1.*|127.0.0.1.*|192.168.2.*)", Origin)
            if re_ret or re_ret2 or Origin in allow_list:
                self.set_header("Access-Control-Allow-Origin", Origin)  # 这个地方可以写域名也可以是*
                self.set_header("Access-Control-Allow-Headers", "x-requested-with")
                self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')


class MainHandler(BaseHandler):
    def get(self):
        self.write("服务正在运行!!!")

    def post(self):

        remote_ip = self.request.remote_ip
        talk1 = self.get_argument('ip', None)
        if self.request.body:
            talk2 = json.loads(self.request.body.decode("utf8")).get("ip", None)
        else:
            talk2 = None
        if talk1:
            response = huoqu(talk1)
        elif talk2:
            response = huoqu(talk2)
        else:
            response = huoqu(remote_ip)
        self.write(json.dumps(response, ensure_ascii=False))


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    print("服务启动")
    app = make_app()
    app.listen(6002)
    tornado.ioloop.IOLoop.current().start()

代码部分就结束了。

三、云服务器上安装和配置docker

四、通过dockerfile构建镜像

在 /home/linshi文件夹下面创建文件getpositionfile,文件没有后缀,只有名字

// 路径  /home/linshi/getpositionfile

FROM python
RUN pip install tornado
RUN pip install geoip2
COPY 01.py  GeoLite2-City.mmdb  /home/fuwu/
ENV TZ=Asia/Shanghai
RUN echo '镜像构建完成'

ENV TZ=Asia/Shanghai这句话的意思是配置时间为上海时间,没什么用,我习惯这么配置
注意将代码文件和数据库文件复制到getpositionfile同级目录
然后在/home/linshi执行构建镜像的,命令

docker build -f getpositionfile -t getposition .
# 注意最后有个点,别漏掉

五、根据镜像启动容器

docker run -itd --name getposition -p 6002:6002 --restart=always   getposition sh -c "python /home/fuwu/01.py" 

六、测试

访问那台机器的6002端口,如果有返回,就没错了

七、将容器封装为镜像

# 将getposition 容器封装为镜像,名字自己起
docker commit getposition   ****
# 查看所有镜像里面有没有刚封装好的
docker images
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值