1. 程式人生 > >Docker如何部署Python專案

Docker如何部署Python專案

Docker 部署Python專案

作者:白寧超

2019年5月24日09:09:00

導讀: 軟體開發最大的麻煩事之一就是環境配置,作業系統設定,各種庫和元件的安裝。只有它們都正確,軟體才能執行。如果從一種作業系統裡面執行另一種作業系統,通常我們採取的策略就是引入虛擬機器,比如在 Windows 系統裡面執行 Linux 系統。這種方式有個很大的缺點就是資源佔用多、冗餘步驟多、啟動慢。目前最流行的 Linux 容器解決方案之一就是Docker,它最大優點就是輕量、資源佔用少、啟動快。本文從什麼是Docker?Docker解決什麼問題?有哪些好處?如何去部署實現去全面介紹。

0 引言


設想這樣一個真實案例,假如我們要部署一個Python應用程式,要做哪些工作?首先需要python執行環境,比如部署的是python3,而機器上是python2。先裝個python3,還要裝各種依賴包,機器一些可能的衝突。裝完python之後,發現還要裝mysql或者redis。繼續下載安裝配置。啥?伺服器不用了,需要換一臺伺服器?那重新來一遍吧。啥?基礎應用做的太好要進行推廣,需要指導其他廠商部署?這怎麼辦?可以看出,在 Docker 之前軟體行業的運維存在著以下這些痛點:

  1. 軟體的釋出和部署低效又繁瑣,而且總是需要人工介入
  2. 環境的一致性難移保證
  3. 在不同環境之間遷移的成本較高

在完成Docker部署安裝之前,我們還是先認識下Docker的優點:

  1. 軟體構建容易,分發簡單
  2. 應用得到隔離,依賴被解除
  3. 可以完美地用於 CI/CD
  4. 快速部署,測試完以後銷燬也方便

1 什麼是Docker


        Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在 GitHub 上進行維護。2013年3月,dotCloud公司的創始人之一,Docker之父,28歲的Solomon Hykes正式決定,將Docker專案開源,Docker 自開源後受到廣泛的關注和討論。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。WIn10下Docker下載地址:連結: https://pan.baidu.com/s/1GlneodbQduUdX9yLRF2hcA 提取碼: mqf6。Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。有了 Docker,就不用擔心環境問題。總體來說,Docker 的介面相當簡單,使用者可以方便地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣。

通俗解釋Docker

Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。docker就是類似的理念。現在都流行雲計算了,雲端計算就好比大貨輪。docker就是集裝箱。不同的應用程式可能會有不同的應用環境,比如.net開發的網站和php開發的網站依賴的軟體就不一樣,如果把他們依賴的軟體都安裝在一個伺服器上就要除錯很久,而且很麻煩,還會造成一些衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來講,我們可以在伺服器上建立不同的虛擬機器在不同的虛擬機器上放置不同的應用,但是虛擬機器開銷比較高。docker可以實現虛擬機器隔離應用環境的功能,並且開銷比虛擬機器小,小就意味著省錢了。開發軟體的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟體從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的資料庫,只有Ubuntu支援,centos不支援,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。在伺服器負載方面,如果你單獨開一個虛擬機器,那麼虛擬機器會佔用空閒記憶體的,docker部署的話,這些記憶體就會利用起來。總之docker就是集裝箱原理。

2 Docker用途


Docker 的主要用途,目前有三大類。

  1. 提供一次性的環境。本地測試的軟體、持續整合的時候提供單元測試和構建的環境。
  2. 提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。
  3. 組建微服務架構。一臺機器可以跑多個服務,在本機可以模擬出微服務架構。

應用場景

  1. Web 應用的自動化打包和釋出。
  2. 自動化測試和持續整合、釋出。
  3. 在服務型環境中部署和調整資料庫或其他的後臺應用。
  4. 從頭編譯或者擴充套件現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。

