无法连接到 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 集群

连接到 AWS ECS 集群中正在运行的容器

无法从另一个容器连接到 mongodb docker 容器

C# 和 Docker - 无法从容器化 .NET Core 3.1 Web API 连接到容器化 MySQL 服务器

无法连接到 docker 容器内的 SQL Server

Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误