還不使用Docker管理數據,你是從1985年穿越來的嗎?

本文轉載自公衆號「讀芯術」(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也是不錯的,但它不是通向將來的憑證。

還不使用Docker管理數據,你是從1985年穿越來的嗎?

圖源:unsplash

本文展現瞭如何建立Python服務包,並但願簡化過程,使程序員的項目維持更長時間。由於當依賴關係發生變化時,它不太可能出現代碼錯誤。

【責任編輯:趙寧寧 TEL:(010)68476606】

相關文章
相關標籤/搜索