Docker 是一個免費且開源的解決方案,用於在輕量級、作業系統級虛擬化中開發、部署和管理應用程式。在本指南中,我們將演示在 Docker 容器中建立一個 Python 應用程式。
先決條件
要執行本指南中演示的步驟,您將需要以下組件:
-
一個 Linux 系統。請參閱 在 CloudSigma 上配置您自己的 Ubuntu VPS.
-
已安裝並配置最新版本的 Docker。深入了解 在 Ubuntu 上安裝 Docker.
Docker 容器
在同一個環境中運行多個不同的程式時,事情可能會(而且一定會)出錯。您添加的程式越多,它就變得越不穩定。對於一般人來說這可能沒什麼大不了。然而,當涉及到關鍵任務應用程式時,可能會產生嚴重的後果。
系統中引入的應用程式越多,攻擊面就越大。單個受損的應用程式很容易導致整個系統的崩潰。
為了解決這些問題,我們可以使用 Docker 容器進行軟體級別的沙箱操作:
-
容器內的應用程式對檔案的存取權限將受到限制。
-
容器化的應用程式看不到系統中運行的其他程序。
-
可以為容器分配特定數量的硬體資源。
-
容器的網路連接埠不會暴露到外部。
-
在本地/生產環境中對幾乎所有內容進行一致的打包。
為了進行演示,我們將在 Docker 容器中建立一個簡單的 Python 伺服器,將該容器轉換為映像檔,並在虛擬的生產環境中部署該映像檔。
步驟 1 – 檔案系統配置
要託管該專案,首先,我們將建立一個專用目錄:
|
1 |
mkdir -pv python-server-container/ |
|
1 |
cd !$ |
在該目錄中,建立一個子目錄 src 以儲存我們的程式碼:
|
1 |
mkdir -pv src/ |
步驟 2 – 建立 Python 伺服器
在此步驟中,我們將用 Python 建立一個簡單的 HTTP 伺服器。建立檔案 server.py:
|
1 |
touch server.py |
在文字編輯器中打開它:
|
1 |
nano server.py |

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()
|
1 2 3 4 5 6 7 8 9 10 11 |
httpserver .import HTTPServerSimpleHTTPRequestHandler, def runserver_class(HTTPServer=handler_class, SimpleHTTPRequestHandler= ): "server entrypoint""" "" server_address = ("0.0.0.0", 8080) httpdserver_class = server_address(handler_class, ) print"starting server..."( ) httpdserve_forever. () if __name__ "__main__" == : runHere,() |

在這裡,
-
我們正在使用 HTTPServer 類別,並從標準 Python 函式庫中請求一個處理常式,以保持程式簡單。
-
run 函式會初始化一個 HTTPserver.
-
實例。正如 server_address 的引數所暗示,伺服器將監聽連接埠 8080 上的任何傳入連線。
現在,我們將驗證伺服器是否按預期運作。啟動伺服器:
|
1 |
python3 server.py |
![]()
在新的終端機中,我們可以使用 curl 向伺服器發送請求:
|
1 |
curl -iv localhost:8080 |

或者,您可以在網頁瀏覽器中存取該連結:
|
1 |
http://localhost:8080 |
步驟 3 – 建立 Dockerfile
一個 Dockerfile 包含生成 Docker 映像檔所需的指令。檔案中的指令是按順序執行的。 深入了解 Dockerfile.
為我們的專案建立一個新的 Dockerfile:
|
1 |
touch Dockerfile |
現在,我們將在其中引入必要的程式碼。在文字編輯器中打開它:
|
1 |
nano Dockerfile |
輸入以下程式碼:
|
1 2 3 4 5 6 7 8 9 |
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 指令會複製來自 src 目錄的檔案,該目錄目前託管了 Python 伺服器。
-
變數 PYTHONBUFFERED=1 指定 Python 將直接輸出和記錄日誌到 STDOUT。否則,日誌將不會被傳送到任何緩衝區。
-
此 CMD 指令指定了執行容器時要執行的預設指令。在此案例中,我們使用該指令來啟動我們的 Python 伺服器。
步驟 4 – 產生 Docker 映像檔
在 Dockerfile 準備就緒後,我們現在可以建置映像檔。執行以下 Docker 指令來開始此程序:
|
1 |
docker build . -t python_server |

這裡,
-
此 -t 旗標用於將我們的 Docker 映像檔標記為 python_server.
-
Docker 將下載所有必要的元件並將它們合併為一個映像檔。
步驟 5 – 執行映像檔
映像檔已準備好進行部署。我們可以使用以下指令來執行它:
|
1 |
docker run -p 8080:8080 python_server |

這裡,我們將本機機器的連接埠 8080 轉發到 Docker 映像檔,使用的是 -p 旗標。
我們可以輕鬆地使用 驗證伺服器是否已啟動並執行curl:
|
1 |
curl -iv localhost:8080 |
步驟 6 – 終止伺服器
在終端機中,按下 “Ctrl + C” 來終止 Docker 程序:

步驟 7 – 匯出與匯入 Docker 映像檔
我們現在有一個託管 Python 伺服器的功能性 Docker 映像檔。藉助 Docker 的匯出和匯入功能,我們可以將其遷移到任何其他系統。
首先,檢查目前系統中的 Docker 映像檔列表:
|
1 |
docker images |

我們的目標是我們剛剛建立的 python_server Docker 映像檔。以下指令將其匯出為 TAR 封存檔:
|
1 |
docker save python_server:latest > python_server.tar |

將 python_server.tar 檔案傳輸到目標機器後,使用以下指令來匯入 Docker 映像檔:
|
1 |
docker load < python_server.tar |
結語
在本指南中,我們示範了如何從 Python 應用程式建置 Docker 映像檔。我們建立了一個簡單的 Python 網頁伺服器,並從中建置了一個 Docker 映像檔。該 Docker 映像檔現在可以部署在任何環境中,並預期獲得一致的行為。
有興趣了解更多關於 Docker 的資訊嗎?請參考以下指南:
祝您使用愉快!




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