新聞中心
新手程序員面臨的困難的問(wèn)題之一是理解“環(huán)境”的概念。環(huán)境就是你編寫(xiě)代碼的系統(tǒng),聽(tīng)起來(lái)很容易,但很快你就會(huì)明白維護(hù)系統(tǒng)有多困難。

創(chuàng)新互聯(lián)公司一直通過(guò)網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷(xiāo)幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、移動(dòng)互聯(lián)產(chǎn)品、全網(wǎng)整合營(yíng)銷(xiāo)推廣服務(wù)為核心業(yè)務(wù)。10余年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開(kāi)發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。
很大原因是庫(kù)和 IDE,甚至 Python 代碼本身都會(huì)經(jīng)歷更新和版本更改,有時(shí)候,我們對(duì)一個(gè)庫(kù)進(jìn)行更新,就會(huì)導(dǎo)致另一段代碼報(bào)錯(cuò)。正因如此,我們經(jīng)常需要修復(fù)各種來(lái)源不明的 BUG。
此外,如果我們同時(shí)開(kāi)發(fā)多個(gè)項(xiàng)目,可能會(huì)出現(xiàn)依賴(lài)性沖突。如果一段代碼因?yàn)榱硪欢未a而出現(xiàn) BUG 時(shí),情況會(huì)更糟糕。
另外,如果你想將一個(gè)項(xiàng)目共享給一個(gè)在不同操作系統(tǒng)上工作的團(tuán)隊(duì)成員,或者將你在 Mac 上構(gòu)建的項(xiàng)目發(fā)送到另一個(gè)操作系統(tǒng)上的服務(wù)器,你是否需要重新配置代碼?很明顯是一定需要的。
因此,為了減少這些問(wèn)題的出現(xiàn),人們提出使用容器來(lái)分離項(xiàng)目和它們所在的環(huán)境。容器基本上是一個(gè)環(huán)境可以運(yùn)行的地方,與系統(tǒng)中的所有其他東西分開(kāi)。一旦定義了容器中的內(nèi)容,就可以輕松地重新創(chuàng)建環(huán)境,甚至與同事共享項(xiàng)目。
要求
首先,我們需要安裝一些設(shè)置:
Windows或macOS:安裝Docker Desktop(https://www.docker.com/get-started)
Linux:先安裝Docker,再安裝 Docker Compose(https://docs.docker.com/compose/install/)
對(duì)Python服務(wù)進(jìn)行容器化
假設(shè)我們正在創(chuàng)建一個(gè)名為 server.py 的 Flask 服務(wù),并假設(shè)文件內(nèi)容如下:
- from flask import Flask
- server = Flask(__name__)
- @server.route("/")
- def hello():
- return "Hello World!"
- if __name__ == "__main__":
- server.run(host='0.0.0.0')
如上所述,我們需要記錄代碼的依賴(lài)關(guān)系,因此,我們可以創(chuàng)建一個(gè) requirements.txt 文件,其中可以包含以下要求:
- Flask==1.1.1
因此,我們的軟件包需要具有以下結(jié)構(gòu):
- app
- ├─── requirements.txt
- └─── src
- └─── server.py
該結(jié)構(gòu)非常合理(源代碼保存在單獨(dú)的目錄中)。要執(zhí)行我們的 Python 程序,只需安裝一個(gè)Python 解釋器并運(yùn)行即可。
我們可以在本地運(yùn)行該程序,但是假設(shè)我們正在處理 15 個(gè)項(xiàng)目:在容器中運(yùn)行是有意義的,這樣可以避免與其他項(xiàng)目發(fā)生沖突。
讓我們進(jìn)入容器化。
Dockerfile
要運(yùn)行 Python 代碼,我們將容器打包為 Docker 映像,然后基于它運(yùn)行一個(gè)容器。如下所示:
- 創(chuàng)建一個(gè) Dockerfile,其中包含構(gòu)建圖像所需的說(shuō)明;
- 然后由 Docker builder 創(chuàng)建映像;
- 簡(jiǎn)單的 docker run image 命令然后創(chuàng)建一個(gè)運(yùn)行應(yīng)用程序的容器。
分析 Dockerfile
Dockerfile 是一個(gè)文件,其中包含有關(guān)組裝 Docker 映像(保存為 myimage )的說(shuō)明:
- # 設(shè)置基本映像(主機(jī)操作系統(tǒng))
- FROM python:3.8
- # 在容器中設(shè)置工作目錄
- WORKDIR /code
- # 將依賴(lài)項(xiàng)文件復(fù)制到工作目錄中
- COPY requirements.txt .
- # 安裝依賴(lài)項(xiàng)
- RUN pip install -r requirements.txt
- # 將本地src目錄的內(nèi)容復(fù)制到工作目錄
- COPY src/ .
- # 在容器啟動(dòng)時(shí)運(yùn)行的命令
- CMD [ "python", "./server.py" ]
Dockerfile 是逐行編譯的,因此構(gòu)建器會(huì)生成圖像層并將其堆疊在先前的圖像上。
我們還可以在 build 命令的輸出中觀察到作為步驟執(zhí)行的 Dockerfile 指令。
- $ docker build -t myimage .
- Sending build context to Docker daemon 6.144kB
- Step 1/6 : FROM python:3.8
- 3.8.3-alpine: Pulling from library/python
- …
- Status: Downloaded newer image for python:3.8.3-alpine
- ---> 8ecf5a48c789
- Step 2/6 : WORKDIR /code
- ---> Running in 9313cd5d834d
- Removing intermediate container 9313cd5d834d
- ---> c852f099c2f9
- Step 3/6 : COPY requirements.txt .
- ---> 2c375052ccd6
- Step 4/6 : RUN pip install -r requirements.txt
- ---> Running in 3ee13f767d05
- …
- Removing intermediate container 3ee13f767d05
- ---> 8dd7f46dddf0
- Step 5/6 : COPY ./src .
- ---> 6ab2d97e4aa1
- Step 6/6 : CMD python server.py
- ---> Running in fbbbb21349be
- Removing intermediate container fbbbb21349be
- ---> 27084556702b
- Successfully built 70a92e92f3b5
- Successfully tagged myimage:latest
然后,我們可以看到映像位于本地映像存儲(chǔ)目錄中:
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- myimage latest 70a92e92f3b5 8 seconds ago 991MB
在開(kāi)發(fā)過(guò)程中,我們希望花費(fèi)盡可能少的時(shí)間,為 Python 服務(wù)重建映像。
注意:Docker 和 virtualenv 非常相似但又有所不同。Virtualenv 只允許我們?cè)?Python 的依賴(lài)關(guān)系之間切換,無(wú)法使用主機(jī)操作系統(tǒng)。但是,使用Docker,你可以在任何操作系統(tǒng)上交換整個(gè)操作系統(tǒng):安裝并運(yùn)行Python(例如 UBTUN,Debian,Alpine,甚至Windows Server Core)。因此,如果你的團(tuán)隊(duì)工作需要驗(yàn)證你的技術(shù),請(qǐng)使用Docker。如果不需要,可以使用 venv。
總結(jié)
在上文中,我們展示了如何把 Python 服務(wù)容器化。 希望此過(guò)程將變得更容易,并且能夠?yàn)槟愕捻?xiàng)目提供更長(zhǎng)的保質(zhì)期。同時(shí),因?yàn)橐蕾?lài)關(guān)系的變化,也能降低你的代碼錯(cuò)誤的可能性。
文章標(biāo)題:都2020年了,居然還有人沒(méi)有在數(shù)據(jù)科學(xué)項(xiàng)目中使用Docker?
分享地址:http://m.fisionsoft.com.cn/article/ccocdoe.html


咨詢
建站咨詢
