亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Docker上部署Python的Flask框架的教程

 更新時間:2015年04月08日 11:01:37   投稿:goldensun  
這篇文章主要介紹了在Docker上部署Python的Flask框架的教程,包括Docker容器內外的網(wǎng)絡通信等,需要的朋友可以參考下

本文中,我將嘗試展示用Docker開發(fā)python應用(主要是Web應用)的可行方法。雖然我本人專注于Python的Flask微框架,但本文目的是演示如何通過Docker更好地開發(fā)和共享應用程序,(由任何語言和框架開發(fā)的應用程序)。Docker通過封裝依賴項,大大減少了開發(fā)環(huán)境和正式產(chǎn)品的差距。

大多數(shù)Python開發(fā)人員在開發(fā)中使用virtualenv。它提供了一種易用的機制讓應用程序使用自己專用的依賴項,這些依賴項可能與在其它應用程序或操作系統(tǒng)存在沖突(尤其是不同的Pyhton版本,還有不同的庫版本等等)。個人而言,我對virtualenv一直沒有太大興趣,原因如下:

  1.     我經(jīng)常忘記啟用它,或者在切換工程時忘記切換它,這會遇到含糊的出錯信息,另人倍感困惑。
  2.     它無法提供“純粹的”隔離,只能是Python級別的隔離(系統(tǒng)庫和非python的依賴項仍然會出問題)。
  3.     我通常不想在正式產(chǎn)品中運行它,這就意味著在開發(fā)環(huán)境和正式產(chǎn)品的不一致。
  4.     它讓人感覺有點“黑客”作法:它是依靠修改腳本和設置新路徑實現(xiàn)的。

( 查看 pythonrants的這篇文章 了解更多為什么你可能不想用virtualenv )

那么,怎么做Docker才能變得更好呢?Docker本質上提供了非常輕量化的VMs(在說法上可以稱為“容器”),我們可以使用其創(chuàng)建一個高標準隔離并能大大減少失配的開發(fā)和產(chǎn)品環(huán)境。(如果你不熟悉Docker,卻還想學習更多,你可以查看我在愛丁堡技術座談會上介紹Docker的談話)。

當我們建立一個小型的可視化Web APP,我自己和Mark Coleman使用這種方法(文檔在這)。這(里面)劃出了一個基本鏡像安裝Python 2.7,還有一些Flask管理以及PostgreSQL的內容。我會依據(jù)這個鏡像去開發(fā)一個hello world的Web應用。我假設你是在Linux上開發(fā),并且你已經(jīng)有git,還安裝了Docker,MacOS的指令應該非常類似。通過克隆和建立基本鏡像開始:
 

$ git clone https://github.com/mrmrcoleman/python_webapp
$ docker build -t python_webapp .

現(xiàn)在,我們需要為容器中添加一些代碼并詳細寫明。我們打算新建一個僅僅指向Docker鏡像的項目來完成這項工作,而不是直接修改之前的項目。

創(chuàng)建一個具有下列結構的新項目:

 

復制代碼 代碼如下:

├── Dockerfile
 ├── example_app
 │   ├── app
 │   │   ├── __init__.py
 │   │   └── views.py
 │   └── __init__.py
 ├── example_app.wsgi 

或者克隆該地址的示例項目: https://github.com/amouat/example_app.git

在example_app/app/_init_.py中寫入:
 

from flask import Flask
 
app = Flask(__name__)
from app import views

使另一個_init_.py為空。在views.py中寫入:
 

from app import app
 
@app.route('/')
@app.route('/index')
def index():
  return "Hello, World!"

以上就是我們的一個hello world應用的最小flask版本。我在 這個教程中也使用過類似的代碼,所以如果你剛剛接觸Flask或者Python,你可以根據(jù)上述提到的教程,使用Docker而不是virtualenv繼續(xù)學習。

為了使之運行在Docker容器內部,我們還需要做一些操作。在我們的實例Apache服務器中,example_app.wsgi文件包含了連接Python代碼和web服務器的指令。該文件應當包含下列內容:
 

import site
site.addsitedir('/opt/example_app/')
from app import app as application

最終,我們需要一個Dockerfile來構建容器并運行容器。在我們的實例中,它看起來是這樣的:
 

FROM python_webapp
 
MAINTAINER amouat
 
ADD example_app.wsgi /var/www/flaskapp/flaskapp.wsgi
CMD service apache2 start && tail -F /var/log/apache2/error.log

ADD那行為啟動WSGI注入了一些代碼。CMD那行在啟動容器,啟動apache web服務器時獲取任何可能的錯誤信息,并將其發(fā)送至stdout。

如果你下列操作:
 

$ docker build -t example_app .
$ docker run -p 5000:5000 -v $(pwd)/example_app:/opt/example_app/ -i -t example_app

你應當會得到這樣的回饋:通過瀏覽器打開地址localhost:5000,你會看到你的網(wǎng)站正在運行。如果你實在VM或者vagrant中運行,記得打開5000端口。

現(xiàn)在我們運行了web服務器,已經(jīng)非常接近我們在產(chǎn)品中使用的東西了(我有意的使用Apache來做這點而不是Python默認的web服務器)。我們通過從主機向容器映射的方式向容器中注入代碼;也可以在Dockerfile命令行中是用ADD來添加代碼,但那樣的話當我們隊代碼進行改動時,每次都需要重新構建容器。

然而,這仍然不是很好 ;開發(fā)中我們真的希望使用很大程度上幫助我們調試的Python web服務器。該高興的是我們不用對Dockerfile進行任何修改。在example_app文件從創(chuàng)建一個run.py文件開始,按照一下內容:
 

!flask/bin/python
from app import app
app.run(debug = True, host='0.0.0.0')

這將啟動Python的帶調試的web服務器并監(jiān)聽所有連接,我們也能從容器外訪問。現(xiàn)在用下列命令重啟容器:
 

$ docker run -p 5000:5000 -v $(pwd)/example_app:/opt/example_app/ -i -t example_app python /opt/example_app/run.py

你能看到網(wǎng)頁又運行了。這次我們顯式地提供運行的命令("python /opt/example_app/ryn.py"),它覆蓋了Dockerfile中的CMD行的設置?,F(xiàn)在如果編輯在主機上的源程序,就能馬上看到網(wǎng)頁上的改變。

讓我們花點時間看看我們的收獲:

  1.     一個運行在隔離容器中的web應用,容器完全封裝了應用的Python依賴項和系統(tǒng)依賴項。
  2.     能夠使用現(xiàn)有編輯器或IDE開發(fā)代碼并直接查看變化,就像在本地編輯一樣。
  3.     比以前更接近正式產(chǎn)品的運行環(huán)境。
  4.     沒有使用virtualenv。

如果你想知道如何以這種方式建立程序發(fā)布的途徑,可以看看Mark Coleman寫的關于前面提到的可視化Web應用的文章

不幸的是,這一切還不完美。還有下列幾個問題:

  1.     你可能仍會遇到需要使用virtualenv或其等價解決方案的情況,例如庫的操作系統(tǒng)版本與你的程序所需版本間的沖突。
  2.     我們還沒完全解決數(shù)據(jù)托管的問題,仍需做某些測試。
  3.     我假設的“產(chǎn)品”是一個Docker容器,但實際情況常常并非如此而且Docker托管本身也剛剛起步。

盡管如此,我仍然認為這向軟件開發(fā)的更好未來邁了一大步,大大減輕了部署軟件和管理依賴項的痛苦。

相關文章

  • python實現(xiàn)班級檔案管理系統(tǒng)

    python實現(xiàn)班級檔案管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現(xiàn)班級檔案管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • pytorch交叉熵損失函數(shù)的weight參數(shù)的使用

    pytorch交叉熵損失函數(shù)的weight參數(shù)的使用

    這篇文章主要介紹了pytorch交叉熵損失函數(shù)的weight參數(shù)的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python實現(xiàn)批量修改文件時間屬性

    Python實現(xiàn)批量修改文件時間屬性

    我們有時候需要修改文件的“修改時間”?、?“訪問時間”,“創(chuàng)建時間”?,此時如果使用Python批量實現(xiàn)應該會方便很多,下面小編就來為大家介紹一下具體實現(xiàn)方法吧
    2023-11-11
  • Django中ORM表的創(chuàng)建和增刪改查方法示例

    Django中ORM表的創(chuàng)建和增刪改查方法示例

    這篇文章主要給大家介紹了關于Django中ORM表的創(chuàng)建和增刪改查等基本操作的方法,還給大家分享了django orm常用查詢篩選的相關內容,分享出來供大家參考學習,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • python中合并兩個文本文件并按照姓名首字母排序的例子

    python中合并兩個文本文件并按照姓名首字母排序的例子

    這篇文章主要介紹了python中合并兩個文本文件并按照姓名首字母排序的例子,需要的朋友可以參考下
    2014-04-04
  • Python學習之路安裝pycharm的教程詳解

    Python學習之路安裝pycharm的教程詳解

    pycharm 是一款功能強大的 Python 編輯器,具有跨平臺性。這篇文章主要介紹了Python學習之路安裝pycharm的教程,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 深入了解python中的常見錯誤類型與解決

    深入了解python中的常見錯誤類型與解決

    在Python編程過程中,經(jīng)常會遇到各種錯誤,了解這些錯誤的類型以及如何處理它們是成為一位優(yōu)秀的Python開發(fā)者所必備的技能之一,下面就跟隨小編一起學習一下python中的常見錯誤類型吧
    2023-11-11
  • Python網(wǎng)絡編程之Python編寫TCP協(xié)議程序的步驟

    Python網(wǎng)絡編程之Python編寫TCP協(xié)議程序的步驟

    這篇文章主要介紹了Python網(wǎng)絡編程編寫TCP協(xié)議程序的開發(fā)步驟,通過實例代碼介紹了TCP客戶端程序開發(fā),案例講解多任務版TCP服務端程序開發(fā),需要的朋友可以參考下
    2022-11-11
  • Python通過for循環(huán)理解迭代器和生成器實例詳解

    Python通過for循環(huán)理解迭代器和生成器實例詳解

    這篇文章主要介紹了Python通過for循環(huán)理解迭代器和生成器,結合實例形式詳細分析了迭代器和生成器的概念、原理、使用方法及相關操作技巧,需要的朋友可以參考下
    2019-02-02
  • Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

    Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

    這篇文章主要介紹了Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論