在 Amazon Lightsail 上部署容器化 Web 应用程序

教程

模块 3:部署容器

在本模块中,我们将学习如何将容器部署到云端

概述

Amazon Lightsail 容器服务准备就绪后,下一步就是部署容器。

Amazon Lightsail 可以根据 Docker Hub、Amazon ECR Public Gallery 或本地计算机等公共容器镜像库中的镜像部署容器。

在本教程实验中,我们将直接从本地计算机推送容器镜像,然后进行部署。

学习目标

在本模块中,您将:

  • 将本地容器镜像推送到 Amazon Lightsail
  • 在容器服务上部署容器镜像版本

 时长

10 分钟

 模块学习前期准备

  • 具有管理员级别访问权限的 AWS 账户*
  • 推荐的浏览器:最新版本的 Chrome 或 Firefox

*在过去 24 小时内新创建的账户可能无法使用本教程所需的服务。

操作步骤

推送本地容器镜像

部署容器的第一步是将容器镜像推送到 Amazon Lightsail。

打开终端,在创建了容器的目录下,运行以下命令。请务必确认命令中指定的区域为创建 Lightsail 容器服务的那个区域。

aws lightsail push-container-image --region eu-west-3 --service-name signup-application --label latest --image demo-flask-signup:latest

该命令输出如下类似结果:

# aws lightsail push-container-image --region eu-west-3 --service-name signup-application --label latest --image demo-flask-signup:latest

f017a6ddb209: Pushed 
b94dee417b5e: Pushed 
37d77b23a488: Pushed 
8e77a3b871e7: Pushed 
4bc5d67b6427: Pushed 
ce8ffb5c560e: Pushed 
4226d5d0360f: Pushed 
9d1af766c818: Pushed 
d97733c0a3b6: Pushed 
c553c6ba5f13: Pushed 
48b4a40de359: Pushed 
ace9ed9bcfaf: Pushed 
764055ebc9a7: Pushed 
Digest: sha256:128f84907d30a1fb47c1888720485fa8050cc99bc1034e0cfd1f46d3b6e57e19
Image "demo-flask-signup:latest" registered.
Refer to this image as ":signup-application.latest.1" in deployments.   

该命令会调用 docker push 将镜像上传到 Amazon Lightsail。这可能需要几分钟才能完成,具体取决于您的网络带宽。

输出中的最后一行是容器的内部名称;在我们这个示例中,这个容器名称为 :signup-application.latest.1。请记下这个名称,因为我们在将容器部署到容器服务上时会用到该名称。在后续阶段,如果要查看该容器名称,可以运行以下命令:

aws lightsail get-container-images --region eu-west-3 --service-name signup-application

该命令输出如下类似结果:

# aws lightsail get-container-images --region eu-west-3 --service-name signup-application

