筆記14:Docker 部署Python項目

Docker 部署Python項目

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

0 引言

設想這樣一個真實案例,假如咱們要部署一個Python應用程序,要作哪些工做?python

  • 首先須要python運行環境,好比部署的是python3,而機器上是python2。先裝個python3,還要裝各類依賴包,機器一些可能的衝突。
  • 裝完python以後,發現還要裝mysql或者redis。繼續下載安裝配置。
  • 啥?服務器不用了,須要換一臺服務器?那從新來一遍吧。
  • 啥?基礎應用作的太好要進行推廣,須要指導其餘廠商部署?這怎麼辦?

能夠看出,在 Docker 以前軟件行業的運維存在着如下這些痛點:mysql

  • 軟件的發佈和部署低效又繁瑣,並且老是須要人工介入
  • 環境的一致性難移保證
  • 在不一樣環境之間遷移的成本較高

在完成Docker部署安裝以前,咱們仍是先認識下Docker的優勢:web

  • 軟件構建容易,分發簡單
  • 應用獲得隔離,依賴被解除
  • 能夠完美地用於 CI/CD
  • 快速部署,測試完之後銷燬也方便

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 提取碼: mqf6redis

Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。有了 Docker,就不用擔憂環境問題。整體來講,Docker 的接口至關簡單,用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。算法

容器与虚拟机 (VM) æ€"ç"“

通俗解釋Dockersql

Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,把貨物規整的擺放起來。而且各類各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。docker就是相似的理念。如今都流行雲計算了,雲計算就比如大貨輪。docker就是集裝箱。docker

  • 不一樣的應用程序可能會有不一樣的應用環境,好比.net開發的網站和php開發的網站依賴的軟件就不同,若是把他們依賴的軟件都安裝在一個服務器上就要調試好久,並且很麻煩,還會形成一些衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來說,咱們能夠在服務器上建立不一樣的虛擬機在不一樣的虛擬機上放置不一樣的應用,可是虛擬機開銷比較高。docker能夠實現虛擬機隔離應用環境的功能,而且開銷比虛擬機小,小就意味着省錢了。
  • 開發軟件的時候用的是Ubuntu,可是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,好比:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程中運維就得想辦法解決這樣的問題。這時候要是有docker你就能夠把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就能夠了。並且部署速度快。
  • 在服務器負載方面,若是你單獨開一個虛擬機,那麼虛擬機會佔用空閒內存的,docker部署的話,這些內存就會利用起來。總之docker就是集裝箱原理。

2 Docker用途

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

(1)提供一次性的環境。本地測試的軟件、持續集成的時候提供單元測試和構建的環境。數據庫

(2)提供彈性的雲服務。由於 Docker 容器能夠隨開隨關,很適合動態擴容和縮容。

(3)組建微服務架構。一臺機器能夠跑多個服務,在本機能夠模擬出微服務架構。

應用場景

  • Web 應用的自動化打包和發佈。
  • 自動化測試和持續集成、發佈。
  • 在服務型環境中部署和調整數據庫或其餘的後臺應用。
  • 從頭編譯或者擴展示有的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優勢

  • 更快速的交付和部署

Docker在整個開發週期均可以完美的輔助你實現快速交付。Docker容許開發者在裝有應用和服務本地容器作開發。能夠直接集成到可持續開發流程中。例如:開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。

  • 高效的部署和擴容

Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。

  • 更高的資源利用率

Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。

  • 更簡單的管理

使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。

4 Docker的三個概念

  1. 鏡像(Image):相似於虛擬機中的鏡像。任何應用程序運行都須要環境,而鏡像就是用來提供這種運行環境的。例如一個Ubuntu鏡像就是一個包含Ubuntu操做系統環境的模板,同理在該鏡像上裝上Apache軟件,就能夠稱爲Apache鏡像。
  2. 容器(Container):相似於一個輕量級的沙盒,能夠將其看做一個極簡的Linux系統環境(包括root權限、進程空間、用戶空間和網絡空間等),以及運行在其中的應用程序。Docker引擎利用容器來運行、隔離各個應用。容器是鏡像建立的應用實例,能夠建立、啓動、中止、刪除容器,各個容器之間是是相互隔離的,互不影響。注意:鏡像自己是隻讀的,容器從鏡像啓動時,Docker在鏡像的上層建立一個可寫層,鏡像自己不變。
  3. 倉庫(Repository):相似於代碼倉庫,這裏是鏡像倉庫,是Docker用來集中存放鏡像文件的地方。注意與註冊服務器(Registry)的區別:註冊服務器是存放倉庫的地方,通常會有多個倉庫;而倉庫是存放鏡像的地方,通常每一個倉庫存放一類鏡像,每一個鏡像利用tag進行區分,好比Ubuntu倉庫存放有多個版本(12.0四、14.04等)的Ubuntu鏡像。

