首頁  >  文章  >  後端開發  >  從傳統到雲端無伺服器 - 第 1 部分

從傳統到雲端無伺服器 - 第 1 部分

WBOY
WBOY原創
2024-09-04 20:30:02736瀏覽

註:本文最初於 2023 年 11 月 4 日發表於此處。它已在這裡重新發布,以覆蓋更廣泛的受眾。

歡迎閱讀系列中的第一篇文章,該文章將引導您完成將遺留應用程式從本地遷移到雲端的過程,重點關注現代化、無伺服器平台和整合 DevOps 實踐。

在本文中,我們將重點放在您的應用程式的容器化上。但是,如果您從頭開始建立應用程序,那就完全沒問題(事實上,甚至更好)。在此範例中,我使用此 DigitalOcean 指南來建立一個簡單的 TODO 應用程序,並使用 Python (Flask) 和 MongoDB 作為資料庫。我進行了一些自訂以使其看起來更好,但重點是建立使用基於 NoSQL 文件的資料庫的東西,因為這將是即將進行的工作所需要的。

如果您還沒有建立自己的應用程式儲存庫,可以在 GitHub 上克隆該應用程式的儲存庫。

建置完應用程式後,讓我們開始吧!

Dockerfile

這是我們將容器化的應用程式目錄的結構,後面是 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 的演練與細分:

  1. Dockerfile 以 FROM 指令開頭,該指令指定要使用的基礎映像。在本例中,它是 python:3.9.7-slim-buster,這是一個最小的基礎映像,其中包括 Python 3.9.7 和一些基本函式庫。

  2. 下一指令使用 RUN 和 useradd 指令建立一個名為 Flaskuser 的非 root 使用者。這是避免以 root 使用者身分執行容器的安全最佳實務。

  3. WORKDIR 指令將工作目錄設定為 /app,這是應用程式程式碼將被複製的位置。

  4. COPY 指令將requirements.txt 檔案複製到容器的/app 目錄。

  5. RUN指令使用pip安裝requirements.txt中列出的依賴項。 --no-cache-dir 選項用於避免快取下載的包,這有助於保持較小的圖片大小。

  6. ENV指令將包含flask指令的目錄加入PATH環境變數。這是稍後運行 Flask 命令所必需的。

  7. FROM 指令使用先前定義的基礎鏡像啟動一個新的建置階段。這是一個多階段構建,有助於最小化最終圖像的大小。

  8. COPY 指令將應用程式程式碼 (app.py)、範本 (templates/) 和靜態檔案 (static/) 複製到容器的 /app 目錄。

  9. ENV 指令設定 FLASK_APP 和 FLASK_ENV 環境變數。 FLASK_APP 指定主應用程式檔案的名稱,FLASK_ENV 將環境設定為生產環境。

  10. EXPOSE 指令公開連接埠 5000,這是 Flask 使用的預設連接埠。

  11. CMD指令指定容器啟動時執行的命令。在這種情況下,它使用 --host=0.0.0.0 選項來執行 Flask run 命令來綁定到所有網路介面。

有了這個 Dockerfile,應用程式就可以被容器化並執行。但是,需要注意的是,我們的應用程式需要一個資料庫來儲存運行時創建或產生的資料。當然,您可以單獨拉取 MongoDB 資料庫鏡像並獨立運行。然後,在兩側進行調整,建立兩個容器之間的通信,以便應用程式能夠成功地將資料儲存到資料庫中。雖然這種方法有效,但可能會消耗時間並且有點乏味。為了簡化流程,我們將繼續使用 Docker Compose。在 Docker Compose 中,所有內容都在 YAML 檔案中聲明,透過使用 docker-compose up 命令,我們可以無縫地啟動和操作不同的服務,節省時間和精力。

使用 Docker Compose 簡化資料庫集成

這是基本的 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):

      • 使用 MongoDB 版本 4.4.14 鏡像。
      • 將主機連接埠 27017 對應到容器連接埠 27017。
      • 利用名為 mongo-data 的磁碟區來持久儲存 MongoDB 資料。
    • Web 應用程式 (web):

      • 從目前目錄 (.) 建立 Docker 映像。
      • 將容器名稱設定為「myflaskapp」。
      • 將主機連接埠 5000 對應到容器連接埠 5000。
      • 定義環境變數 MONGO_URI,值為 mongodb://db:27017,建立與 MongoDB 服務的連線。
      • 指定對 db 服務的依賴,確保資料庫在 Web 服務之前啟動。
  • 音量:

    • 定義一個名為 mongo-data 的磁碟區來保存 MongoDB 資料。

總之,這個 Docker Compose 檔案協調了 MongoDB 資料庫和 Flask Web 應用程式的部署,確保它們能夠無縫通訊和一起運行。

現在導航到包含 Docker Compose 檔案的目錄並執行 docker-compose up 以啟動 MongoDB 和 Flask Web 應用程式。透過 http://localhost:5000 存取應用程序,確保一切按預期工作。

From legacy to cloud serverless - Part 1

要停止,請使用 docker-compose down。

一切都好嗎?接下來:下一篇文章將工作流程遷移到 Kubernetes。

From legacy to cloud serverless - Part 1

以上是從傳統到雲端無伺服器 - 第 1 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn