我有一个安装了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。
- 为了快速解决问题,我认为您可以
nslookup
您的RDS DNS并获取其IPv4地址中的1个。然后,使用单个IPv4作为host
nslookup <ID>.rds.amazonaws.com
- 为了获得一个干净的解决方案,您需要将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