一尘不染

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

docker

我正在尝试运行在Docker容器内使用带有EC2的RDS数据库的Web服务器。

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

但是,当我在主机上运行一个简单的容器并尝试访问RDS时,它会被阻止,就像安全组不允许它通过一样。经过一堆反复的试验之后,看来容器请求似乎并非来自EC2主机,因此防火墙拒绝了。

通过在docker容器上设置–net =
host,我可以在短期内解决此问题,但是这破坏了很多很棒的docker网络功能,例如能够映射端口(即,现在我需要确保每个容器实例立即在另一个端口上侦听)。

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


阅读 624

收藏
2020-06-17

共1个答案

一尘不染

弄清楚发生了什么,如果有帮助,请在此处发布。

来自容器内部的请求到达了RDS的公共ip,而不是私有(这是安全组的工作方式)。似乎docker容器中的DNS使用的是8.8.8.8 google
dns,这不会使将rds端点转换为私有ip的AWS魔术。

因此,例如:

DOCKER_OPTS="--dns 10.0.0.2 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -g /mnt/docker"
2020-06-17