5 Docker的使用

5.1 Win10下安裝Docker

第一步:啓動虛擬環境

Win10 系統下安裝Docker,首先WIN+X,點擊應用和功能;以後點擊右側的「程序和功能」,接着點擊左側欄「啓用或關閉Windows功能」,並作如下Hyper-V(hyper-v能夠理解爲虛擬機平臺)的配置:

img

第二步:安裝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. 虛擬機

img

安裝完成後,Docker 會自動啓動。通知欄上會出現個小鯨魚的圖標img,這表示 Docker 正在運行。桌邊也會出現三個圖標,咱們能夠在命令行執行 docker version 來查看版本號,docker run hello-world 來載入測試鏡像測試。

點擊WIN+R,輸入CMD打開命令行窗口,輸入命令docker version結果以下:

1558428612726

運行docker run hello-world 來載入測試鏡像測試,效果以下:

1558428753024

第三步:鏡像加速

鑑於國內網絡問題,後續拉取 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來設置:

1558428818106

5.2 Docker 經常使用命令

  • 確認容器有在運行,能夠經過 docker ps 來查看
  • 使用 docker stop 容器Name 命令來中止容器
  • 查看docker信息 docker info
  • 刪除鏡像:docker rmi imageID
  • 停用鏡像:docker stop ImageID
  • 重啓鏡像: docker start imageID
  • 刪除容器: docker rm ID
  • docker inspect 來查看 Docker 的底層信息
  • docker images 查看docker 鏡像
  • 從 Docker Hub 網站來搜索鏡像,Docker Hub 網址爲: https://hub.docker.com/
  • 使用 docker search 命令來搜索鏡像。如搜索httpd的鏡像。

1558433823656

  • 使用命令 docker pull 來下載鏡像。

1558434858151

  • 命令 docker build , 從零開始來建立一個新的鏡像
  • 容器鏈接:指定容器綁定的網絡地址,好比綁定 127.0.0.1。

1558435685434

6 Docker的實例

6.1 Docker 安裝 MySQL

第一步:建立MySQL鏡像:docker pull mysql

查找Docker Hub上的mysql鏡像: docker search mysql

1558436137076

第二步:下載鏡像: docker pull mysql:5.6

1558436518291

第三步:查看鏡像。列表裏查到REPOSITORY爲mysql,標籤爲5.6的鏡像。docker images mysql

1558436587885

第四步:使用最新的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'@'%';

1558443620990

第五步:遠程鏈接MySQL數據庫。

1558443896087

第六步:新受權用戶鏈接測試。

1558443939117

6.2 Docker 安裝 Python項目

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

第一步: Win10下建立目錄文本

選擇在D盤下建立docker目錄,分別新建三個文件:Dockerfile,app.py,equirements.txt

1558509365927

  • 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

1558509869193

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

1558506791595

第三步:查看鏡像是否生成

1558506791595

第四步:運行鏡像程序,這裏能夠看到分詞效果

1558506791595

6.3 Docker 安裝 Django項目

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

1558506791595

第二步:運行鏡像。docker run -d -P training/webapp python app.py # 多個PORTS端口

1558506791595

第三步:瀏覽器輸入本地ip:端口號,訪問網頁信息

1558506791595

擴展:使用 Docker 和 Elasticsearch 構建一個全文搜索應用程序https://www.zcfy.cc/article/building-a-full-text-search-app-using-docker-and-elasticsearch

7 技術交流共享QQ羣

機器學習和天然語言QQ羣:436303759】:

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

相關文章
相關標籤/搜索