當前位置:
首頁 > 知識 > 如何開發一個基於 Docker 的 Python 應用

如何開發一個基於 Docker 的 Python 應用

點擊上方

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!



前言


Python 家族成員繁多,解決五花八門的業務需求。這裡將通過 Python 明星項目 IPython Notebook,使其容器化,讓大家掌握基礎的 Docker 使用方法。


IPython Notebook 目前已經成為用 Python 做教學、計算、科研的一個重要工具。


Docker 化應用的關鍵元素




  • 鏡像是 Docker 應用的靜態表示,是應用的交付件,鏡像中包含了應用運行所需的所有依賴:包括應用代碼、應用依賴庫、應用運行時和操作系統。



  • Dockerfile 是一個描述文件,描述了產生 Docker 鏡像的過程,詳細文檔可以參見官方文檔 

    Dockerfile reference



  • 容器是鏡像運行時的動態表示,如果把鏡像想像為一個 Class 那麼容器就是這個 Class 的一個實例。


一個應用 Docker 化的第一步就是通過 Dockerfile 產生應用鏡像。


編寫 Dockerfile




  • 選擇 Python 2.7 版本為我們依賴的系統鏡像。

  1.    FROM python

    :

    2.7



因所有官方鏡像均位於境外伺服器,為了確保所有示例能正常運行,可以使用與官方鏡像保持同步的 DaoCloud 境內鏡像: 

FROM daocloud

.

io

/

python

:

2.7


也推薦通過 

DaoCloud Toolbox

 極速下載官方鏡像!




  • 設置鏡像的維護者,相當於鏡像的作者或發行方。

  1.    MAINTAINER

    Captain

    Dao

    <

    support@daocloud

    .

    io

    >




  • 向鏡像中添加文件並安裝依賴。

  1.    RUN mkdir

    -

    p

    /

    app

  2.    WORKDIR

    /

    app

  3.    ADD requirements

    .

    txt requirements

    .

    txt

  4.    RUN pip install

    -

    r requirements

    .

    txt

  5.    COPY docker

    -

    entrypoint

    .

    sh

    /

    usr

    /

    local

    /

    bin

    /



ADD

 與 

COPY

 的區別


總體來說 

ADD

 和 

COPY

 都是添加文件的操作,其中 

ADD

 比 

COPY

 功能更多, 

ADD

 允許後面的參數為 URL,還有 

ADD

 添加的文件為壓縮包的話,它將自動解壓。


使用 

RUN

 命令調用 pip 包管理器安裝 App 的依賴包


在編寫 Dockerfile 時盡量將安裝依賴的過程提前以提高鏡像層的復用率。




  • 啟動應用進程

  1.    EXPOSE

    8888

  2.    ENTRYPOINT

    [

    "docker-entrypoint.sh"

    ]

  3.    CMD

    [

    ""

    ]


通過 

EXPOSE

 指定該鏡像需要公開的埠。


ENTRYPOINT

 與 

CMD

 的區別


ENTRYPOINT

 指定了該鏡像啟動時的入口, 

CMD

 則指定了容器啟動時的命令,當兩者共用時,完整的啟動命令像是 

ENTRYPOINT 

+

 CMD

 這樣。


使用 

ENTRYPOINT

 的好處是在我們啟動鏡像就像是啟動了一個可執行程序,在 

CMD

 上僅需要指定參數;另外在我們需要自定義 

CMD

 時不容易出錯。


製作啟動腳本(docker-entrypoint.sh)

  1.    

    #!/bin/bash

  2.    

    # Strict mode

  3.    

    set

    -

    euo pipefail

  4.    

    # Create the hash to pass to the IPython notebook, but don"t export it so it doesn"t appear

  5.    

    # as an environment variable within IPython kernels themselves

  6.    HASH

    =

    $

    (

    python

    -

    c

    "from IPython.lib import passwd; print(passwd("${PASSWORD:-admin}"))"

    )

  7.    echo

    "========================================================================"

  8.    echo

    "You can now connect to this Ipython Notebook server using, for example:"

  9.    echo

    ""

  10.    echo

    "  docker run -d -p <your-port>:8888 -e password=<your-password> ipython/noetebook"

  11.    echo

    ""

  12.    echo

    "  use password: ${PASSWORD:-admin} to login"

  13.    echo

    ""

  14.    echo

    "========================================================================"

  15.    unset PASSWORD

  16.    ipython notebook

    --

    no

    -

    browser

    --

    port

    8888

    --

    ip

    =*

    --

    NotebookApp

    .

    password

    =

    "$HASH"


一般我們會將初始化應用的過程編寫成一個啟動腳本,在腳本里以環境變數或命令行參數的形式獲取應用初始化所必須的信息,然後配置並啟動應用。


啟動容器


有了 Dockerfile 以後,我們可以運行下面的命令構建 Python 應用鏡像並命名為 

ipython

/

notebook




  • 通過指令建立鏡像

  1.    docker build

    -

    t ipython

    /

    notebook

    .




  • 通過以下指令啟動容器

  1.    docker run

    -

    d

    -

    p

    8888

    :

    8888

    -

    e PASSWORD

    =

    admin ipython

    /

    notebook


注意哦,我們將初始登錄密碼以環境變數的形式傳入容器並告知應用。


打開遊覽器,訪問 8888 埠,就可以看到 IPython Notebook 了。








  • 作者:wph95



  • 原文:

    http://open.daocloud.io/



  • Python開發整理髮布,轉載請聯繫作者獲得授權


【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

super 沒那麼簡單
你用 Python 寫過哪些牛逼的程序/腳本?

TAG:Python開發 |