如何使用 Amazon Lightsail 容器为 Flask 应用程序提供服务

简介

Amazon Lightsail 是一款易于使用的虚拟专用服务器,它提供容器服务。您可以按照本教程学习如何使用 Lightsail 容器服务为 Flask 应用程序提供服务。

在本教程中,您将创建一个 Flask 应用程序,构建一个 Docker 容器,在 Lightsail 上创建一个容器服务,然后部署该应用程序。 

开始免费使用 Amazon Lightsail。 

概述

在本教程中,您将在您的本地计算机上设置一个 Docker 容器,在 Amazon Lightsail 服务中设置一个容器,然后启动“Hello, World!”应用程序。

前提条件

开始本教程之前,您需要先满足以下条件:

  • AWS 账户:如果您还没有 AWS 账户,请遵循设置环境入门指南中的说明获取快速概览。
  • 已正确配置 AWS 命令行界面 (CLI):有关如何设置 AWS CLI 的详细信息,请参阅 AWS CLI 文档。请确保使用最新版本的 AWS CLI,即 AWS CLI v2。最后,请确保默认设置了一个区域,否则您需要在发出 Lightsail 部署命令时指定区域。
  • 已在本地计算机上安装 Docker
  • 已安装和配置 Amazon Lightsail Control (lightsailctl) 插件:有关如何安装 Lightsail Control 的详细信息,请参阅 Lightsail Control 文档

 AWS 使用经验

中级

 完成时间

30 分钟

  所需费用

可通过 Free Tier 免费试用。有关更多详细信息,请参见 Lightsail 定价页面。

 前提条件

有效的 AWS 账户
AWS CLI
Amazon Lightsail Control
Docker

 使用的服务

Amazon Lightsail

 上次更新时间

2023 年 10 月 17 日

操作步骤

步骤 1:创建 Flask 应用程序

在运行 Docker 的本地计算机上完成以下步骤。这些步骤将引导您完成创建 Flask 应用程序文件的过程。

步骤 1a:在本地计算机的命令行中,创建一个新的项目目录并切换到该目录。

mkdir lightsail-containers-flask
cd lightsail-containers-flask

步骤 1b:使用以下代码创建一个名为 app.py 的新文件:  

这个最小的 Flask 应用程序包含一个 hello_world 函数,当请求路由“/”时会触发该函数。此应用程序在运行时会绑定到系统上的所有 IP (0.0.0.0) 并监听端口 5000(默认 Flask 端口)。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return "Hello, World!"

if __name__ == "__main__":
   app.run(host='0.0.0.0', port=5000)

步骤 1c:创建一个名为 requirements.txt 的新文件。编辑该文件并添加以下代码。然后保存该文件。

requirements.txt 文件用于指定此应用程序所需的 Python 软件包。这个最小的 Flask 应用程序仅需要一个软件包,即 Flask。

flask===3.0.0

步骤 1d:创建一个名为 Dockerfile 的新文件。编辑该文件并向其中添加以下代码。保存该文件。

Python alpine 镜像可确保生成的容器尽可能小巧紧凑。容器启动时运行的命令与从命令行运行的命令相同:python app.py

# Set base image (host OS)
FROM python:3.12-alpine

# By default, listen on port 5000
EXPOSE 5000/tcp

# Set the working directory in the container
WORKDIR /app

# Copy the dependencies file to the working directory
COPY requirements.txt .

# Install any dependencies
RUN pip install -r requirements.txt

# Copy the content of the local src directory to the working directory
COPY app.py .

# Specify the command to run on container start
CMD [ "python", "./app.py" ]

步骤 1e:此时,您的目录应包含以下文件:

$ tree
.

├── app.py
├── Dockerfile
└── requirements.txt

0 directories, 3 files

步骤 2:构建容器镜像

步骤 2a:使用 Docker 构建容器。从 Dockerfile 所在的同一目录使用以下命令:

此命令使用 Dockerfile 在当前目录下构建一个容器,并将该容器标记为“flask-container”。

docker build -t flask-container .

步骤 2b:容器构建完成后,通过运行容器在本地测试 Flask 应用程序。

docker run -p 5000:5000 flask-container

步骤 2c:Flask 应用程序将在容器中运行,并且将通过端口 5000 向您的本地系统公开数据。浏览到 http://localhost:5000 或从命令行使用 curl,您将看到“Hello, World!”。

$ curl localhost:5000

Hello, World!

步骤 3:创建容器服务

通过完成以下步骤,使用 AWS CLI 创建 Lightsail 容器服务,然后使用 Lightsail Control (lightsailctl) 插件将本地容器镜像推送到新容器服务。

