在 .net 核心应用程序中获取 Docker 容器 IP

Ale*_*lex 8 docker consul asp.net-core

使用 获取容器本身内当前 docker 容器 IP 地址的最佳方法是什么.net core?

我尝试将我的容器注册到Consul托管在 Docker 主机上的服务器(而不是作为容器),并且我需要在启动时获取容器 IP 地址以进行注册。因为 IP 地址在任何容器启动时都会发生变化,所以我不能将其硬编码到appsettings.json. 我跟着这个教程。当谈到这一部分时:

// Get server IP address
var features = app.Properties["server.Features"] as FeatureCollection;
var addresses = features.Get<IServerAddressesFeature>();
var address = addresses.Addresses.First();

// Register service with consul
var uri = new Uri(address);
var registration = new AgentServiceRegistration()
{
     ID = $"{consulConfig.Value.ServiceID}-{uri.Port}",
     Name = consulConfig.Value.ServiceName,
     Address = $"{uri.Scheme}://{uri.Host}",
     Port = uri.Port,
     Tags = new[] { "Students", "Courses", "School" }
};
Run Code Online (Sandbox Code Playgroud)

接收到的address只包含环回地址,而不包含实际的容器地址(从外部看到 -Consul运行的主机)。我已经尝试使用HttpContext(null在启动类中)并且此时IHttpContextAccessor也不包含任何内容。


编辑:这是我的一部分appsettings.json:

  "ServiceRegistry": {
    "Uri": "http://172.28.112.1:8500",
    "Name": "AuthServiceApi",
    "Id": "auth-service-api-v1",
    "ContainerAddress": "http://<CONTAINER_IP/DNS>",
    "Checks": [
      {
        "Service": "/health",
        "Timeout": 5,
        "Interval":  10 
      }
    ], 
    "Tags": [ "Auth", "User" ]
  }
Run Code Online (Sandbox Code Playgroud)

这Uri是我的主机系统中的一个,我设法在 Consul 中注册了该服务。缺少的部分是<CONTAINER_IP/DNS>Consul 对特定容器执行一些检查所需的部分。在这里,我需要容器的 IP 或可从主机系统访问的 DNS。我知道这个 IP 会随着每个容器启动而切换,它在设置中仅用于演示目的(如果我能在启动时获得 IP,我很高兴)。

Ale*_*lex 15

好的,我让它工作了,它比我想象的要容易得多。

var name = Dns.GetHostName(); // get container id
var ip = Dns.GetHostEntry(name).AddressList.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork);
Run Code Online (Sandbox Code Playgroud)

container_id/name如果它是IP4地址,我可以通过简单的比较来获得IP。然后我可以使用这个地址并将它传递给领事。健康检查现在可以从外部主机使用它的 IP 成功调用容器。

我对结果仍然不是 100% 满意,因为它依赖于“第一个”有效 IP4 地址AddressList(目前,没有更多地址,所以我为我准备了这个地址)。仍然欢迎任何更好/更通用的解决方案。

  • 获取 pod IP 地址最可靠的方法是询问 k8s 本身。您可以将环境变量添加到容器规范并读取应用程序中的值 https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/ (2认同)