本文轉載自公衆號「讀芯術」(ID:AI_Discovery)。python
小白程序員面臨的最大困難之一就是理解環境的概念。環境是指程序員進行編碼的系統,這聽起來貌似很容易,但隨着程序員職業生涯的推薦,程序員會逐漸體會到維護「環境」是一件多麼困難的事情。linux
這主要是由於庫、IDE(集成開發環境),甚至Python代碼都須要通過更新和版本升級。有時更新一個庫,某段代碼就會出錯,須要從新修改代碼。若是同時開發多個項目,就會引發依賴衝突,當某段代碼致使另外一段代碼錯誤時,事情就會變得很棘手了。程序員
另外,若是想將項目共享給一個在不一樣操做系統上的工做夥伴,或者將在Mac上構建的項目交付到另外一個操做系統的生產服務器上,就不得不從新配置代碼了。docker
爲了解決這些問題,將項目和項目所處的環境分離的方法被稱爲「容器」。容器是支持環境運行的地方,與系統上的其餘內容東西相分離。一旦定義了容器中的內容,重建環境就很容易了,甚至能夠實現與同事共享項目。flask
要求windows
啓動Docker,須要安裝軟件:服務器
windows或macOS:安裝Docker Desktopapp
linux:安裝Docker,而後編寫Dockeride
Python服務包ui
假設正在建立一個名爲server.py的Flask服務,並設置該文件的內容,以下:
from flask import Flask server = Flask(__name__)@server.route("/") def hello(): return "Hello World!"if __name__ == "__main__": server.run(host='0.0.0.0')
如上述,需保留代碼依賴關係的記錄。所以建立一個關於需求的txt文件,包含如下內容:
Flask==1.1.1
所以,服務包有如下結構:
app ├─── requirements.txt └─── src └─── server.py
該結構十分符合邏輯(源文件保存在獨立目錄中)。若執行Python程序,咱們須要安裝並運行Python解釋器。接下來能夠在本地運行這個程序,若是有15個項目同時運行,在一個容器中運行能夠避免與其餘項目發生衝突。
Dockerfile
運行Python代碼,須要將容器打包爲Docker鏡像,而後運行。操做以下:
建立一個包含構建鏡像所需指令的Dockerfile
而後經過Docker生成器建立鏡像
簡單的docker run 命令就能夠建立一個正在運行應用程序的容器
Dockerfile分析
Dockerfile是一個包含合成Docker鏡像說明的文件(命名爲myimage):
# set base image (host OS) FROM python:3.8# set the working directory in the container WORKDIR /code# copy the dependencies file to the working directory COPY requirements.txt .# install dependencies RUN pip install -r requirements.txt# copy the content of the local srcdirectory to the working directory COPY src/ .# command to run on container start CMD [ "python", "./server.py" ]
Dockerfile是逐行編譯的,所以生成器會生成一個圖層,並將其疊加在以前的圖像上。在build命令的輸出中,能夠看到做爲步驟執行的Dockerfile指令。
$ docker build -t myimage . Sending build context to Docker daemon 6.144kBStep 1/6 :FROM python:3.8 3.8.3-alpine:Pulling from library/python …Status:Downloaded newer image for python:3.8.3-alpine ---> 8ecf5a48c789Step 2/6 :WORKDIR /code ---> Running in 9313cd5d834d Removing intermediate container 9313cd5d834d ---> c852f099c2f9Step 3/6 :COPY requirements.txt . ---> 2c375052ccd6Step 4/6 :RUN pip install -rrequirements.txt ---> Running in 3ee13f767d05 …Removing intermediate container 3ee13f767d05 ---> 8dd7f46dddf0Step 5/6 :COPY ./src . ---> 6ab2d97e4aa1Step 6/6 :CMD python server.py ---> Running in fbbbb21349be Removing intermediate container fbbbb21349be---> 27084556702b Successfully built 70a92e92f3b5 Successfully tagged myimage:latest
而後能夠發現鏡像存儲在本地圖像中:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZEmyimage latest 70a92e92f3b5 8 seconds ago 991MB
在開發過程當中,可能須要屢次爲Python服務從新構建鏡像,因此但願花費盡量少的時間。
Docker和virtualenv很是類似,但又有所不一樣。Virtualenv容許你在Python依賴關係中切換,但必須使用主機操做系統。然而,使用Docker就能夠在任何操做系統上安裝和運行Python(包括Ubuntu、Debian、Alpine以及Windows Server Core)。
所以,若是你在一個團隊中工做,但願能夠在之後證實你的技術,就要使用Docker。若是不用docker,venv也是不錯的,但它不是通向將來的憑證。
圖源:unsplash
本文展現瞭如何建立Python服務包,並但願簡化過程,使程序員的項目維持更長時間。由於當依賴關係發生變化時,它不太可能出現代碼錯誤。
【責任編輯:趙寧寧 TEL:(010)68476606】