使用docker部署Python实现IP地址查询实践

        本文为在实际工作中需要使用IP来源查询而整理的小工具。已正常运行使用1个月以上。文章假设当前面对的是一台刚安装好Linux系统全新服务器【虚拟机或真实的服务器均可】,从部署环境开始分享全部实践过程。

一、实践环境:

Linux centOS服务器;

Docker:Docker version 20.10.23, build 7155243

Python10:3.10

二、实现方式:

        因大多数在线查询网站有数量等限制或API收费,因此经过实践最终采用方式是使用“纯真”离线IP库方式实现,该库每周更新1次,可以在实现了代码后,只更新IP库文件qqwry.dat即可。本实践中已集成当前最新版本的库,最新版本的库可纯真官网www.cz88.net获取。

注:根据实践此离线方式已能满足绝大多数情况下使用。如果对实时精度要求高则请忽略【有IP无对应供应商,可能会显示供应商为CZ88.NET的情况。】

三、使用Python实现IP查询

        Python中使用纯真IP离线库,需要安装库qqwry(Python3中安装qqwry-py3):

pip install qqwry-py3

 3.1、实现IP简单查询的demo:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import io
from qqwry import QQwry
from qqwry import updateQQwry
#离线库,在本Python的相同目录下
IPDB_FILE = "qqwry.dat"

def test(ip):
    q = QQwry()
    q.load_file(IPDB_FILE)
    res = q.lookup(ip.strip())
    #print(type(res))
    print("IP:{:17}==>  归属地:{},  运营商:{}".format(ip,res[0],res[1]))

if __name__ == "__main__":
    test("127.0.0.1")
    test("117.67.111.197")

测试结果:

 3.2、在Linux服务器实现读取文档后批量查询:

        在服务器中,查询IP的执行文件所在目录结构:

 批量待查IP清单为txt文件格式,每行一个IP:

批量待查IP结果为txt文件格式:

 实现代码:

程序从同目录下的temp文件夹下,读取“当天日期_IP.txt”的文件(例如20230104_IP.txt),进行批量查询,查询后的结果保存到ipsource文件夹下当天日期的txt文档,例如:IPsource_20230104.txt

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import io
from qqwry import QQwry
from qqwry import updateQQwry

##--注意实际环境和测试环境可能不同
## ---生产环境配置----
PYTHON_HOME = "/home/python_home/"
IPDB_FILE = PYTHON_HOME + "qqwry.dat"
## ---本地测试环境----
##IPDB_FILE = "qqwry.dat"
##PYTHON_HOME = "./"


def getIPsource(IPlist):
    q = QQwry()
    q.load_file(IPDB_FILE)
    
    time_start = time.time()   # 开始工作时间

    IPsources = []
    for ip in IPlist:
        ip = ip.strip()
        print("当前查询的IP是:{}".format(ip))
        try:
            res = q.lookup(ip)
            tempInfo = "IP:{:17}==>归属地:{},  运营商:{}".format(ip,res[0],res[1])
        except:
            tempInfo = "IP:{:17}==>归属地:{},  运营商:{}".format(ip,"错误IP","错误IP")
        print(tempInfo)
        IPsources.append(tempInfo)

    time_end = time.time()   # 查询完成的时间
    print("查询的IP数:{},查询耗时(s):{}".format(len(IPsources),(time_end - time_start)) )   

    return IPsources

def saveIPsource(IPsources, filename=""):
## 将IP源信息保存到同目录下的ipsource/文件夹,文件名以当天日期为名字
    if filename=="":
        filename = PYTHON_HOME + "ipsource/IPsource_" + time.strftime("%Y%m%d", time.localtime())+".txt"
    
    with io.open(filename, 'w', encoding='utf8') as f:
        for line in IPsources:
            f.write(line + "\n")
        f.close()
    print("Save IPsources successed!")
    

if __name__ == "__main__":
    today = time.strftime("%Y%m%d", time.localtime())
    iplistfile = PYTHON_HOME + "temp/"+today + "_IP.txt"
    with open(iplistfile, "r") as f:
        IPlist = f.readlines()
    
    IPsources = getIPsource(IPlist)
    ipsourcefile = PYTHON_HOME + "ipsource/IPsource_"+today+".txt"
    saveIPsource(IPsources, ipsourcefile)

四、Linux中部署实现

 4.1、docker环境安装

  4.1.1、安装社区版本的docker:

yum install docker-ce docker-ce-cli containerd.io

        安装成功后,可以使用版本查询命令:docker version 确认是否成功,出现类似下图信息则安装成功:

4.1.2、启动docker 

systemctl start docker

4.2、在docker中安装、运行Python容

       docker环境安装成功后,进行Python环境安装。

        因为本实践操作需要使用一些库,因此将当前已安装相关库的Python镜像导出供实践中直接导入使用。本实践Python镜像下载地址:

链接:https://pan.baidu.com/s/1obscDSCg-B-QAe9GaB5cNQ?pwd=4wwh 
提取码:4wwh

4.2.1、将Python镜像上传到服务器

        在Linux服务器根目录下创建tools文件夹,将已下载的Python镜像上传到此文件夹。

4.2.2、导入镜像

        使用指令:

docker load -i /tools/python310.tar

4.2.3、从镜像创建Python容器

        查看当前已有镜像: docker images

         创建并以后台守护模式启动一个名字为Python的容器:

        为该Python容器在本地的/opt目录创建文件夹dkhome_python,作为docker容器在服务器上的映射点,对应容器内的位置为" /home/python_home.

【只需要按要求创建文件夹,执行指令即可】

docker run -itd --name python  -v /opt/dkhome_python:/home/python_home python:3.10

        查看当前启动的docker容器: docker ps

        当前已可以看见启动了的容器,ID号为:4b41aea77bbc

 4.3、使用Python容器查询IP

        首先将脚本及依赖库文件:getIPsource.py、qqwry.dat,上传到容器映射在本地服务器的位置:/opt/dkhome_python,在temp文件夹下放置待查的IP清单文件。

4.3.1、脚本执行方式:

       在服务器根目录,创建rxshell文件夹,创建脚本:getIPsource.sh:

#!/bin/bash  
# 执行Python脚本,查询IP源信息。

# 日志文件
logfile="/rxshell/getIP.log"

echo $(date +"%Y-%m-%d %H:%M:%S")":执行getIPsource.sh --> 准备获取IP源脚本..." >> $logfile
docker restart python && docker exec python python /home/python_home/getIPsource.py
echo $(date +"%Y-%m-%d %H:%M:%S")":执行getIPsource.sh --> 获取IP源脚本成功!" >> $logfile

        为getIPsource.sh增加执行权限:

sudo chmod +x /rxshell/getIPsource.sh

        进入到rxshell目录: cd /rxshell 

        执行脚本: ./getIPsource.sh

        即可在/opt/dkhome_python/source文件夹下得到查询结果文件。

4.3.2、容器交互模式执行方式:

        进入/opt/dkhome_python文件夹: cd /opt/dkhome_python/

        进入名字为Python的容器:

docker exec -it python /bin/bash

显示结果:

在交互页面中,进入Python容器的挂载点(4.2.3中执行指令时,指定的容器内的挂载点),

cd /home/python_home,

执行Python脚本:  python getIPsource.py

执行结果如下:

完成后,退出容器交互式对话模式,使用exit 命令即可:

成功退出后,系统自动返回到进入容器前的目录点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值