ECS多容器设置
ECS multi container setup
我需要以下场景的帮助。我有三个容器需要在 ECS 上 运行,前面是 alb。我有 nginx 前端、php、nginx 后端。两个 nginx 容器都依赖于 php 容器。我只想公开前端容器。如何在不在每个前面添加 alb 的情况下将它们绑在一起?
我使用 terraform 来配置所有部分,包括(ALB、ECR、ECS 等)我想知道如何连接容器而不让每个容器前面都有一个 alb。
本地我 运行 他们用 docker-compose.
这是一个有点宽泛的问题,但我会尽力给出一个可以指导您正确方向的答案。
您可以尝试使用基础架构即代码 (IaC) 来快速让某些东西工作并锻炼您需要的部分和不需要的部分。您可以查看部署的内容,了解功能性 ECS 基础设施是如何构建的,它通常会涉及 VPC、NAT、安全组、Internet 网关、ALB、ECR 等更多部分。查看所有这些部件的部署和连接可以进一步帮助您了解您的需求。
IaC 的一些示例 运行 ECS:
https://www.pulumi.com/docs/guides/crosswalk/aws/ecs/
https://registry.terraform.io/modules/cn-terraform/ecs-fargate/aws/latest
要回答有关 ALB 的更具体问题,您只需将前端连接到具有目标的 ALB group.There 是连接容器的不同方式,服务发现是创建主机名的一种方式对于私有网络中的每个容器。然后你可以从你的前端调用你的后端,类似于你使用 docker-compose.
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
如果您有一个 docker 组合文件,最简单的方法可能是在 docker 中创建一个 ECS 上下文并使用 docker compose up
部署您的组合文件。你可以阅读更多here
Nginx 和 PHP 可以 运行 并排。 ECS 中的任务定义可以包含这两个容器,nginx 容器公开端口 80,PHP 容器公开 9000(可能使用 PHP-FPM)。 Nginx 可用作路由请求到 PHP 进程的代理。
示例task definition(简化值以演示多容器设置):
{
"containerDefinitions": [
{
"portMappings": [
{
"hostPort": 9000,
"protocol": "tcp",
"containerPort": 9000
}
],
"command": [
"php-fpm"
],
"image": "image-url-for-php:latest",
"name": "php-fpm"
},
{
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"image": "image-url-for-nginx:latest",
"dependsOn": [
{
"containerName": "php-fpm",
"condition": "START"
}
],
"essential": true,
"name": "nginx"
}
]
}
nginx 配置如下所示:
server {
listen 80;
index index.php index.html;
root /var/www/html/public; # change this to application files path
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000; # PHP container accessible via localhost:9000 if running side by side
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
然后可以使用此任务定义来创建服务,ELB 可以将其用作目标组(路由到 nginx 的端口 80)。从那里所有请求都将被代理到 PHP 容器。
就 nginx-backend 而言,可以使用相同的设置。但是,如果此服务不会暴露给 public 流量,您将需要使用内部 ELB 或 Service Discovery。但是,想法是 PHP 容器本身不需要专用的 ELB。
我需要以下场景的帮助。我有三个容器需要在 ECS 上 运行,前面是 alb。我有 nginx 前端、php、nginx 后端。两个 nginx 容器都依赖于 php 容器。我只想公开前端容器。如何在不在每个前面添加 alb 的情况下将它们绑在一起?
我使用 terraform 来配置所有部分,包括(ALB、ECR、ECS 等)我想知道如何连接容器而不让每个容器前面都有一个 alb。
本地我 运行 他们用 docker-compose.
这是一个有点宽泛的问题,但我会尽力给出一个可以指导您正确方向的答案。
您可以尝试使用基础架构即代码 (IaC) 来快速让某些东西工作并锻炼您需要的部分和不需要的部分。您可以查看部署的内容,了解功能性 ECS 基础设施是如何构建的,它通常会涉及 VPC、NAT、安全组、Internet 网关、ALB、ECR 等更多部分。查看所有这些部件的部署和连接可以进一步帮助您了解您的需求。
IaC 的一些示例 运行 ECS: https://www.pulumi.com/docs/guides/crosswalk/aws/ecs/ https://registry.terraform.io/modules/cn-terraform/ecs-fargate/aws/latest
要回答有关 ALB 的更具体问题,您只需将前端连接到具有目标的 ALB group.There 是连接容器的不同方式,服务发现是创建主机名的一种方式对于私有网络中的每个容器。然后你可以从你的前端调用你的后端,类似于你使用 docker-compose.
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
如果您有一个 docker 组合文件,最简单的方法可能是在 docker 中创建一个 ECS 上下文并使用 docker compose up
部署您的组合文件。你可以阅读更多here
Nginx 和 PHP 可以 运行 并排。 ECS 中的任务定义可以包含这两个容器,nginx 容器公开端口 80,PHP 容器公开 9000(可能使用 PHP-FPM)。 Nginx 可用作路由请求到 PHP 进程的代理。
示例task definition(简化值以演示多容器设置):
{
"containerDefinitions": [
{
"portMappings": [
{
"hostPort": 9000,
"protocol": "tcp",
"containerPort": 9000
}
],
"command": [
"php-fpm"
],
"image": "image-url-for-php:latest",
"name": "php-fpm"
},
{
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"image": "image-url-for-nginx:latest",
"dependsOn": [
{
"containerName": "php-fpm",
"condition": "START"
}
],
"essential": true,
"name": "nginx"
}
]
}
nginx 配置如下所示:
server {
listen 80;
index index.php index.html;
root /var/www/html/public; # change this to application files path
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000; # PHP container accessible via localhost:9000 if running side by side
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
然后可以使用此任务定义来创建服务,ELB 可以将其用作目标组(路由到 nginx 的端口 80)。从那里所有请求都将被代理到 PHP 容器。
就 nginx-backend 而言,可以使用相同的设置。但是,如果此服务不会暴露给 public 流量,您将需要使用内部 ELB 或 Service Discovery。但是,想法是 PHP 容器本身不需要专用的 ELB。