下面是CloudFormation模板,用于在AWS EC2实例(Linux)上配置ECS任务容器:
TodobackendTaskDefinition:
Type: "AWS::ECS::TaskDefinition"
Properties:
ContainerDefinitions:
- Name: todobackend
Image: someacct/todobackend
Memory: 450
MountPoints:
- ContainerPath: /var/www/todobackend
SourceVolume: webroot
Command:
- uwsgi
- "--socket /var/www/todobackend/todobackend.sock"
- "--chmod-socket=666"
- "--module todobackend.wsgi"
- "--master"
- "--die-on-term"
- Name: nginx
Image: someacct/todobackend-nginx
Memory: 300
PortMappings:
- ContainerPort: "8000"
HostPort: "8000"
MountPoints:
- ContainerPath: /var/www/todobackend
SourceVolume: webroot
Volumes:
- Name: webroot
Host:
SourcePath: /ecs/webroot
TodobackendAdhocTaskDefinition:
Type: "AWS::ECS::TaskDefinition"
Properties:
ContainerDefinitions:
- Name: todobackend
Image: someacct/todobackend
Memory: 245
MountPoints:
- ContainerPath: /var/www/todobackend
SourcePath: webroot
Volumes:
- Name: webroot
Host:
SourcePath: /ecs/webroot
其中三个容器的内存属性平均分配(450 + 300 + 250 MB),假设这三个容器正在分配了1 GB RAM的t2.micro
EC2实例类型上运行(物理)
["Memory"
的这些值的随机更改使容器运行或失败不知道失败的适当原因。
在失败时,在AWS云中进行调试时,我们会收到此类错误:
容器不在docker上运行。容器是进程-它们在Linux内核上运行。容器是Linux进程(或Windows)
Docker容器名称空间是使用clone()
系统调用在内部创建的。
内存管理将每个进程的虚拟地址空间映射到物理地址空间。进程管理引用虚拟地址,而不引用物理地址。
对于以上代码中的Memory: 300
MB语法,AWS documentation说:“要呈现给容器的内存量(以MiB为单位)。”
在docker world中,containerd
为每个新容器创建填充程序。runc
实际上创建了一个容器过程。
1)在上面的代码中,将RAMMemory: 300
MB的大小分配给容器进程是什么意思?它是进程的物理地址空间(或进程的虚拟地址空间)的大小吗?
2)runc
用户空间程序是否使用clone()
系统调用来为每个容器进程设置物理内存空间(Memory: 300
MB)?
您不应该在具有最小内存的如此小的实例中使用memory
参数,请记住这两者之间有一个很大的区别,达到内存限制后,您的容器将被[[killed。
memoryReservation
为容器保留的内存的软限制(在MiB中)。什么时候系统内存处于争用状态,Docker尝试保留容器内存达到此软限制; h但是,您的容器可以需要时消耗更多的内存]]。
内存
要提供给容器的内存量(以MiB为单位)。container_definition_memory如果容器尝试超出此处指定的内存被杀死。
此内存参数不受容器本身控制,但受ECS代理控制。
如何计算每个泊坞容器所需的内存大小?如果您担心这个问题,这完全取决于您将在容器中运行的基础应用程序。我看到您正在使用nginx,可以在此处阅读nginx-plus-sizing-guide