使用 Docker 作為 Python 開發環境

2021-12-29 IT網際網路那點事

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

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

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

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

我通常不想在正式產品中運行它,這就意味著在開發環境和正式產品的不一致。

它讓人感覺有點「黑客」作法:它是依靠修改腳本和設置新路徑實現的。

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

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

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

$ git clone https://github.com/mrmrcoleman/python_webapp

$ docker build -t python_webapp .

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

創建一個具有下列結構的新項目:

├── 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,你可以根據上述提到的教程,使用Docker而不是virtualenv繼續學習。

為了使之運行在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伺服器時獲取任何可能的錯誤信息,並將其發送至stdout。

如果你下列操作:

$ docker build -t example_app .

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

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

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

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

!flask/bin/python

from app import app

app.run(debug = True, host='0.0.0.0')

這將啟動Python的帶調試的web伺服器並監聽所有連接,我們也能從容器外訪問。現在用下列命令重啟容器:

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

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

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

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

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

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

來源:開源中國

連結:www.oschina.net/translate/using-docker-as-a-python-development-environment

Linux雲計算免費訓練營火熱開講中,5天運維乾貨內容免費聽,點擊文末「閱讀原文」即可免費聽運維課速速來搶~~~~

相關焦點

  • PyCharm使用之利用Docker鏡像搭建Python開發環境
    在我們平時使用PyCharm的過程中,一般都是連接本地的Python環境進行開發,但是如果是離線的環境呢?
  • 02 Docker實戰之使用Docker管理測試環境
    回顧「3個場景快速上手Do
  • 使用Docker高效搭建開發環境
    ,今天給大家帶來的是奇虎360的開發是如何使用Docker高效搭建開發環境的。作為一個平時喜歡折騰的開發人員,我喜歡嘗試各種環境,使用感興趣的各種開源軟體。同時,我也是有一些相對的小潔癖,很喜歡Linux中權限最小化原則,我也不喜歡自己的環境中有太多不知道的東西。
  • IFTTT在開發環境中的Docker使用經驗
    改造我們的生產環境架構之前,我們決定首先從本地開發環境開始實踐。這樣我們就可以在冒險上生產環境之前發現應用程式的的一些問題。另外,本地開發環境已經偏離了我們現存的生產環境。我們使用Chef(一個系統集成框架,為整個架構提供配置管理功能)和Vagrant(一款用來構建虛擬開發環境的工具)提供管理本地虛擬機。它雖然一直在工作,但是我們知道它工作不了太久。
  • Docker鏡像裡安裝Python環境
    1、前言2、Docker安裝Python環境3、Jenkins時間與本地時間不一致根據之前的文章 Docker安裝Jenkins是在 CentOS 7.9 環境下進行 Docker 安裝執行成功。2、進入 Jenkins 容器中docker exec -itu root 容器id /bin/sh例如 docker exec -itu root b896766053f2
  • Docker | 多圖預警 | 配置Docker下Python開發環境
    Docker可以用來減輕我們搭建環境的繁瑣步驟,我們完全可以把類似selenium等環境用Docker容器部署好,在代碼裡直接使用遠端的selenium,簡單方便。使用Docker容器中的Python環境進行開發環境準備:騰訊雲CentOS 7 + Docker修改Docker配置簡易版本:編輯Docker相關配置文件:vi /etc/docker/daemon.json 插入下面的配置:注意這裡是標準的json格式,格式出錯Docker重啟不了
  • 如何利用Docker快速建置OpenVINO Toolkit開發環境
    為解決這項問題,OpenVINO也有推出Docker安裝方式,輕鬆搞定安裝及執行問題,且可有效隔離不同版本及其它開發環境。接著就簡單說明「什麼是Docker?和虛擬機VM有何不同?」、「如何安裝Docker工作環境」及「如何使用Docker安裝OpenVINO」,最後再以一個範例來說明「如何利用公開模型mobilenet執行影像分類」。什麼是Docker?
  • Docker 搭建 Django+Mariadb 環境
    準備項目目錄workspace 工作空間,所有項目大本營:自己習慣autodeploy 自動部署項目的目錄:自己習慣z-dev 存放開發環境 dockerfile 及相關信息:自己習慣z-pub 存放生產環境 dockerfile 及相關信息:自己習慣.dockerignore 存放不被鏡像
  • Windows上做Python開發太痛苦?Docker了解一下
    但這樣也不太方便,每次進入開發環境都要先啟動VMWare,再啟動Ubuntu,然後打開命令行窗口開始開發,而且有時候需要在宿主機和虛擬機之間來回切換,也很麻煩。最近了解到Docker也有Windows的版本,於是就想到在windows上利用Docker運行一個Ubuntu鏡像,在容器裡搭建Python開發環境,這樣既解決了安裝庫的問題,也解決了VMWare虛擬機的不方便之處。
  • Win10+Vscode搞定python開發環境
    Win10+Vscode搞定python開發環境初學python的時候,最推薦的IDE當然是Pycharm,JetBrain家的產品最大的優點就是代碼提示做的是真好
  • 使用 Docker 搭建 Laravel 本地環境
    Laravel 官方提供 Homestead 和 Valet 作為本地開發環境,Homestead 是一個官方預封裝的 Vagrant Box,
  • 基於 Docker 搭建 PHP 開發環境
    (給PHP開發者加星標,提升PHP技能)轉自:HesunflyDocker 是這幾年非常火的一項技術,作為一名軟體開發人員
  • 構建完美的 Python Dockerfile
    緩存docker 中的緩存是按層進行的。每個「RUN」都會創建一個可以緩存的層。它將檢查您的本地系統是否有以前的構建,並使用每個未觸及的層作為緩存。如果存在緩存命中,則匹配的圖層會被拉入本地環境。如果您遵循最小權限 (PoLP) 原則,它將使您的生產環境更加安全。
  • 如何開發一個基於 Docker 的 Python 應用
    容器是鏡像運行時的動態表示,如果把鏡像想像為一個 Class 那麼容器就是這個 Class 的一個實例。一個應用 Docker 化的第一步就是通過 Dockerfile 產生應用鏡像。編寫 Dockerfile    FROM python:2.7因所有官方鏡像均位於境外伺服器,為了確保所有示例能正常運行,可以使用與官方鏡像保持同步的 DaoCloud 境內鏡像: FROM daocloud.io/python:2.7。
  • 用 Docker 快速配置前端開發環境
    在開發機上配置好 Samba,然後在自己機器上連接開發機,把共享文件夾拖到編輯器中就可以寫代碼了。VPN 可以解決第三個問題。大公司除了專用的軟體,還會配套使用硬體來提高安全係數。VPN 硬體類似 U 盾,上面顯示一串動態數字密碼,定時刷新,每次外網登錄 VPN 都需要附加動態密碼。
  • 我的深度學習開發環境詳解:TensorFlow + Docker + PyCharm等,你的呢(附問卷)
    但根據自己的預算、語言習慣、開發需求,每個人都會配置不同的開發環境,也遇到過各種各樣的難題。因此,我們在文後附上了一份調查問卷,希望能了解眾多不同開發者的深度學習環境,最終匯集成一篇文章為大家提供不同的洞見。在嘗試用不同的東西來配置深度學習環境這個過程中,我花費了相當多的時間。因此我想著把自己目前的工作流程整理成文檔,希望可以幫助到嘗試著做同樣事情的人。
  • Docker 開發鏡像搭建與DockerFile分享
    背景    之前搭建過一個開發鏡像,包含了 java、go 語言等基本的開發環境,結合 vscode remote 模式,可在本地直接進行開發,免去了安裝各種基礎環境和配置環境變量的麻煩但是對於使用者來說,依然有兩個並不方便的地方:易用性
  • Docker搭建pwn環境
    本文為看雪論壇優秀文章看雪論壇作者ID:直木其實以前就想搭建一個docker環境,但是那時候想用dockfile來一步到位
  • 反駁 Docker挺適合用於軟體開發環境
    我有點不敢確認是否作者真心研究過Docker對於軟體開發環境帶來的好處。因為我從去年年初開始用Docker以後的感觸是:部署Docker行不行還有待商榷,但是用在開發中是足夠了、可以極力推廣的。這篇博客用我實際工作中的一個例子讓大家跟著我一起體會一下,我是如何用Docker來作為開發環境的,並給出我使用的一些小技巧,最後也對原文中提到的幾個問題一一進行探討。
  • 環境搭建-Docker
    容器是完全使用沙箱機制,相互之間不會有任何接口。yum軟體源yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo如執行報如下錯誤,原因為Python已升級到3,但是yum-config-manager文件需要Python