步骤 3a:使用 create-container-service 命令创建 Lightsail 容器服务。

power 和 scale 参数用于指定容器服务的容量。对于最小的 Flask 应用程序,需要的容量很小。

create-container-service 命令的输出结果表明新服务的状态为 PENDING。如第二个代码块所示。 

aws lightsail create-container-service --service-name flask-service --power small --scale 1

步骤 3b:使用 get-container-services 命令监控创建中的容器的状态。

待容器服务的状态更改为 READY 后,再继续执行下一步。您的容器服务应当在几分钟后就会变为 READY 状态。

aws lightsail get-container-services

Output:

{
    "containerService": {
        "containerServiceName": "flask-service",
         ...
        "state": "PENDING",

Output:

{
    "containerService": {
        "containerServiceName": "flask-service",
         ...
        "state": "READY",

步骤 3c:使用 push-container-image 命令将应用程序容器推送到 Lightsail。 

注意:“:flask-service.flask-container.X”中的 X 为一个数值。如果这是您首次将镜像推送到容器服务,则此数值为 1。在下一步中将需要此数值。

aws lightsail push-container-image --service-name flask-service --label flask-container --image flask-container

Image "flask-container" registered.
...Refer to this image as ":flask-service.flask-container.X" in deployments.

步骤 4:部署容器

通过完成以下步骤,创建用于部署和公共端点配置的 JSON 文件,然后将容器镜像部署到容器服务。

步骤 4a:创建一个名为 containers.json 的新文件。编辑该文件并添加以下代码。 

将 :flask-service.flask-container.X 中的 X 替换为上一步中的数值。 保存该文件。

containers.json 文件用于描述将在容器服务上启动的容器的设置。在此实例中,containers.json 文件描述 Flask 容器以及它将使用的镜像和公开数据的端口。

{
    "flask": {
        "image": ":flask-service.flask-container.X",
        "ports": {
            "5000": "HTTP"
        }
    }
}

步骤 4b:创建一个名为 public-endpoint.json 的新文件。

编辑该文件并添加以下代码。

保存该文件。

public-endpoint.json 文件用于描述容器服务的公共端点的设置。在此实例中,public-endpoint.json 文件表明 Flask 容器将通过端口 5000 公开数据。只有要进行公共访问的服务才需要设置公共端点。

在创建 containers.json 和 public-endpoint.json files 之后,项目目录应包含以下文件:

  • app.py
  • containers.json
  • Dockerfile
  • public-endpoint.json
  • requirements.txt
{
    "containerName": "flask",
    "containerPort": 5000
}

步骤 4c:在 AWS CLI 中,使用 create-container-service-deployment 命令将容器部署到容器服务。

create-container-servicedeployment 命令的输出结果表明容器服务的状态现在为 DEPLOYING,如下所示。

aws lightsail create-container-service-deployment --service-name flask-service --containers file://containers.json --public-endpoint file://public-endpoint.json

Output:

{
    "containerServices": [{
        "containerServiceName": "flask-service",
         ...
        "state": "DEPLOYING",

步骤 4d:使用 get-container-services 命令监控容器的状态,待状态更改为 RUNNING 后再继续执行下一步。

get-container-service 命令还会返回容器服务的端点 URL。

待容器服务的状态更改为 RUNNING(通常需要几分钟时间)后,通过浏览器前往此 URL,以验证容器服务是否正常运行。和之前一样,您的浏览器输出结果应当显示“Hello, World!”。

aws lightsail get-container-services --service-name flask-service

Output:

{
    "containerServices": [{
        "containerServiceName": "flask-service",
         ...
        "state": "RUNNING",
         ...        "url": "https://flask-service...

恭喜您!您已使用 Amazon Lightsail 容器成功部署了容器化 Flask 应用程序。

步骤 5:清除资源

通过完成以下步骤来清除在学习本教程的过程中创建的 Lightsail 容器服务。

步骤 5a:若要清除和删除 Lightsail 资源,请使用 delete-container-service 命令。

delete-container-service 会删除容器服务、任何关联的容器部署以及容器镜像。

aws lightsail delete-container-service --service-name flask-service

步骤 5b:使用 get-container-services 命令确认没有正在运行的容器。

aws lightsail get-container-services

Output:

{
    "containerServices": []
}

结论

恭喜您!您已使用 Amazon Lightsail 容器成功部署了容器化 Flask 应用程序。


Amazon Lightsail 是开发、构建和部署各种应用程序(如 WordPress、网站和博客平台)的绝佳选择。

后续步骤

您可以按照下面的后续步骤继续您的 AWS 之旅。

此页内容对您是否有帮助?