无法连接到 ECS 中链接的 docker 容器
Posted
技术标签:
【中文标题】无法连接到 ECS 中链接的 docker 容器【英文标题】:Unable to connect to linked docker container in ECS 【发布时间】: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 看看这对你有帮助吗? ***.com/questions/34517265/… 容器在同一个任务定义中,所以我不需要映射端口或做任何奇怪的服务发现。我正在尝试以此为基础设计我的解决方案:aws.amazon.com/blogs/compute/… 不过,我将深入研究 ECS 上的 docker 网络,也许那里有解决方案。 更新:认为这是一些奇怪的网络问题,我尝试在 Puma 和 Nginx 中使用 unix 套接字而不是链接端口。同样的情况:在我机器上的 docker-compose 中运行良好,在 ECS 中失败。 【参考方案1】:结果证明这是一个 AWS 安全组问题。我曾愚蠢地期望 Rails 应用程序可能会提醒我它无法访问数据库,但它只是永远挂在那里,直到我用 rails c 手动启动它。然后我得到了导致快速解决的超时。
【讨论】:
以上是关于无法连接到 ECS 中链接的 docker 容器的主要内容,如果未能解决你的问题,请参考以下文章
从 ECS 集群中的 docker nodejs EC2 容器连接到 Redis Elasticache 集群