根据ECS任务定义的文档,这是我们定义端口映射的方式。
"portMappings": [
{
"containerPort": integer,
"hostPort": integer
}
...
]
默认情况下,这是tcp
上的绑定端口。如何实现udp
端口绑定到在AWS Elastic Beanstalk(多容器)或AWS ECS中运行的docker容器?
答案 0 :(得分:2)
Amazon EC2 Container Service的GA版本中仍然缺少UDP支持,请参阅Ports are assumed to be TCP (issue #2)的Amazon ECS Container Agent。幸运的是,这个令人惊讶的差距已经得到解决,新的ECS代理版本待发布 - 我希望这个版本能够很快发生,AWS Elastic Beanstalk团队通常可以快速更新他们的官方图像在适当的时候(密切关注Elastic Beanstalk forum以获取相应的公告)。
答案 1 :(得分:2)
根据https://github.com/aws/amazon-ecs-agent/issues/2,现在应该支持:
"portMappings": [
{
"containerPort": integer,
"hostPort": integer,
"protocol": "udp",
}
...
]
答案 2 :(得分:1)
@ jrc的回答是正确的。我在Elastic Beanstalk多容器Docker环境中使用Raintank的Graphite堆栈映像raintank/graphite-stack
对其进行了测试(与使用 nginx 作为容器端口的反向代理,不支持多端口和UDP,是ECS的前端)。相应的Dockerrun.aws.json
看起来像这样:
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [
{
"name": "stack",
"image": "raintank/graphite-stack",
"essential": true,
"memory": 850,
"portMappings": [
{
"containerPort": 3000,
"hostPort": 80
},
{
"containerPort": 8125,
"hostPort": 8125,
"protocol": "udp"
}
]
}
]
}
然后登录到相应的EC2实例并输入sudo docker ps
给出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12a5711dab47 raintank/graphite-stack "/usr/bin/supervisord" 2 minutes ago Up 2 minutes 443/tcp, 2003/tcp, 8125/tcp, 0.0.0.0:8125->8125/udp, 0.0.0.0:80->3000/tcp ecs-awseb-test-abc-1-stack-abc
930a9b814df4 amazon/amazon-ecs-agent:latest "/agent" 3 minutes ago Up 3 minutes ecs-agent
手动发布 statsd UDP数据包echo "test.statsd:1|c" | nc -w 1 -u test.aws-region.elasticbeanstalk.com 8125
,我看到它出现在Graphite中。