我的问题可能是 Docker 网络问题,但我不完全确定,这可能是一个更广泛的 AWS 问题。
我们正在将公司基础设施的一部分迁移到 AWS,它是由外部供应商设置的。他们设置了一个 MS SQL RDS 服务器,在隔离的子网上托管我们的数据库。因此,我们需要做的是将 RDS 服务器的端口 1433 端口转发到我们正在使用的计算机(无论是我们自己的笔记本电脑还是本地虚拟机)。我们通过使用以下命令与堡垒主机 EC2 实例(在同一子网上运行)进行通信来实现此目的:
aws ssm start-session --region $region --target $bastionID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters portNumber="$remoteport",localPortNumber="$localport",host="$remotehost"
。然后,我们只需提供 localhost:1433
作为地址即可连接到数据库。
上述命令在终端中运行,一小时后超时,这是默认情况。
为了使用所有云资源在 AWS 上进行测试,我们需要推送到属于部署/管道一部分的分支上的私有存储库。然后,该部署将编译一个 docker 映像。该 docker 镜像将被推送到 ECR(弹性容器注册表)。然后,ECS(弹性容器服务)将生成新映像的新容器,然后我们将能够查看代码更改是否有效。所有这些都是在开发帐户/环境中完成的。
因此,问题是我们能否绕过整个过程,通过在本地(笔记本电脑、本地 Linux 虚拟机)进行代码更改,然后编译 docker 映像并生成一个容器,该容器以某种方式“认为”它是在 AWS 上运行,而不是在 AWS 上运行。本地,以便它可以与实际的RDS实例通信?这样我们就可以测试,就好像它真的在 AWS 上运行一样?
我已经尝试在自己的笔记本电脑上运行端口转发命令,然后使用
localhost:1433
作为 docker-compose.yml
文件中的数据库地址,希望我可以将其作为环境变量传递,但这并没有'不工作。我的 docker 网络接口设置为主机,我猜这是默认设置。我也尝试过使用桥接,但没有一个起作用。我的大部分尝试都是在本地 Ubuntu 虚拟机上进行的。
可以这样做吗?预先感谢您的时间和任何指示。
一般来说,一切皆有可能。但首先:
--network=host
不应该是默认值,它打破了隔离的概念。
如果没有
network=host
,您将无法在本地计算机上运行 port-forward ...
,然后启动可以使用转发端口的容器。localhost
并不指向您的本地计算机。 Docker 使用隔离网络,通常您必须使用 docker0
网络设备的 IP(例如 172.17.0.1
)。
无论如何,根据你的问题:它似乎与无法从docker容器内部连接到RDS,我可以从主机连接到RDS,我可以从本地docker容器。