首頁 後端開發 Python教學 從傳統到雲端無伺服器 - 第 1 部分

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

Sep 04, 2024 pm 08:30 PM

註:本文最初於 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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1419
52
Laravel 教程
1313
25
PHP教程
1262
29
C# 教程
1235
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

您可以在2小時內學到多少python? 您可以在2小時內學到多少python? Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:探索其主要應用程序 Python:探索其主要應用程序 Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

See all articles