成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Docker 作為 Python 開發(fā)環(huán)境

開發(fā) 后端 前端
本文中,我將嘗試展示用Docker開發(fā)python應(yīng)用(主要是Web應(yīng)用)的可行方法。雖然我本人專注于Python的Flask微框架,但本文目的是演示如何通過Docker更好地開發(fā)和共享應(yīng)用程序,(由任何語言和框架開發(fā)的應(yīng)用程序)……

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

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

  • 我經(jīng)常忘記啟用它,或者在切換工程時忘記切換它,這會遇到含糊的出錯信息,另人倍感困惑。

  • 它無法提供“純粹的”隔離,只能是Python級別的隔離(系統(tǒng)庫和非python的依賴項仍然會出問題)。

  • 我通常不想在正式產(chǎn)品中運行它,這就意味著在開發(fā)環(huán)境和正式產(chǎn)品的不一致。

  • 它讓人感覺有點“黑客”作法:它是依靠修改腳本和設(shè)置新路徑實現(xiàn)的。

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

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

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

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

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

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

  1. ├── Dockerfile  
  2.  ├── example_app  
  3.  │   ├── app  
  4.  │   │   ├── __init__.py  
  5.  │   │   └── views.py  
  6.  │   └── __init__.py  
  7.  ├── example_app.wsgi 

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

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

  1. from flask import Flask  
  2.    
  3. app = Flask(__name__)  
  4. from app import views 

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

  1. from app import app  
  2.    
  3. @app.route('/')  
  4. @app.route('/index')  
  5. def index():  
  6.     return "Hello, World!" 

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

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

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

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

  1. FROM python_webapp  
  2.    
  3. MAINTAINER amouat  
  4.    
  5. ADD example_app.wsgi /var/www/flaskapp/flaskapp.wsgi  
  6. CMD service apache2 start && tail -F /var/log/apache2/error.log 

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

如果你下列操作:

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

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

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

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

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

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

  1. $ 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行的設(shè)置。現(xiàn)在如果編輯在主機上的源程序,就能馬上看到網(wǎng)頁上的改變。

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

  • 一個運行在隔離容器中的web應(yīng)用,容器完全封裝了應(yīng)用的Python依賴項和系統(tǒng)依賴項。

  • 能夠使用現(xiàn)有編輯器或IDE開發(fā)代碼并直接查看變化,就像在本地編輯一樣。

  • 比以前更接近正式產(chǎn)品的運行環(huán)境。

  • 沒有使用virtualenv。

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

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

  • 你可能仍會遇到需要使用virtualenv或其等價解決方案的情況,例如庫的操作系統(tǒng)版本與你的程序所需版本間的沖突。

  • 我們還沒完全解決數(shù)據(jù)托管的問題,仍需做某些測試。

  • 我假設(shè)的“產(chǎn)品”是一個Docker容器,但實際情況常常并非如此而且Docker托管本身也剛剛起步。

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

英文:Using Docker as a Python Development Environment

譯文出自:http://www.oschina.net/translate/using-docker-as-a-python-development-environment

責(zé)任編輯:林師授 來源: 開源中國社區(qū) 編譯
相關(guān)推薦

2016-09-08 16:04:59

JavaDocker前端

2011-10-24 16:16:02

Node.js

2009-04-16 17:06:50

SSIS集成開發(fā)平臺BI

2015-01-05 14:16:16

DockerFig自動化容器編排

2009-07-09 15:31:23

構(gòu)建Python開發(fā)環(huán)

2016-11-03 09:49:04

2015-01-04 09:49:37

PHPDocker開發(fā)環(huán)境

2014-08-11 10:15:01

Docker開發(fā)環(huán)境

2014-02-26 11:11:05

AndroidStudio開發(fā)環(huán)境

2023-12-25 07:58:46

Python開發(fā).NET

2022-06-24 10:11:15

DockerLinux

2010-07-22 15:22:58

BlackBerry開

2019-11-18 14:00:40

開發(fā)工具環(huán)境搭建vagrant

2009-12-16 15:53:34

Visual Stud

2024-07-12 14:54:48

2023-09-22 18:07:50

人工智能AIPython

2014-12-25 10:15:37

DockerJava

2012-04-28 08:43:12

CentOS

2020-04-28 09:48:53

Docker容器數(shù)據(jù)

2015-06-01 12:10:57

dockerhexo
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品成人网 | 色播av| 国产一区免费视频 | 伦理午夜电影免费观看 | 日韩国产欧美 | 日韩在线播放一区 | 国产高清免费视频 | 成人在线中文字幕 | 91资源在线| 国产精品波多野结衣 | 国产在线一区观看 | 中文字幕不卡在线观看 | 久久久国产视频 | 天堂网中文字幕在线观看 | 日韩一区在线播放 | 91国内视频在线 | 91免费高清视频 | 亚洲国产视频一区二区 | 午夜在线视频 | 日韩高清中文字幕 | 日韩激情在线 | 日韩精品一区二区三区中文在线 | 日韩精品一区二区三区在线播放 | 精精国产xxxx视频在线 | 免费黄色片在线观看 | 91 久久 | 一区欧美 | 在线一区二区三区 | 精品亚洲永久免费精品 | 免费观看av| 欧美在线播放一区 | 亚洲精选一区 | 久久久久免费精品国产 | 91在线观看 | 91精品久久久久久久久久入口 | 亚洲精品成人av久久 | 日韩一区二区三区av | 日韩一区二区三区精品 | 91av视频在线观看 | 国产精品福利在线观看 | 国产精品欧美日韩 |