.net项目中的Docker容器IP地址

时间:2018-12-20 23:25:16

标签: c# docker windows-container

这个看似简单的任务变得非常困难。

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

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

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

如果我使用ipconfig,则该列表不包含容器的IP地址,您可以使用docker network inspect network_name找到它(以下列表不包含容器的IP):

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

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

3 个答案:

答案 0 :(得分:0)

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

如上面的评论中所述,docker IP对查找它没有用。即使对于同一主机上的Container,您也可以通过不同的端口进行通信。

答案 1 :(得分:0)

我也有一个要求,那就是我必须启动一个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);
           }}

答案 2 :(得分:0)

对于那些需要该 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.cs AddEnvironmentVariables

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