Docker 来自 .net 项目的容器 IP 地址

Docker container IP address from .net project

这个看似简单的任务其实很难。

我正在尝试从 .net 项目中获取 docker 容器的 IP,在我的例子中使用的是 c#。

到目前为止我已经尝试过的(这个returnsdocker引擎的IP(DockerNAT),而不是容器的IP:

 Dns.GetHostEntry(name).AddressList.FirstOrDefault(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);

如果我使用 ipconfig,列表不包含容器的 IP 地址,您可以使用 docker 网络检查 network_name 找到它(以下列表不包含容器的 IP):

 var networkInterfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

还有其他在 C# 中访问容器 IP 的想法吗?

我的经验是通过环境变量将 Docker 主机 IP 传递给容器。 然后应用程序查找环境变量值。

正如上面评论中提到的,docker IP 查找它没有用。即使是同一台主机上的Container,也可以通过不同的端口进行通信。

我也有上面的要求,我必须启动一个 docker 容器并获取容器 IP 地址并保存到某个目录,所有这些都使用 c#(这个概念也适用于其他编程语言).下面是一段代码来实现这一点。喜欢请投赞成票,不喜欢请评论。

    static void Main(string[] args)
        {
          Console.WriteLine("Getting Container IP...");
          //This command returns back ip address of the required container.
          string inspectCommand = string.Concat("inspect -f ", "\"{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}\"", " container ID/Name");
          //The command is appended with string 'docker' as all docker commans starts with it
          var processInfo = new ProcessStartInfo("docker", $"{inspectCommand}");

          processInfo.CreateNoWindow = true;
          processInfo.UseShellExecute = false;
          processInfo.RedirectStandardOutput = true;
          processInfo.RedirectStandardError = true;'

          using (var process = new Process())
          {
            process.StartInfo = processInfo;
            var started = process.Start();

              StreamReader reader = process.StandardOutput;
              //to remove any unwanted char if appended 
              ip = Regex.Replace(reader.ReadToEnd(), @"\t|\n|\r", "");
              if(string.IsNullOrEmpty(ip))
              {
                Console.WriteLine($"Unable to get ip of the container");
                Environment.Exit(1);
              }
              Console.WriteLine($"Azurite conatainer is listening @ {ip}");

              Environment.Exit(1);
           }}

与大多数需要该 IP 的人分享的答案不同。

我同意@david-maze 的观点,在大多数情况下你可以在不知道 IP 地址的情况下逃脱。 docker-compose 创建的 yaml 文件将对所有服务有一个友好的名称。

话虽如此,在您只需要 IP 地址的情况下,假设要配置一个负载均衡器(我能想到的一个蹩脚的用例),您应该依靠配置而不是代码。

这是一个小用例。

解决方案包含三个组成部分:

  1. docker-compose(有网络)
  2. .env 文件与docker-compose
  3. 同级
  4. 在 .NET 代码中配置环境变量

1。 docker-compose

version: '3.3'
services:
  web_api:
    .
    .
    .
    networks:
      public_net:
        ipv4_address: ${WEB_API_1_IP}
.
.
.
networks:
  public_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: ${NETWORK_SUBNET}

2。 .env 文件

.
.
.
WEB_API_1_IP=192.168.0.10
WEB_API_2_IP=192.168.0.11
.
.
.
NETWORK_SUBNET=192.168.0.0/24

3。 Program.csAddEnvironmentVariables

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddEnvironmentVariables();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });