环境:python2.7   

docker:


一、一个简单的python程序

既然是一个简单的python程序,那我们就实现一个简单的加法功能即可。

#coding=utf-8
import random


def add(aStr,bStr):
    map={}
    try:
        a=float(aStr)
        b=float(bStr)
        sum=a+b
        file_name=str(int(random.random()*1000000))+""
        file=open("data/"+file_name+'.txt',"w")
        file.write(str(a)+"+"+str(b)+"="+str(sum))
        file.close()
        map["result"]="OK"
        map["id"]=str(file_name)
    except:
        map["result"]="wrong"




    return map


if __name__=="__main__":
    print "运行run啊大哥,不是这个"
    map=add("4.5",5.6)
    print map

这个方法实现的功能都能看明白,就是把a和b相加,并且将结果输出在一个文件中,并返回是否运行成功,如果成功则再加上文件的编号(后面那段不管= =)

二、对外提供一个调用接口

除了这段代码我们还需要对外提供一个调用接口,我使用tornado开一个web服务来提供接口,这个方法命名为run方法= =

#coding=utf-8

import tornado.web
import tornado.ioloop
from add  import add

#定义处理类
class Add(tornado.web.RequestHandler):
    #添加一个post请求方式的方法
    def post(self):
        #向响应中,添加数据
        a=self.get_argument('a', '')
        b=self.get_argument('b', '')
        map=add(a,b)
        self.write(map)

def make_app():
    return tornado.web.Application(
        [(r'/add', Add)],
    )

if __name__ == '__main__':
    # 创建一个应用对象
    app = make_app()
    #绑定一个监听端口
    app.listen(8888)
    #启动web程序,开始监听端口的连接
    tornado.ioloop.IOLoop.current().start()

当我们运行run.py之后,在终端输入命令    curl  -d 'a=3&b=9' 'localhost:8888/add'

终端返回信息为:{"result": "OK", "id": "808992"}   (这里的ID不一定会相同,只是一个随机数)

在到同文件下面的data目录即可找到对应的数据文件


到此,我们已经实现了一个python的简单程序,并使其对外提供了一个接口调用,现在我们要将其打包到docker镜像中并对关键代码(add)进行加密

三、运行一个ubuntu镜像,对安装好python,vim等以及必要的python包例如tornado(docker 的安装使用就不多说了= =)


显然我们需要的是第一个镜像,将其pull到本地,即运行docker pull ubuntu


查看本地镜像docker images 可以看到刚才的镜像


启动它!并安装一些必要的东西!

docker run -it c9d990395902 /bin/bash   其中c9d990395902为ubuntu的镜像ID,如果你pull的时候它已经更新过了ID可能产生变化,/bin/bash是使得进入新运行的容器内部

首先执行apt update更新ubuntu系统


然后使用apt install python安装python2

中途会问你有一步是否继续,输入y并回车即可

输入python能进入如下页面即安装成功,输入exit()回车退出编辑

使用apt-get install python-pip python-dev build-essential安装pip,注意同样需要y回车


安装完成后输入pip -V即可查看是否安装成功

安装vim,命令是apt-get install vim

导入一些python的包,比如tornado,使用命令pip install tornado


再比如cython,命令为pip install cython


至此,我们给这个容器安装完成了python,pip,vim以及导入了两个必要的包

四、新建文件夹并且把代码复制到容器中

在根目录运行mkdir add_uncleyiba,新建文件夹add_uncleyiba

进入add_uncleyiba文件夹,新建目录data,新建文件test.py


用vim打开test.py

随便按个键比如a,进入编辑模式,输入print 123,然后按Esc,输入:wq(前面是冒号),然后回车,即为保存

运行python test.py,测试一下没有问题


现在新建三个文件,分别叫add.py,run.py,setup.py


利用vim打开add.py把之前的代码复制进去,同理复制run.py的代码(注意,先进入编辑模式之后再复制)

复制并保存之后可以利用cat命令查看代码是否有问题

cat add.py


我们可以尝试在容器中运行add.py,使用命令python add.py


看上去也没有问题

现在vim打开setup.py文件,并输入以下内容

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize(["add.py"]))

然后保存退出

运行命令python setup.py build_ext,目的是为了生成add.py文件的so文件,保证源码安全

我们可以发现新生成了build文件夹


如图add.so即我们需要的so文件!

使用mv add.so ../../add.so将它放到外层的文件夹去


现在我们可以删除一些没有用的东西了,除了add.so,data,run.py,setup.py,其他的都可以删除了


友情提示:删除命令小心使用= =动图想必都看过了

图片好像动不起来- -可以去一些水群里面找图。。。

五、提交镜像,并运行测试

重新打开一个终端,然后将该容器制作成一个镜像docker commit 248224b7067e add_uncleyiba:1.0


id 是查看自己的容器id得到的,后面的是你要生成的镜像名字+冒号+版本号

之后我们查看本地镜像的时候就会发现成圣了add_uncleyiba:1.0这个镜像了

回到一个任意目录,当然,最好是你之前保存python代码的目录,新建文件夹名字叫data


然后运行命令

docker run -itd -p 8899:8888  -v #{local_abs_path}:/add_uncleyiba/data  add_uncleyiba:1.0 python /add_uncleyiba/run.py

其中#{local_abs_path}改成data文件夹的本地的绝对路径(cd进目录后使用pwd查看)

出现新的容器ID后使用curl  -d 'a=5&b=7' 'localhost:8888/add'进行访问测试就好了~


这时候我们可以进入到本地的data文件夹,会发现里面有一个文件名就是刚才返回的id值


打开即为我们刚才的测试内容


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