註:本文最初於 2023 年 11 月 4 日發表於此處。它已在這裡重新發布,以覆蓋更廣泛的受眾。
歡迎閱讀系列中的第一篇文章,該文章將引導您完成將遺留應用程式從本地遷移到雲端的過程,重點關注現代化、無伺服器平台和整合 DevOps 實踐。
在本文中,我們將重點放在您的應用程式的容器化上。但是,如果您從頭開始建立應用程序,那就完全沒問題(事實上,甚至更好)。在此範例中,我使用此 DigitalOcean 指南來建立一個簡單的 TODO 應用程序,並使用 Python (Flask) 和 MongoDB 作為資料庫。我進行了一些自訂以使其看起來更好,但重點是建立使用基於 NoSQL 文件的資料庫的東西,因為這將是即將進行的工作所需要的。
如果您還沒有建立自己的應用程式儲存庫,可以在 GitHub 上克隆該應用程式的儲存庫。
建置完應用程式後,讓我們開始吧!
這是我們將容器化的應用程式目錄的結構,後面是 Dockerfile。
. ├── app.py ├── LICENSE ├── README.md ├── requirements.txt ├── static │ └── style.css └── templates └── index.html
app.py 檔案是包含 Flask 應用程式碼的主應用程式檔案。 requirements.txt 檔案包含應用程式所需的 Python 依賴項清單。 static/ 目錄包含靜態文件,例如 CSS、JavaScript 和圖片。 templates/ 目錄包含 Flask 應用程式所使用的 HTML 模板。
# Use a minimal base image FROM python:3.9.7-slim-buster AS base # Create a non-root user RUN useradd -m -s /bin/bash flaskuser USER flaskuser # Set the working directory WORKDIR /app # Copy the requirements file and install dependencies COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Add the directory containing the flask command to the PATH ENV PATH="/home/flaskuser/.local/bin:${PATH}" # Use a multi-stage build to minimize the size of the image FROM base AS final # Copy the app code COPY app.py . COPY templates templates/ COPY static static/ # Set environment variables ENV FLASK_APP=app.py ENV FLASK_ENV=production # Expose the port EXPOSE 5000 # Run the app CMD ["flask", "run", "--host=0.0.0.0"]
這是 Dockerfile 的演練與細分:
Dockerfile 以 FROM 指令開頭,該指令指定要使用的基礎映像。在本例中,它是 python:3.9.7-slim-buster,這是一個最小的基礎映像,其中包括 Python 3.9.7 和一些基本函式庫。
下一指令使用 RUN 和 useradd 指令建立一個名為 Flaskuser 的非 root 使用者。這是避免以 root 使用者身分執行容器的安全最佳實務。
WORKDIR 指令將工作目錄設定為 /app,這是應用程式程式碼將被複製的位置。
COPY 指令將requirements.txt 檔案複製到容器的/app 目錄。
RUN指令使用pip安裝requirements.txt中列出的依賴項。 --no-cache-dir 選項用於避免快取下載的包,這有助於保持較小的圖片大小。
ENV指令將包含flask指令的目錄加入PATH環境變數。這是稍後運行 Flask 命令所必需的。
FROM 指令使用先前定義的基礎鏡像啟動一個新的建置階段。這是一個多階段構建,有助於最小化最終圖像的大小。
COPY 指令將應用程式程式碼 (app.py)、範本 (templates/) 和靜態檔案 (static/) 複製到容器的 /app 目錄。
ENV 指令設定 FLASK_APP 和 FLASK_ENV 環境變數。 FLASK_APP 指定主應用程式檔案的名稱,FLASK_ENV 將環境設定為生產環境。
EXPOSE 指令公開連接埠 5000,這是 Flask 使用的預設連接埠。
CMD指令指定容器啟動時執行的命令。在這種情況下,它使用 --host=0.0.0.0 選項來執行 Flask run 命令來綁定到所有網路介面。
有了這個 Dockerfile,應用程式就可以被容器化並執行。但是,需要注意的是,我們的應用程式需要一個資料庫來儲存運行時創建或產生的資料。當然,您可以單獨拉取 MongoDB 資料庫鏡像並獨立運行。然後,在兩側進行調整,建立兩個容器之間的通信,以便應用程式能夠成功地將資料儲存到資料庫中。雖然這種方法有效,但可能會消耗時間並且有點乏味。為了簡化流程,我們將繼續使用 Docker Compose。在 Docker Compose 中,所有內容都在 YAML 檔案中聲明,透過使用 docker-compose up 命令,我們可以無縫地啟動和操作不同的服務,節省時間和精力。
這是基本的 Docker Compose YAML 文件,我們將使用它來簡化流程。
version: '3.9' services: db: image: mongo:4.4.14 ports: - "27017:27017" volumes: - mongo-data:/data/db web: build: . container_name: "myflaskapp" ports: - "5000:5000" environment: - MONGO_URI=mongodb://db:27017 depends_on: - db volumes: mongo-data:
此 Docker Compose YAML 檔案配置為設定兩個服務:MongoDB 資料庫 (db) 和 Web 應用程式 (web)。詳細介紹如下:
版本: 指定正在使用的 Docker Compose 檔案格式的版本(本例為 3.9)。
服務:
資料庫(db):
Web 應用程式 (web):
音量:
總之,這個 Docker Compose 檔案協調了 MongoDB 資料庫和 Flask Web 應用程式的部署,確保它們能夠無縫通訊和一起運行。
現在導航到包含 Docker Compose 檔案的目錄並執行 docker-compose up 以啟動 MongoDB 和 Flask Web 應用程式。透過 http://localhost:5000 存取應用程序,確保一切按預期工作。
要停止,請使用 docker-compose down。
一切都好嗎?接下來:下一篇文章將工作流程遷移到 Kubernetes。
以上是從傳統到雲端無伺服器 - 第 1 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!