docker 如何获取服务器监听的IP和端口

brqmpdu1  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(137)

我想做一个我的ASP.NET Web API的图像,我将在Docker中使用不同的端口运行,在启动时保存到数据库中的一个条目,其中包含IP和访问它的端口。
然后在我的Back Office Web API中,从数据库获取一个这样的记录,例如,我可以使用我编写的提供程序来访问相同的ASP.NET Web API,使用其IP和端口。
现在,当我启动Web API时,我在数据库中获得以下条目:

ip: 26.16.80.29
port: 53256

字符串
虽然我的Web API正在侦听:
Microsoft.Hosting.Lifetime:信息:正在收听:https://localhost:5001
Microsoft.Hosting.Lifetime:信息:正在收听:http://localhost:5000
现在我使用以下方法来获取我在互联网上找到的IP和端口:

// Getting IP 
IPAddress[] ipAddresses = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress ip = ipAddresses.Select(ip => ip)
                          .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
                          .First();

// Getting port
var listener = new TcpListener(IPAddress.Any, 0);
listener.Start();
var port = ((IPEndPoint)listener.LocalEndpoint).Port;
listener.Stop();


我也有一个想法,从launchSettings.json获取这些信息:

"profiles": {
   "Docker": {
      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}"
   }
}


但是如果我突然不想在容器中使用启动,而是想使用任何其他配置文件,一切都应该以同样的方式工作
有什么办法可以解决这个问题?

ubof19bj

ubof19bj1#

我不知道这是否能在Docker镜像中工作,可能在NAT /负载均衡器/等等之后,但我确实在之前成功地使用过它:

public static class NetworkingHelpers
{
    /// <summary>
    /// Gets the preferred IP Address to the <paramref name="targetIp"/> by connecting with an UDP socket.
    /// Works well on Windows, Linux and Mac (source: https://stackoverflow.com/a/27376368/285678)
    /// </summary>
    /// <remarks>It won't work if there is no network connectivity. Since it finds the target's "preferred" 
    /// outboung IP Address the result can vary for different targets on machines with multiple network
    /// interfaces. It normally finds out the correct, preferred local IP (which is NOT your NAT IP!).</remarks>
    /// <returns></returns>
    public static IPAddress GetLocalIPv4Address(string? targetIp = null) {
        using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0);
        socket.Connect(targetIp ?? "8.8.8.8", 65530);
        IPEndPoint endPoint = (IPEndPoint)socket.LocalEndPoint;
        return endPoint.Address;
    }
}

字符串
它在“大部分”时间都能工作:-)但是,在生产环境中,我确实从配置文件中获取了“外部”IP地址,只是为了确保,只有在配置丢失的情况下才采取这种“黑客”手段。

相关问题