从Docker容器中访问RDS而不通过安全组?

Ale*_*ing 17 amazon-ec2 amazon-web-services docker

我正在尝试运行一个在Docker容器中使用带有EC2的RDS数据库的Web服务器.

我已经设置了安全组,因此允许EC2主机的角色访问RDS,如果我尝试直接从主机访问它,一切正常.

但是,当我在主机上运行一个简单的容器并尝试访问RDS时,它会被阻止,就好像安全组没有通过它一样.经过一系列的反复试验后,似乎确实没有出现容器请求来自EC2主机,因此防火墙说没有.

通过在docker容器上设置--net = host,我能够在短期内解决这个问题,但这会破坏很多很棒的docker网络功能,比如能够映射端口(即,现在我需要确保每个容器的实例用手监听不同的端口).

有没有人找到解决这个问题的方法?如果您实际使用任何AWS资源,那么在AWS中运行容器似乎是一个非常大的限制.

Nea*_*eal 22

是的,容器确实达到了RDS的公共IP.但是您不需要调整低级Docker选项以允许容器与RDS通信.在ECS簇和RDS实例必须是在相同的VPC,然后访问可以通过安全组进行配置.最简单的方法是:

  1. 导航到RDS实例页面
  2. 选择数据库实例并深入查看详细信息
  3. 单击安全组ID
  4. 导航到"入站"选项卡,然后选择"编辑"
  5. 并确保有一个带有源Custom的MySQL/Aurora类型规则
  6. 输入自定义源时,只需输入ECS群集的名称,即可自动完成安全组名称

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

完全披露:本教程以Bitnami的容器为特色,我为Bitnami工作.然而,这里表达的想法是我自己的,而不是Bitnami的意见.

  • 出于其价值,我托管了自己的运行docker而不是使用ECS的ec2盒子(当时出于多种原因)。 (2认同)

Ale*_*ing 7

弄清楚发生了什么,发布在这里以防万一它可以帮助其他人.

容器内的请求是攻击RDS的公共IP而不是私有(这是安全组的工作方式).看起来Docker容器内的DNS正在使用8.8.8.8 google dns,并且这不会让AWS黑魔法将rds端点转换为私有ip.

例如:

DOCKER_OPTS="--dns 10.0.0.2 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -g /mnt/docker"
Run Code Online (Sandbox Code Playgroud)

  • 所以问题是有道理的,但是你可以在答案中解释你是如何解决它的吗? (9认同)
  • 我有同样的问题,并且有点失望,看不到@ alex-schokking如何修复它,但对于遇到同样事情的其他人,这是我使用的修复:我发现[本文](http://blog.thestateofme .com/2015/09/01/forwarding-dns-queries-to-aws-vpc-resolvers /)其中概述了"VPC的DNS解析器始终位于+2地址,因此如果VPC为172.31.0.0/16然后DNS服务器将在172.31.0.2",这给了我DNS服务器的IP.然后我不得不将它添加到docker守护程序启动`DOCKER_OPTS =" - dns 172.31.0.2 --dns 8.8.8.8 --dns 8.8.4.4"`,重启并且它有效! (5认同)

Tho*_*eld 5

RDS 的入站规则应设置为 EC2 实例的私有 IP,而不是公共 IPv4。