Amazon web services 在ECS上从ECR运行Docker映像
我在ECR有一个码头工人的形象。我想在ECS上运行它。我遵循了AWS文档中的步骤。这需要经过一系列步骤来建立某种ECS集群,但它从不询问我要运行ECR中的哪个docker映像 运行docker映像非常简单,但对于我尝试运行简单web服务的docker映像的操作而言,ECS似乎过于复杂。这是我找到的最好的解释。也许我错过了什么 亚马逊的文档似乎偏离了正轨,再也无法回到ECR中的docker图像。对于如何在ECS中运行ECR映像,是否有更好的解释 编辑:添加任务定义json:Amazon web services 在ECS上从ECR运行Docker映像,amazon-web-services,docker,amazon-ecs,Amazon Web Services,Docker,Amazon Ecs,我在ECR有一个码头工人的形象。我想在ECS上运行它。我遵循了AWS文档中的步骤。这需要经过一系列步骤来建立某种ECS集群,但它从不询问我要运行ECR中的哪个docker映像 运行docker映像非常简单,但对于我尝试运行简单web服务的docker映像的操作而言,ECS似乎过于复杂。这是我找到的最好的解释。也许我错过了什么 亚马逊的文档似乎偏离了正轨,再也无法回到ECR中的docker图像。对于如何在ECS中运行ECR映像,是否有更好的解释 编辑:添加任务定义json: { "ipcMod
{
"ipcMode": null,
"executionRoleArn": "arn:aws:iam::504084722442:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"dnsSearchDomains": null,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/first-run-task-definition",
"awslogs-region": "us-east-2",
"awslogs-stream-prefix": "ecs"
}
},
"entryPoint": [
"sh",
"-c"
],
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"command": [
"/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\""
],
"linuxParameters": null,
"cpu": 256,
"environment": [],
"resourceRequirements": null,
"ulimits": null,
"dnsServers": null,
"mountPoints": [],
"workingDirectory": null,
"secrets": null,
"dockerSecurityOptions": null,
"memory": null,
"memoryReservation": 512,
"volumesFrom": [],
"image": "504084722442.dkr.ecr.us-east-2.amazonaws.com/dean.w.schulze.5040",
"disableNetworking": null,
"interactive": null,
"healthCheck": null,
"essential": true,
"links": [],
"hostname": null,
"extraHosts": null,
"pseudoTerminal": null,
"user": null,
"readonlyRootFilesystem": null,
"dockerLabels": null,
"systemControls": null,
"privileged": null,
"name": "sample-app"
}
],
"placementConstraints": [],
"memory": "512",
"taskRoleArn": null,
"compatibilities": [
"EC2",
"FARGATE"
],
"taskDefinitionArn": "arn:aws:ecs:us-east-2:504084722442:task-definition/first-run-task-definition:2",
"family": "first-run-task-definition",
"requiresAttributes": [
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.execution-role-ecr-pull"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.task-eni"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.ecr-auth"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.execution-role-awslogs"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
}
],
"pidMode": null,
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"revision": 2,
"status": "ACTIVE",
"volumes": []
}
我理解,当您谈论如何在ECS上运行docker映像时,有一点困惑。我已经列出了一些关键的概念,这将使ECS更容易为您 集群:要在AWS上使用ECS,首先需要创建一个集群。创建集群很简单,因为您只需在以下两种主要模板类型中进行选择 EC2:此集群只能运行配置为在EC2实例上运行映像的任务定义。这就像创建EC2实例并在其上运行docker映像一样。 Fargate:在Fargate集群中,不创建EC2实例,而只在EC2服务上创建网络接口。您仍然可以分配公共IP并根据任务定义查看容器映像。 任务定义:可以将任务定义视为定义容器映像的位置。此任务定义用于在群集中运行任务。您可以在任务定义中定义与docker映像相关的所有内容,即使用docker run命令可以完成的任何内容都可以在任务定义中配置 服务:服务使用任务定义来运行任务。例如,您有一个docker映像,并且希望至少有两个实例始终运行您的映像。您可以在将服务配置为两个时设置实例数,ECS服务将确保两个任务始终在集群内运行您的映像。如果某个任务因某种原因停止,它将继续尝试运行您的任务 任务:任务是ECS中实际运行docker镜像的实体。可以使用服务或直接创建新任务生成任务。在这两种情况下,您必须具有包含有关docker映像的信息的任务定义 答复你的评论: 我想我必须编辑容器定义而不是任务定义 容器定义就是任务定义。如果要更新图像,可以创建任务定义的新修订版,并使用此修订版运行任务。如果通过服务运行任务,则可以更新服务并分配最新的任务定义。该服务将自动生成具有最新任务定义的新任务。要使用ECR图像,只需从图像名称旁边的图标复制url,并将其粘贴到任务定义中的“图像”下
注意:您应该启用公共ip和/或internet连接到instanceEC2/网络接口fargate,以连接到ECR,请阅读。在AWS文档中,运行映像的步骤最少,但仍有几个步骤。如果您觉得在EC2实例上运行Docker更容易,并且可以进行充分的维护,那么没有任何东西可以阻止您在EC2实例上运行Docker。我正在使用现有的ECR图像。在第2步创建任务定义中,它表示在容器定义中使用ECR图像的完整标记名。我想我必须编辑容器定义而不是任务定义。你能澄清一下吗?当将ECR图像URL放入容器定义图像时,它给出的某些选定容器选项无效或为空。能否以json格式发布任务定义?添加了任务定义。json。它添加了我的docker映像,但看起来它正在使用示例应用程序而不是运行我的docker映像。任务->详细信息页面有一个公共IP地址,但我无法连接到它。在本地部署时,我连接到localhost:8080/api/hello,但在部署到AWS时:8080/api/hello拒绝连接。文件上说点击ENI Id获取公共IP,但表中没有任何内容。文档在这一点上完全是错误的。您提供的链接是针对一个叫做PrivateLink的东西的,这在ECS入门中没有提到。PrivateLink涉及ECR和S3。在ECS中部署一个简单的docker镜像真的有必要吗?关于你的第二条评论,我分享的链接只是提供信息,并且与如何在私有子网中运行ECS任务有关。我不确定您在AWS上指的是哪一个ECS“Getting Started”文档,但我猜它与基本设置有关。他们通常不会提及复杂的设置,例如在“入门”中在私有子网中运行任务的设置
文件。如果您正在进行在公用子网中运行ECS任务的基本设置,您不必担心。关于您的第一条评论,您是对的,公用IP将出现在任务详细信息页面。检查两件事:1您是否在任务定义中定义了8080端口的端口映射?我查看了您的任务定义,您已经映射了端口80,您必须将其更改为端口8080。2打开ENI网络接口,打开与其关联的安全组,确保在端口8080添加入站TCP规则以接受来自任何地方的流量。