← Back to blog

使用 Docker 將 Python 應用程式容器化

Category
使用 Docker 將 Python 應用程式容器化

Docker 是一個免費且開放原始碼的解決方案,用於在輕量級、作業系統層級虛擬化中開發、部署和管理應用程式。在本指南中,我們將示範如何在 Docker 容器內建立 Python 應用程式。

先決條件

若要執行本指南示範的步驟,你需要以下元件:

Docker 容器

在同一個環境中執行各種程式時,事情可能(而且將會)出錯。你新增的程式越多,環境就會變得越不穩定。對一般使用者而言,這可能不是什麼大問題。然而,若涉及任務關鍵型應用程式,後果可能會很嚴重。

系統中導入的應用程式越多,攻擊面就越大。單一遭入侵的應用程式很容易導致整個系統崩潰。

為了解決這些問題,我們可以使用 Docker 容器進行軟體層級的沙箱隔離:

  • 容器內的應用程式只能有限度地存取檔案。

  • 容器化應用程式無法看到系統中執行的其他行程。

  • 可為容器分配特定數量的硬體資源。

  • 容器的網路連接埠不會對外暴露。

  • 幾乎任何內容都能在本機/正式環境之間維持一致的封裝。

為了示範,我們將在 Docker 容器內建置一個簡單的 Python 伺服器,將容器轉換為映像檔,並在一個模擬正式環境中部署該映像檔。

步驟 1 – 檔案系統設定

若要託管專案,首先我們將建立一個專用目錄:

mkdir -pv python-server-container/
cd !$

在該目錄中,建立一個子目錄 src 來存放我們的程式碼:

mkdir -pv src/

步驟 2 – 建置 Python 伺服器

在此步驟中,我們將以 Python 建立一個簡單的 HTTP 伺服器。建立檔案 server.py

touch server.py

使用文字編輯器開啟它:

nano server.py

輸入以下 Python 程式碼:

from http.server import HTTPServer, SimpleHTTPRequestHandler

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
    """server entrypoint"""
    server_address = ("0.0.0.0", 8080)
    httpd = server_class(server_address, handler_class)
    print("starting server...")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

在這裡:

  • 我們使用 HTTPServer 類別,並從標準 Python 函式庫請求處理常式,讓程式保持簡單。

  • run 函式會初始化一個 HTTPserver 執行個體。

  • server_address 的引數所示,伺服器會在連接埠 8080 監聽任何傳入連線。

現在,我們將驗證伺服器是否如預期運作。啟動伺服器:

python3 server.py

從新的終端機中,我們可以使用 curl 向伺服器送出請求:

curl -iv localhost:8080

或者,你也可以在網頁瀏覽器中存取該連結:

http://localhost:8080

步驟 3 – 建立 Dockerfile

Dockerfile 包含產生 Docker 映像檔所需的指令。檔案中的指令會依序執行。深入了解 Dockerfile

為我們的專案建立新的 Dockerfile

touch Dockerfile

現在,我們將在其中加入必要的程式碼。使用文字編輯器開啟它:

nano Dockerfile

輸入以下程式碼:

FROM python:latest

ENV SRC_DIR /usr/bin/src/test_server/src
COPY src/* ${SRC_DIR}/
WORKDIR ${SRC_DIR}

ENV PYTHONUNBUFFERED=1

CMD ["python", "server.py"]

在這裡:

  • 任何 Dockerfile 都必須以 FROM 指令開頭。在本例中,我們宣告以 Python 作為 Docker 映像檔的基礎。

  • ENV SRC_DIR 指令指定容器目錄的位置。

  • COPY 指令會從目前託管 Python 伺服器的 src 目錄複製檔案。

  • 變數 PYTHONBUFFERED=1 指定 Python 會將輸出直接列印並記錄到 STDOUT。否則,日誌不會被送到任何緩衝區。

  • CMD 指令指定執行容器時要執行的預設命令。在此案例中,我們使用此指令啟動 Python 伺服器。

步驟 4 – 產生 Docker 映像檔

Dockerfile 準備好後,我們現在可以製作映像檔。執行以下 Docker 命令以開始此流程:

docker build . -t python_server

在這裡:

  • -t 旗標用於將我們的 Docker 映像檔標記為 python_server

  • Docker 會下載所有必要元件,並將它們組合成一個映像檔。

步驟 5 – 執行映像檔

映像檔已準備好部署。我們可以使用以下命令執行它:

docker run -p 8080:8080 python_server

在這裡,我們使用 -p 旗標將本機電腦的連接埠 8080 轉送到 Docker 映像檔。

我們可以使用 curl 輕鬆驗證伺服器是否已啟動並正在執行:

curl -iv localhost:8080

步驟 6 – 終止伺服器

從終端機按下 “Ctrl + C” 以終止 Docker 行程:

步驟 7 – 匯出與匯入 Docker 映像檔

現在我們已有一個可運作的 Docker 映像檔,可託管我們的 Python 伺服器。透過 Docker 的匯出與匯入功能,我們可以將它遷移到任何其他系統。

首先,查看目前系統中的 Docker 映像檔清單:

docker images

我們的目標是剛建立的 python_server Docker 映像檔。以下命令會將它匯出為 TAR 封存檔:

docker save python_server:latest > python_server.tar

python_server.tar 檔案傳輸到目標機器後,使用以下命令匯入 Docker 映像檔:

docker load < python_server.tar

總結

在本指南中,我們示範了如何從 Python 應用程式建置 Docker 映像檔。我們建立了一個簡單的 Python 網頁伺服器,並由此建置出 Docker 映像檔。現在,該 Docker 映像檔可以部署到任何環境中,並預期具有一致的行為。

有興趣深入了解 Docker 嗎?請參考以下指南:

祝運算愉快!

Preslav Dobrev

作者 · CloudSigma

留言

目前尚無留言。成為第一個留言的人吧。