从Docker容器内访问RDS没有通过安全组?

我试图运行一个Web服务器,在docker集装箱内使用EC2的RDS数据库。

我已经设置了安全组,所以EC2主机的angular色被允许访问RDS,如果我尝试从主机直接访问它,一切正常。

但是,当我在主机上运行一个简单的容器并尝试访问RDS时,它会被阻塞,就好像安全组没有让它通过一样。 经过一系列的试验和错误,似乎容器的请求并不是来自EC2主机,所以防火墙说没有。

我可以在短期内通过在docker容器上设置–net = host来解决这个问题,但是这会破坏很多伟大的dockerfunction,比如能够映射端口的function(例如,现在我需要确保容器的每个实例用手在不同的端口上侦听)。

有没有人find解决办法? 如果您实际使用任何AWS资源,在AWS中运行容器似乎是一个相当大的限制。

是的,容器确实碰到了RDS的公共IP地址。 但是您不需要调整低级Docker选项来允许您的容器与RDS交谈。 ECS集群和RDS实例必须在同一个VPC中 ,然后才能通过安全组configuration访问。 最简单的方法是:

  1. 导航到RDS实例页面
  2. select数据库实例并深入查看详细信息
  3. 点击安全组ID
  4. 导航到入站选项卡并select编辑
  5. 并确保有一个与源自定义MySQL / Auroratypes的规则
  6. input自定义来源时,只需inputECS集群的名称,安全组名就会自动完成

本教程有截图 ,说明去哪里。

全面披露:本教程包含来自Bitnami的容器,我为Bitnami工作。 然而,这里expression的想法是我自己的,而不是Bitnami的意见。

找出发生了什么,张贴在这里,以防其他人帮助。

来自集装箱内部的请求打到RDS的公共IP而不是私人(安全团队是如何工作的)。 它看起来像docker集装箱内的DNS是使用8.8.8.8谷歌DNS,这不会做的RTS端点变成私有IP的AWS黑魔法。

正如@adamneilson所说,设置Docker选项是最好的select。 以下是如何在VPC上发现您的Amazon DNS服务器 。 此外,Amazon EC2容器服务开发人员指南中的“ 启用Dockerdebugging输出 ”部分还提到了Docker选项文件的位置。

假设您正在运行10.0.0.0/24的VPC块,则DNS将为10.0.0.2。

对于CentOS,红帽和亚马逊:

 sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/sysconfig/docker 

对于Ubuntu和Debian:

 sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/default/docker