【发布时间】:2018-01-25 05:59:35
【问题描述】:
这就是我想要做的:
Nginx 容器链接到 -> 运行 Puma 的 Rails 容器
使用 docker-compose,这个解决方案效果很好。我能够启动两个容器,并且 NGINX 容器可以访问在链接容器的端口 3000 上运行的服务。不幸的是,在将其迁移到 AWS ECS 时,我遇到了很多麻烦。
首先,Dockerfile for Rails 的相关位:
ENV RAILS_ROOT /www/apps/myapp
RUN mkdir -p $RAILS_ROOT
WORKDIR $RAILS_ROOT
.... lots of files get put in their proper places ....
EXPOSE 3000
VOLUME [/www/apps/myapp/]
CMD puma -C config/puma.rb'
我确认 puma 正在按预期启动,并且似乎在端口 3000 上提供 tcp 流量。
我的 nginx 配置的相关部分:
upstream puma {
fail_timeout=0;
server myapp:3000;
}
server {
listen 80 default deferred;
server_name *.myapp.com;
location ~ (\.php$|\.aspx$|wp-admin|myadmin) {
return 403;
}
root /www/apps/myapp/public;
try_files $uri/index.html $uri @puma;
Nginx 码头文件:
ENV RAILS_ROOT /www/apps/myapp
# Set our working directory inside the image
WORKDIR $RAILS_ROOT
EXPOSE 80
这是我的 ECS 任务定义:
{
"family": "myapp",
"containerDefinitions": [
{
"name": "web",
"image": "%REPOSITORY_URI%:nginx-staging",
"cpu": 512,
"memory": 512,
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
},
{
"containerPort": 443,
"protocol": "tcp"
}
],
"links": [
"myapp"
],
"volumesFrom": [
{
"sourceContainer": "myapp",
"readOnly": false
}
],
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "awslogs-myapp-staging",
"awslogs-region": "us-west-2",
"awslogs-stream-prefix": "awslogs-myapp-nginx"
}
}
},
{
"image": "%REPOSITORY_URI%:v_%BUILD_NUMBER%",
"name": "myapp",
"cpu": 2048,
"memory": 2056,
"essential": true,
...bunch of environment variables, etc.
}
我能够从我的 nginx 容器内 ping myapp 容器,所以我认为这不是安全组问题。
【问题讨论】:
-
你的 myapp 容器是否包含 3000 的端口映射 - 你截断了 myapp 的任务定义 - 我假设它丢失了 - 因此你可以 ping myapp 但不能连接到 3000
-
看看这对你有帮助吗? stackoverflow.com/questions/34517265/…
-
容器在同一个任务定义中,所以我不需要映射端口或做任何奇怪的服务发现。我正在尝试以此为基础设计我的解决方案:aws.amazon.com/blogs/compute/… 不过,我将深入研究 ECS 上的 docker 网络,也许那里有解决方案。
-
更新:认为这是一些奇怪的网络问题,我尝试在 Puma 和 Nginx 中使用 unix 套接字而不是链接端口。同样的情况:在我机器上的 docker-compose 中运行良好,在 ECS 中失败。
标签: docker nginx amazon-ecs