如何在AWS Lambda中运行Docker容器
虽然容器相当轻量级并提供各种好处,但决定如何最好地部署它们可能具有挑战性。部署和运行Docker容器有多种方式。但有些方法最适合编排和管理容器,可能不适合仅运行单个容器的简单用例。
在本文中,我将教你如何使用AWS上一个名为Lambda的服务器less服务来部署单个Docker容器。
目录
- 前提条件/要求
- 使用AWS Lambda实现服务器less
- 如何在本地构建、运行和测试容器
- 如何将镜像推送到Amazon Elastic Container Registry (ECR)
- 如何将Docker镜像部署到Lambda
- 清理工作
- 结论
前提条件/要求
遵循本教程需要以下工具和技能:
- 了解Docker,并在本地安装Docker。
- 一个具有管理员权限的AWS账户,用于通过CLI进行API调用。最佳实践是将权限限制为仅执行所需操作。
- 本地安装AWS CLI
- Python虚拟环境管理器,如uv(可选)
使用AWS Lambda实现服务器less
容器提供了一种轻量级、一致且资源友好的运行应用程序的方式。服务器less消除了管理容器运行的底层基础设施的开销。因此,正如你可能开始看到的,结合这些工具可以帮助你部署应用程序,让你专注于业务逻辑、性能以及赋予产品竞争优势的方面。
AWS上一个让你实现服务器less的工具是Lambda。使用Lambda时,你只需为函数中代码运行的次数、配置服务时选择的内存大小以及每次函数调用的持续时间付费。
除了消除操作开销外,Lambda还可以帮助你节省资金,因为你无需处理闲置资源。该函数仅在收到发送给它的请求触发时才启动。
如何在本地构建、运行和测试容器
Docker是一个工具,可以帮助你将应用程序或软件打包成可移植、标准化和可共享的单元,这些单元拥有应用程序运行所需的一切,例如库、运行时、系统工具、应用程序代码。这些单元被称为容器。
在本节中,我将引导你完成构建Docker镜像、运行容器以及在运行后对其进行测试的过程。
你可以在此GitHub仓库中找到将使用的项目。
构建Docker镜像
要运行Docker容器,首先需要构建一个镜像。镜像成为创建容器或类实例的模板或类。
你可以在lambda_function.py中找到构建镜像的代码。
|
|
从上面的代码可以看出,这是一个非常基础的Python应用程序,期望一个POST HTTP请求,其中包含一个JSON负载,该负载包含键name及其对应的值。然后代码返回一个包含接收到的名字的问候语。该应用程序只有一个函数,该函数也作为其入口点。
要构建Docker镜像,你需要一个Dockerfile来提供镜像的蓝图。对于这个特定情况,你将使用的Dockerfile也非常基础。Dockerfile中的每一行称为一个指令,这提供了Docker在创建镜像时应遵循的说明。因此,构建Docker镜像意味着通过遵循Dockerfile中的指令或指示来为容器创建模板。
|
|
Dockerfile通常以基础镜像开始。要在AWS Lambda中将应用程序部署为Docker容器,基础镜像必须是特定类型的,具体取决于应用程序的运行时。对于这种情况,你需要Python运行时,所以基础镜像是public.ecr.aws/lambda/python:3.12。使用不同的Python版本也可以。
Dockerfile中的下一个指令是将lambda_function.py文件复制到基础镜像中的特定路径。该路径使用一个环境变量引用,该变量已在基础镜像中定义并指向/var/task。这是你的代码将运行的目录。
最后一个指令只是一个在容器运行时启动应用程序的命令。
现在,你可以从项目的根目录运行构建命令:
|
|
运行Docker容器
接下来,让我们从此镜像创建一个运行中的容器。
|
|
上面的命令将创建一个容器并以交互模式运行它,以便你可以查看容器中应用程序生成的日志。端口8080也在运行容器的主机上公开,并映射到容器端口,该端口也是8080(由AWS定义)。一旦你用CTRL + C终止运行进程,容器将自动移除。
测试运行中的容器
现在确认在容器内运行的应用程序可以接收和处理请求。为此,使用test.py文件中的代码:
|
|
你可以使用Python的requests库来进行此调用。通过使用虚拟环境将应用程序与整个系统隔离来安装该库。这有助于防止应用程序使用的库版本冲突问题。
如果你使用uv来管理虚拟环境,只需运行命令:
|
|
然后从虚拟环境中运行test.py中的代码:
|
|
你应该在终端上看到期望的响应。
如何将镜像推送到Amazon Elastic Container Registry (ECR)
现在你有一个可工作的Docker镜像要部署到Lambda,下一步是将镜像推送到Docker仓库。对于这个用例,你的镜像必须推送到Amazon ECR,这是一个用于存储Docker镜像的容器仓库。
要推送你的Docker镜像,首先需要给镜像打标签,这只是以一种特定的方式命名镜像。
目前,这个镜像标签是lambda-docker:1.0.0。要按AWS的方式标记它,首先创建一个ECR仓库。让我们为此使用AWS CLI(这要求你通过在本地运行aws configure命令并提供你的凭证来配置AWS凭证)。
设置环境变量
|
|
上述命令设置CLI的AWS_PROFILE以针对正确的AWS账户进行API调用。其他变量指定区域、账户ID以及ECR仓库名称和标签。
创建ECR仓库并进行身份验证
现在,创建ECR仓库:
|
|
验证到Amazon ECR:
|
|
标记并推送Docker镜像
现在,标记Docker镜像:
|
|
将镜像推送到你创建的ECR仓库:
|
|
就是这样!你的镜像现在在ECR中。
如何将Docker镜像部署到Lambda
既然你的镜像现在在ECR中,你可以创建一个Lambda函数。导航到Lambda控制台,然后单击“创建函数”。
选择“容器镜像”并继续搜索你创建的ECR仓库。
接下来,选择镜像:
其他配置保持默认,然后单击“创建”。
创建后导航到该函数。
测试部署
现在,让我们测试部署。为此,只需使用现有的Lambda“测试”选项卡。提供所有必需的详细信息,包括POST请求的负载。
就是这样。你已成功利用ECR和Lambda在AWS上部署了一个Docker容器。你可以更进一步,集成API Gateway并使该函数可从互联网访问。
清理工作
请记住删除你在AWS ECR仓库和Lambda上创建的服务,以避免额外费用。
结论
将Docker容器部署到AWS Lambda是一种高效的方式,可以快速让你的应用程序运行,而无需为管理服务器或平台而烦恼。
感谢阅读!