发布于 2026-01-06 1 阅读
0

如何使用 Docker 在 AWS 上部署应用 步骤 1 - 创建 Docker 仓库 步骤 2 - 编写自动化脚本 步骤 3 - 创建任务定义 步骤 4 - 创建集群 步骤 5 - 创建服务 步骤 6 - 使用新更改重新部署应用。DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

如何使用 Docker 在 AWS 上部署应用程序

步骤 1 - Docker 仓库

步骤 2 - 自动脚本

步骤 3 - 创建任务定义

步骤 4 - 创建集群

步骤 5 - 创建服务

步骤 6 - 使用新更改重新部署您的应用程序。

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

我将解释如何使用 Fargate 实例在 AWS 中部署 Docker 化应用程序,EC2 实例的部署过程应该非常相似,因此本指南也适用于您。


在之前的文章中,我解释了如何将 NestJs 应用程序 Docker 化,在本指南中,我将使用相同的代码库来创建将在 AWS 中部署的 Docker 镜像。

为了方便您进行以下步骤,我假设您已具备以下条件:

  1. 用于构建镜像的 Docker 脚本。
  2. 已在您的机器上配置AWS CLI 。
  3. 具备AWS和Docker的基本知识。

步骤 1 - Docker 仓库

您需要在 AWS 账户中创建一个 Docker 仓库,可以通过执行以下命令完成:

aws ecr create-repository --repository-name=<YOUR_REPOSITORY_NAME>

创建存储库后,请登录Elastic Container Service -> Amazon ECR -> Repositories您的 AWS 账户。找到您新建的存储库并点击它。存储库打开后,点击按钮View push commands。您将看到类似这样的界面:

查看推送命令

请复制所有这些命令,因为稍后您将需要它们来构建、推送和部署您的应用程序。

为了避免每次构建应用程序时都复制这些命令,我​​们可以在代码中创建一些脚本package.json来自动化这个过程。

如果您不打算部署 JS 应用程序,则可以使用 shell 脚本或其他您觉得顺手的工具。


步骤 2 - 自动脚本

为了方便起见,我们将在package.json文件中设置以下脚本:

...
"aws:login": "aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin <ID>.dkr.ecr.us-west-2.amazonaws.com/nestjs",
"docker:build": "docker build -t nestjs .",
"docker:tag": "docker tag nestjs:latest <ID>.dkr.ecr.us-west-2.amazonaws.com/nestjs:latest",
"docker:push": "docker push <ID>.dkr.ecr.us-west-2.amazonaws.com/nestjs:latest",
...

请记住将所有这些命令替换为您从存储库中复制的命令。

让我解释一下这些命令各自的作用:

  1. aws:login- 已执行登录命令,以便您可以使用 AWS CLI 正确进行身份验证。
  2. docker:build- 使用本地脚本构建 Docker 镜像Docker
  3. docker:tag- 使用您从存储库复制的名称为新创建的图像添加标签。
  4. docker:push- 将镜像推送到 AWS 服务器。

我还会添加一个新脚本,按顺序执行之前的所有命令(是的,我有点懒,我不想每次构建镜像时都输入所有这些命令)。

...
"aws:build": "npm run aws:login && npm run docker:build && npm run docker:tag && npm run docker:push",
...

现在,如果您运行该aws:build命令(npm run aws:build),您将构建、标记您的 Docker 镜像并将其推送到您的 AWS 账户。我们将在后续步骤中使用它来部署您的应用程序。执行该命令后,我的存储库如下所示:

存储库图像


步骤 3 - 创建任务定义

在创建任务定义之前,请确保您拥有具有AmazonECSTaskExecutionRolePolicy的角色

现在,您需要创建一个任务定义,稍后服务将使用该定义来创建 Docker 镜像的实例。要创建任务定义,请转到 [此处应填写路径] Elastic Container Service -> Amazon ECS -> Task Definitions,然后单击Create new Task Definition按钮并按照以下步骤操作:

  • 选择启动类型兼容性 - Fargate。

任务定义类型

  • 设置任务名称和执行角色。

创建任务

  • 设置任务大小(这将根据您的需要而改变)。

任务规模

  • 创建任务容器(为了本指南的目的,我不会深入介绍您可以在此处指定的每个选项,现在我将保持简单)。

在“图像”字段中,您需要指定存储库的 URL。

任务容器

  • 保存任务。

步骤 4 - 创建集群

在此步骤中,您将创建用于创建部署应用程序所需服务的集群。

  • 选择“仅网络”集群,因为我们将创建 Fargate 实例。

创建集群

  • 设置集群名称,选中“创建 VPC”复选框并保存。

集群名称


步骤 5 - 创建服务

转到您最近创建的集群中的“服务”选项卡,然后单击Create按钮。

  • 将服务类型设置为 Fargate,任务定义和集群设置为您创建的那些,服务名称通常会添加-service后缀以便于识别。在本例中,我们将实例数设置为 1(具体数量取决于您的需求)。

Fargate 服务

  • 将 VPC 值设置为集群创建时使用的 VPC,并设置服务可用的子网,同时将“自动分配公有 IP”属性设置为“启用”。其余字段可以保留默认值,然后单击按钮Next step

服务创建

  • 对于自动缩放选项,请保留默认值并单击Next step按钮。

  • 点击Create Service并等待服务创建完成。

现在你已经创建了服务,让我们来检查一下已部署的应用。首先,你需要找到由你的服务创建的任务。

服务任务

您可以在这里找到实例的公网 IP 地址。直接在浏览器中输入该 IP 地址即可找到正在运行的应用程序。

服务任务 IP

运行应用程序

运行应用程序

注意:如果您的应用未在指定端口上运行,80则需要在您的服务使用的安全组中打开容器暴露的端口,这可以在安全组的入站规则中完成。

太棒了!!你成功了!!现在你的应用已经在AWS的Fargate容器中运行了,但是,如果我们需要对应用进行一些更改怎么办?我们该如何更新Docker镜像并重新部署新的更改呢?我将在下一步中讨论这个问题。


步骤 6 - 使用新更改重新部署您的应用程序。

假设我们的应用程序新增了一个功能需求,我们需要将这些更改推送到 Fargate 容器中,为此我们需要遵循以下几个步骤:

  1. 使用新更改构建 Docker 镜像。
  2. 给Docker镜像添加标签。
  3. 推送 Docker 镜像。
  4. 部署包含新更改的容器。

前 3 个步骤我们已经在之前创建的脚本中完成了,现在只需要最后一个脚本。

"aws:deploy": "aws ecs update-service --cluster test-cluster --service nestjs-service --force-new-deployment --region=<YOUR_REGION>",

此命令将强制您的服务使用 Docker 镜像中的最新更改重新创建。对您的应用程序进行新更改后,您可以运行以下命令:

npm run aws:build && npm run aws:deploy

此命令将构建、标记、推送并使用最新更改重新创建容器。

您可以在这里找到本指南的源代码

文章来源:https://dev.to/edgargonzalez525/how-to-deploy-your-app-on-aws-with-docker-1gfp