將一個簡單的python程式打包成加密的docker映象並對外提供介面
環境: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值
開啟即為我們剛才的測試內容