{
    "containerImages": [
        {
            "image": ":signup-application.latest.1",
            "digest": "sha256:128f84907d30a1fb47c1888720485fa8050cc99bc1034e0cfd1f46d3b6e57e19",
            "createdAt": "2024-03-13T14:20:08-04:00"
        }
    ]

将本地容器镜像推送到 Lightsail

完成之后,容器镜像就存储在 Amazon Lightsail 上了,我们就可以将该镜像部署到容器服务中。

Lightsail 需要以下信息才能创建部署:

  • 要部署的容器镜像的名称,即推送容器镜像命令返回的名称,本示例中为 :signup-application.latest.1
  • 容器公开的网络端口。在 Dockerfile 中查看该端口号。
  • (可选)可公开访问的网络端点的详细信息:TCP 端口号和协议;自动分配的 IP 地址。

所有这些信息都需要存储在一个 JSON 文件中。您需要在部署前创建该文件。

创建一个名为 lc.json 的 JSON 文件。如果您使用的是下载的代码,则需要修改与容器位于同一目录下的 lc.json 文件。将以下 JSON 内容复制到该文件中:

{
    "serviceName": "signup-application",
    "containers": {
        "signup-app-container": {
            "image": ":signup-application.latest.1",
            "ports": {
                "80": "HTTP"
            }
        }
    },
    "publicEndpoint": {
        "containerName": "signup-app-container",
        "containerPort": 80
    }
}

然后,运行以下命令来部署容器:

aws lightsail create-container-service-deployment --region eu-west-3 --cli-input-json file://lc.json

该命令输出如下类似结果:

# aws lightsail create-container-service-deployment --region eu-west-3 --cli-input-json file://lc.json

{
    "containerService": {
        "containerServiceName": "signup-application",
        "arn": "arn:aws:lightsail:eu-west-3:012345678901:ContainerService/528a0bcf-fd14-42d4-a09a-943a241adc51",
        "createdAt": "2024-03-15T11:43:10-04:00",
        "location": {
            "availabilityZone": "all",
            "regionName": "eu-west-3"
        },
        "resourceType": "ContainerService",
        "tags": [],
        "power": "nano",
        "powerId": "nano-1",
        "state": "DEPLOYING",
        "scale": 2,
        "nextDeployment": {
            "version": 1,
            "state": "ACTIVATING",
            "containers": {
                "signup-app-container": {
                    "image": ":signup-application.latest.1",
                    "command": [],
                    "environment": {},
                    "ports": {
                        "80": "HTTP"
                    }
                }
            },
            "publicEndpoint": {
                "containerName": "signup-app-container",
                "containerPort": 80,
                "healthCheck": {
                    "healthyThreshold": 2,
                    "unhealthyThreshold": 2,
                    "timeoutSeconds": 2,
                    "intervalSeconds": 5,
                    "path": "/",
                    "successCodes": "200-499"
                }
            },
            "createdAt": "2024-03-15T11:43:10-04:00"
       },
        "isDisabled": false,
        "principalArn": "arn:aws:iam::577312533299:role/amazon/lightsail/eu-west-3/containers/signup-application/1jetjd21p8qshe57seuh71tnrnn29ps77lnno20sbgl2ghbuc0r0",
        "privateDomainName": "signup-application.service.local",
        "url": "https://signup-application.me04fvc6dbk4e.eu-west-3.cs.amazonlightsail.com/"
    }
}

注意容器的当前状态显示为 "state": “ACTIVATING” (正在激活)状态稍等片刻后,该状态就会变成 ACTIVE。部署过程需要几分钟才能完成。运行以下命令查看部署的当前状态和下一状态。您可以使用以下命令检查部署的状态:

aws lightsail get-container-services --region eu-west-3  --query "containerServices[].nextDeployment.state"
aws lightsail get-container-services --region eu-west-3 --query "containerServices[].currentDeployment.state" 

测试部署

要测试部署情况,首先查看 Lightsail 创建的容器服务地址 URL。打开终端,运行以下命令:

aws lightsail get-container-services --region eu-west-3 --query "containerServices[].url"

该命令输出如下类似结果:

# aws lightsail get-container-services --region eu-west-3 --query "containerServices[].url"

[
    "https://signup-application.me04fvc6dbk4e.eu-west-3.cs.amazonlightsail.com/"
]

打开您的浏览器,访问已部署的容器服务 URL。

或者,也可以在命令行工具上使用 cURL 测试连接对应的端点:

# curl -I https://signup-application.me04fvc6dbk4e.eu-west-3.cs.amazonlightsail.com/

HTTP/2 200
date: Sat, 17 Jul 2021 13:38:04 GMT
content-type: text/html; charset=utf-8
content-length: 4579
server: nginx/1.21.1

恭喜您!现在,容器已部署在 Amazon Lightsail 上。

总结

在本模块中,您学会了如何将容器部署到 Amazon Lightsail。在下一个模块中,您将了解如何更新容器。

下一项:更新容器