无法从docker容器内部连接到RDS,我可以从主机连接,也可以从本地docker容器连接



我有一个安装了docker compose的ec2实例,运行一个容器。我在机器上本地复制了相同的设置。

使用nc -v **host** 5432会导致:

  • 从我的机器>成功
  • 从我的机器上运行的码头集装箱内部>成功
  • 从ec2实例内部>成功
  • 从运行在ec2>无法访问主机

如果有人能给我指明正确的方向,我猜ec2的docker配置中缺少了一些东西。

这是docker_boot.service文件

Description=docker boot
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/ubuntu/metabase
ExecStart=sudo /usr/bin/docker-compose -f /home/ubuntu/metabase/docker-compose.yml up -d --remove-orphans
[Install]
WantedBy=multi-user.target

这背后的原因是您的Docker容器试图使用公共DNS而不是私有DNS来解析RDS DNS。

  1. 为了快速解决问题,我认为您可以nslookup您的RDS DNS并获取其IPv4地址中的1个。然后,使用单个IPv4作为host
nslookup <ID>.rds.amazonaws.com
  1. 为了获得一个干净的解决方案,您需要将Docker容器DNS配置调整为VPC内部DNS IPv4地址。使用--dns,您可以快速调整,如果您的应用程序也试图访问其他服务,您可以添加更多的DNS
docker run --name app --dns=169.254.169.253 -p 80:5000 -d app

参考文献:

  • https://docs.docker.com/config/containers/container-networking/
  • https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html