目錄

Flask 大教程,第十九部分:在 Docker 容器上部署

這是 Flask 大教程系列的第十九篇文章,在這篇文章中,我將會將 Microblog 部署到 Docker 容器平台上。

在第十七章,你學到了傳統部署的方法,這種方法需要你自己處理伺服器配置的每一個細節。然後在第十八章中,我引導你了解到另一個極端,我介紹了 Heroku 這個服務,它完全控制了配置和部署任務,讓你可以完全專注於你的應用程式。在這一章,你將學習到基於容器的第三種應用程式部署策略,特別是基於 Docker 容器平台。這第三個選項在部署工作所需的努力上介於其他兩者之間。

容器建立在一種輕量級虛擬化技術之上,允許應用程式連同其依賴和配置在完全隔離的環境中運行,但不需要使用如虛擬機這樣的完整虛擬化解決方案,這會需要更多資源並有時會與主機相比有顯著的性能下降。配置為容器主機的系統可以執行許多容器,所有這些容器都共享主機的核心和直接訪問主機的硬體。這與虛擬機形成對比,虛擬機需要模擬完整的系統,包括 CPU、硬盤、其他硬體、核心等。

儘管需要共享核心,容器中的隔離程度相當高。一個容器有其自己的檔案系統,並可以基於與容器主機使用的作業系統不同的作業系統。例如,你可以在 Fedora 主機上運行基於 Ubuntu Linux 的容器,反之亦然。雖然容器是 Linux 作業系統的原生技術,但得益於虛擬化,也可以在 Windows 和 macOS 主機上運行 Linux 容器。這允許你在開發系統上測試你的部署,並且如果你願意,也可以將容器納入你的開發工作流程。

安裝 Docker

雖然 Docker 不是唯一的容器平台,但它是迄今為止最受歡迎的,所以這將是我的選擇。

要使用 Docker,你首先需要在你的系統上安裝它。Docker 網站提供了 Windows、macOS 和幾個 Linux 發行版的安裝程式。到目前為止,在你的電腦上設置 Docker 最簡單的方法是使用你的作業系統的 Docker Desktop 安裝程式。如果你在 Microsoft Windows 系統上工作,重要的是要注意 Docker 需要 Hyper-V。如果需要,安裝程式將為你啟動這一功能,但請記住,啟動 Hyper-V 可能會阻止其他虛擬化技術如 VirtualBox 的工作。

一旦在你的系統上安裝了 Docker Desktop,你可以通過在終端視

窗或命令提示符上輸入以下命令來驗證安裝是否成功:

1
$ docker version

建立容器映像

為 Microblog 建立容器的第一步是為它建立一個映像。容器映像是用來建立容器的模板。它包含了容器檔案系統的完整表示,以及關於網絡、啟動選項等的各種設置。

最基本的建立應用程式容器映像的方式是啟動一個你想要使用的基本作業系統(如 Ubuntu、Fedora 等)的容器,連接到在其中運行的 bash shell 程序,然後手動安裝你的應用程式,也許遵循我在第十七章為傳統部署提供的指南。安裝完所有東西後,你可以對容器進行快照,那就成了映像。這種工作流程支持使用 docker 命令,但我不打算討論它,因為每次需要生成新映像時都要手動安裝應用程式並不方便。

更好的方法是通過腳本生成容器映像。建立腳本化容器映像的命令是 docker build。這個命令從一個稱為 Dockerfile 的檔案中讀取並執行建構指令,我將需要建立這個檔案。Dockerfile 基本上是一個安裝程式腳本,執行安裝步驟來部署應用程式,加上一些特定於容器的設置。

這裡是一個為 Microblog 準備的基本 Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM python:slim

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
RUN pip install gunicorn

COPY app app
COPY migrations migrations
COPY microblog.py config.py boot.sh ./
RUN chmod a+x boot.sh

ENV FLASK_APP microblog.py
RUN flask translate compile

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]

Dockerfile 中的每一行都是一個命令。FROM 命令指定了新映像將建立在哪個基本容器映像之上。思路是從一個現有的映像開始,添加或更改一些東西,最終得到一個衍生的映像。映像通過名稱和標籤來引用,用冒號分隔。標籤用作版本控制機制,允許容器映像提供多於一個變體。我選擇的映像名稱是 python,這是 Python 的官方 Docker 映像。標籤允許你指定解釋器版本和基本作業系統。slim 標籤選擇了只包含運行 Python 解釋器所需最小套件的容器映像。你可以在 Python 映像庫中看到 Python 的其他可用標籤。

啟動容器

已經建立了映像,你現在可以運行應用程式的容器版本了。這是用 docker run 命令完成的,該命令接受一長串參數。我將從顯示一個基本示例開始:

1
$ docker run --name microblog -d -p 8000:5000 --rm microblog:latest

如果

你想查看哪些容器正在運行,你可以使用 docker ps 命令:

1
$ docker ps

如果現在你想停止容器,你可以使用 docker stop 並傳遞容器 ID 或者是用 –name 選項給它的名字:

1
$ docker stop microblog

使用第三方「容器化」服務

Microblog 的容器版本看起來不錯,但我還沒有真正考慮過儲存問題。實際上,由於我沒有設定 DATABASE_URL 環境變數,應用程式正在使用預設的 SQLite 資料庫,這由磁碟上的一個檔案支持。當你停止並刪除容器時,你認為那個 SQLite 檔案會發生什麼?檔案會消失!

容器中的檔案系統是短暫的,意味著當容器消失時,它也會消失。你可以向檔案系統寫入資料,如果容器需要讀取它,資料就會在那裡,但如果由於任何原因你需要回收你的容器並用一個新的替換它,任何應用程式儲存到磁碟上的資料都將永遠丟失。

部署容器化應用程式

關於在 Docker 容器中運行你的應用程式的最好事情之一是,一旦你在本地測試了容器,你就可以將它們帶到任何提供 Docker 支持的平台。例如,你可以使用我在第十七章推薦的 Digital Ocean、Linode 或 Amazon Lightsail 的相同伺服器。即使是這些提供商中最便宜的產品也足以運行 Docker 和少數幾個容器。

Amazon 容器服務(ECS)為你提供了在完全集成的 AWS 環境中建立容器主機集群並在其上運行容器的能力,支持擴展和負載平衡,還有使用私有容器註冊表為你的容器映像的選項。

最後,如 Kubernetes 這樣的容器編排平台提供了更高層次的自動化和便利,通過允許你以 YAML 格式的文本檔案描述你的多容器部署,具有負載平衡、擴展、安全管理秘密以及滾動升級和回滾的功能。

繼續到下一章。

評論