编辑:我的第一个问题是"如何使用Fargate链接AWS ECS上的任务定义中的容器?"但是,从一开始我可能就错了,所以我改变了我的问题并保留了以下内容:
我试图通过ECS在AWS上部署一个简单的基于Laravel的应用程序。 我的服务在本地使用docker-compose-yml文件按预期工作。
但是在AWS上,我从我的网络容器日志中获得了"nginx: [emerg] host not found in upstream "app" in /etc/nginx/conf.d/default.conf:12"
。
这里是我服务的容器:web(nginx),app(Laravel),数据库(MySQL)和缓存(redis)。
我理解任务描述的所有容器共享相同的命名空间,因此不需要链接容器(我们无论如何都可以使用链接属性与Fargate)。
你能帮我解决这个问题吗?我是瞎子。
这是我工作的本地docker-compose.yml文件:
version: '2'
services:
# The Application
app:
image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-
maison/tribe-migrate
volumes:
- /var/www/storage
env_file: '.env'
environment:
- "DB_HOST=database"
- "REDIS_HOST=cache"
# The Web Server
web:
image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/laravel-web
ports:
- 80:80
# The Database
database:
image: mysql:5.6
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=homestead"
- "MYSQL_USER=homestead"
- "MYSQL_PASSWORD=secret"
- "MYSQL_ROOT_PASSWORD=secret"
# redis
cache:
image: redis:3.0-alpine
volumes:
dbdata:
这是我的Web容器Dockerfile:
FROM nginx:1.10
ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
我的vhost.conf:
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
答案 0 :(得分:0)
来自vhost.conf:
fastcgi_pass app:9000;
主机名" app"适用于docker-compose,因为这是你在docker-compose.yml中命名的服务。 docker-compose为它必须管理的容器创建一个新网络,该网络使容器能够通过主机名相互引用而无需进一步配置。
Fargate没有这个功能,所以" app"不解决。
Fargate目前允许您使用的唯一网络模式是名为awsvpc的特殊AWS模式。在Fargate中运行的每个任务都有自己的弹性网络接口(ENI),这意味着每个任务都拥有自己的私有IP地址。您还可以将ENI配置为具有公共IP地址,就像在EC2实例上使用ENI一样。
如何从nginx容器中解析您的应用容器
在Fargate中,深入查看应用服务器的运行任务定义(群集>任务选项卡>单击应用服务器的任务列中的容器ID)。网络部分将拥有私有IP。
替换主机名" app"在你的conf中使用这个ip:
fastcgi_pass <private_ip>:9000;
答案 1 :(得分:0)
对于其他可能遇到的问题,我在连接两个在aws ecs fargate上以相同任务运行的容器时遇到了相同的问题,发现我必须在vhost.conf中将“ app”替换为“ localhost”,并且工作了。 (这是在另一个答案的一些评论中提到的) 所以vhost.conf看起来像:
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
我还确保端口9000已映射并在应用容器上公开(可能不必要)
# The Application
app:
image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/tribe-migrate
volumes:
- /var/www/storage
env_file: '.env'
environment:
- "DB_HOST=database"
- "REDIS_HOST=cache"
ports:
- 9000:9000
答案 2 :(得分:0)
解决方案是:
上面提到了第二部分,但并未明确指出两个容器必须处于同一任务中。
更多信息,请点击此处:https://github.com/aws-samples/amazon-ecs-fargate-aspnetcore/blob/master/README.md