Docker 能幹什麼?

  • 簡化配置:這是Docker公司宣傳的Docker的主要使用場景。虛擬機器的最大好處是能在你的硬體設施上執行各種配置不一樣的平臺(軟體、系統),Docker在降低額外開銷的情況下提供了同樣的功能。它能讓你將執行環境和配置放在程式碼中然後部署,同一個Docker的配置可以在不同的環境中使用,這樣就降低了硬體要求和應用環境之間耦合度。

  • 程式碼流水線管理:前一個場景對於管理程式碼的流水線起到了很大的幫助。程式碼從開發者的機器到最終在生產環境上的部署,需要經過很多的中間環境。而每一箇中間環境都有自己微小的差別,Docker給應用提供了一個從開發到上線均一致的環境,讓程式碼的流水線變得簡單不少。

  • 提高開發效率:這就帶來了一些額外的好處:Docker能提升開發者的開發效率。如果你想看一個詳細一點的例子,可以參考Aater在DevOpsDays Austin 2014 大會或者是DockerCon上的演講。 不同的開發環境中,我們都想把兩件事做好。一是我們想讓開發環境儘量貼近生產環境,二是我們想快速搭建開發環境。

    理想狀態中,要達到第一個目標,我們需要將每一個服務都跑在獨立的虛擬機器中以便監控生產環境中服務的執行狀態。然而,我們卻不想每次都需要網路連線,每次重新編譯的時候遠端連線上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常記憶體比較小,之前使用虛擬的時候,我們經常需要為開發環境的機器加記憶體,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。

  • 隔離應用: 有很多種原因會讓你選擇在一個機器上執行不同的應用,比如之前提到的提高開發效率的場景等。我們經常需要考慮兩點,一是因為要降低成本而進行伺服器整合,二是將一個整體式的應用拆分成鬆耦合的單個服務(譯者注:微服務架構)。如果你想了解為什麼鬆耦合的應用這麼重要,請參考Steve Yege的這篇論文,文中將Google和亞馬遜做了比較。

  • 整合伺服器:正如通過虛擬機器來整合多個應用,Docker隔離應用的能力使得Docker可以整合多個伺服器以降低成本。由於沒有多個作業系統的記憶體佔用,以及能在多個例項之間共享沒有使用的記憶體,Docker可以比虛擬機器提供更好的伺服器整合解決方案。

  • 除錯能力:Docker提供了很多的工具,這些工具不一定只是針對容器,但是卻適用於容器。它們提供了很多的功能,包括可以為容器設定檢查點、設定版本和檢視兩個容器之間的差別,這些特性可以幫助除錯Bug。你可以在《Docker拯救世界》的文章中找到這一點的例證。

  • 多租戶: 另外一個Docker有意思的使用場景是在多租戶的應用中,它可以避免關鍵應用的重寫。我們一個特別的關於這個場景的例子是為IoT(譯者注:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本程式碼非常複雜,很難處理,重新規劃這樣一個應用不但消耗時間,也浪費金錢。使用Docker,可以為每一個租戶的應用層的多個例項建立隔離的環境,這不僅簡單而且成本低廉,當然這一切得益於Docker環境的啟動速度和其高效的diff命令。

  • 快速部署: 在虛擬機器之前,引入新的硬體資源需要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了分鐘級別。而Docker通過為程序僅僅建立一個容器而無需啟動一個作業系統,再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。你可以在資料中心建立銷燬資源而無需擔心重新啟動帶來的開銷。通常資料中心的資源利用率只有30%,通過使用Docker並進行有效的資源分配可以提高資源的利用率。

3 Docker優點


  1. 更快速的交付和部署:Docker在整個開發週期都可以完美的輔助你實現快速交付。Docker允許開發者在裝有應用和服務本地容器做開發。可以直接整合到可持續開發流程中。例如:開發者可以使用一個標準的映象來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署程式碼。 Docker 可以快速建立容器,快速迭代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何建立和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
  2. 高效的部署和擴容:Docker 容器幾乎可以在任意的平臺上執行,包括物理機、虛擬機器、公有云、私有云、個人電腦、伺服器等。 這種相容性可以讓使用者把一個應用程式從一個平臺直接遷移到另外一個。
  3. 更高的資源利用率:Docker 對系統資源的利用率很高,一臺主機上可以同時執行數千個 Docker 容器。容器除了執行其中應用外,基本不消耗額外的系統資源,使得應用的效能很高,同時系統的開銷儘量小。傳統虛擬機器方式執行 10 個不同的應用就要起 10 個虛擬機器,而Docker 只需要啟動 10 個隔離的應用即可。
  4. 更簡單的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

4 Docker的三個概念


  1.  映象(Image):類似於虛擬機器中的映象。任何應用程式執行都需要環境,而映象就是用來提供這種執行環境的。例如一個Ubuntu映象就是一個包含Ubuntu作業系統環境的模板,同理在該映象上裝上Apache軟體,就可以稱為Apache映象。
  2. 容器(Container):類似於一個輕量級的沙盒,可以將其看作一個極簡的Linux系統環境(包括root許可權、程序空間、使用者空間和網路空間等),以及執行在其中的應用程式。Docker引擎利用容器來執行、隔離各個應用。容器是映象建立的應用例項,可以建立、啟動、停止、刪除容器,各個容器之間是是相互隔離的,互不影響。注意:映象本身是隻讀的,容器從映象啟動時,Docker在映象的上層建立一個可寫層,映象本身不變。
  3. 倉庫(Repository):類似於程式碼倉庫,這裡是映象倉庫,是Docker用來集中存放映象檔案的地方。注意與註冊伺服器(Registry)的區別:註冊伺服器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放映象的地方,一般每個倉庫存放一類映象,每個映象利用tag進行區分,比如Ubuntu倉庫存放有多個版本(12.04、14.04等)的Ubuntu映象。

5 Docker的使用


 5.1 Win10下安裝Docker

第一步:啟動虛擬環境:Win10 系統下安裝Docker,首先WIN+X,點選應用和功能;之後點選右側的“程式和功能”,接著點選左側欄“啟用或關閉Windows功能”,並做以下Hyper-V(hyper-v可以理解為虛擬機器平臺)的配置:

第二步:安裝Toolbox:最新版 Toolbox下載地址 連結: https://pan.baidu.com/s/1Nx3gVdbRrO32elJcRBfiOA 提取碼: dsd4 。下載完成後,雙擊下載的 Docker for Windows Installer 安裝檔案,一路 Next,點選 Finish 完成安裝。docker toolbox是一個工具集,它主要包含以下一些內容:Docker CLI 客戶端,用來執行docker引擎建立映象和容器;Docker Machine. 可以讓你在windows的命令列中執行docker引擎命令;Docker Compose. 用來執行docker-compose命令;Kitematic. 這是Docker的GUI版本;Docker QuickStart shell. 這是一個已經配置好Docker的命令列環境;Oracle VM Virtualbox. 虛擬機器

安裝完成後,Docker 會自動啟動。通知欄上會出現個小鯨魚的圖示 ,這表示 Docker 正在執行。桌邊也會出現三個圖示,我們可以在命令列執行 docker version 來檢視版本號,docker run hello-world 來載入測試映象測試。

點選WIN+R,輸入CMD開啟命令列視窗,輸入命令docker version結果如下:

執行docker run hello-world 來載入測試映象測試,效果如下:

第三步:映象加速:鑑於國內網路問題,後續拉取 Docker 映象十分緩慢,我們可以需要配置加速器來解決,我使用的是網易的映象地址:http://hub-mirror.c.163.com。新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。請在該配置檔案中加入(沒有該檔案的話,請先建一個):

 
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
 

也可以通過點選小鯨魚右鍵settings來設定:

5.2 Docker 常用命令

  1. 確認容器有在執行,可以通過 docker ps 來檢視
  2. 使用 docker stop 容器Name 命令來停止容器
  3. 檢視docker資訊 docker info
  4. 刪除映象:docker rmi imageID
  5. 停用映象:docker stop ImageID
  6. 重啟映象: docker start imageID
  7. 刪除容器: docker rm ID
  8. docker inspect 來檢視 Docker 的底層資訊
  9. docker images 檢視docker 映象
  10. 從 Docker Hub 網站來搜尋映象,Docker Hub 網址為: https://hub.docker.com/
  11. 使用 docker search 命令來搜尋映象。如搜尋httpd的映象。
  12. 使用命令 docker pull 來下載映象。
  13. 命令 docker build , 從零開始來建立一個新的映象
  14. 容器連線:指定容器繫結的網路地址,比如繫結 127.0.0.1。

6 Docker的例項


 6.1 Docker 安裝 MySQL

第一步:建立MySQL映象:docker pull mysql。查詢Docker Hub上的mysql映象: docker search mysql

第二步:下載映象: docker pull mysql:5.6

第三步:檢視映象。列表裡查到REPOSITORY為mysql,標籤為5.6的映象。docker images mysql

第四步:使用最新的MySQL映象。

 
# docker 中下載 mysql
docker pull mysql
​
#啟動,設定初始密碼
docker run --name bnc-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
​
#進入容器
docker exec -it bnc-mysql bash
​
#登入mysql
mysql -u root -p 
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';  
FLUSH PRIVILEGES;  
​
#新增遠端登入使用者
CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%';
 

第五步:遠端連線MySQL資料庫。

第六步:新授權使用者連線測試。

6.2 Docker 安裝 Python專案

場景描述:我們使用一個簡單的python專案,本專案是中文分詞的演算法。如何實現Docker安裝部署。

第一步: Win10下建立目錄文字。選擇在D盤下建立docker目錄,分別新建三個檔案:Dockerfile,app.py,equirements.txt

Dockerfile(沒有後綴):一個文字檔案,包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。建立映象必須檔案。

 
# 基於映象基礎
FROM python:3.7
 
# 設定程式碼資料夾工作目錄 /app
WORKDIR /app
 
# 複製當前程式碼檔案到容器中 /app
ADD . /app
 
# 安裝所需的包
RUN pip install -r requirements.txt
 
# Run app.py when the container launches
CMD ["python", "app.py"]

app.py:python專案的原始碼,這裡測試的單個python檔案,如果是一個完整專案,可以將整個資料夾拷貝到這裡。

 
# coding:utf8
​
"""
DESC: Python資料預處理之第一個分詞程式範例
Author:伏草惟存
Prompt: code in Python3 env
"""
​
import jieba
​
str = "道路千萬條,安全第一條;行車不規範,親人兩行淚。"
print("原句: \n" + str)
​
seg_list = jieba.cut(str)
print("分詞: \n" + " / ".join(seg_list))

equirements.txt :所需要的外掛,以python為例,其獲取方法是cmd命令,進入到【D:\docker】目錄,執行命令:pip freeze > requirements.txt

第二步:生成映象。本文采用的windows環境。docker build -t friendlyhello .命令中最後的點不要忘記,這裡表示當前目錄

第三步:檢視映象是否生成

第四步:執行映象程式,這裡可以看到分詞效果

6.3 Docker 安裝 Django專案

第一步:載入映象。一般採用自構建的方法,本文采用直接pull下載完成。docker pull training/webapp

第二步:執行映象。docker run -d -P training/webapp python app.py # 多個PORTS埠

第三步:瀏覽器輸入本地ip:埠號,訪問網頁資訊

7 技術交流共享QQ群


 【機器學習和自然語言QQ群:436303759】:機器學習和自然語言(QQ群號:436303759)是一個研究深度學習、機器學習、自然語言處理、資料探勘、影象處理、目標檢測、資料科學等AI相關領域的技術群。其宗旨是純粹的AI技術圈子、綠色的交流環境。本群禁止有違背法律法規和道德的言談舉止。群成員備註格式:城市-自命名。微信訂閱號:datathinks.。