IP-адрес контейнера Docker из проекта.net

Эта, казалось бы, простая задача оказывается очень сложной.

Я пытаюсь получить IP-адрес контейнера Docker из проекта.net, в моем случае с помощью C#.

То, что я пробовал до сих пор (это возвращает 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();

Любая другая идея для доступа к IP-адресу контейнера в C#?

3 ответа

Ответ, отличный от того, что большинство из них все равно делится им для тех, кому нужен этот IP.

Я согласен с @david-maze в том, что в большинстве случаев вы можете уйти, даже не зная IP-адреса. А с созданием yamlфайл будет иметь понятное имя для всех сервисов.

С учетом сказанного в случаях, когда вам просто нужен IP-адрес, скажем, для настройки балансировщика нагрузки (один неудачный вариант использования, который я мог придумать), вы должны полагаться на конфигурацию, а не на код.

Вот небольшой пример использования.

Решение состоит из трех компонентов:

  1. (с сетью)
  2. .env на том же уровне, что и
  3. Настройка переменных среды в коде .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. Программа.cs AddEnvironmentVariables

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

По моему опыту, я передаю IP-адрес хоста Docker контейнеру через переменные среды. Затем приложение ищет значение переменной среды.

Как упоминалось в комментарии выше, IP-адрес докера бесполезен для поиска. Даже для контейнера на одном хосте вы можете общаться через другой порт.

У меня тоже было требование lyk выше, где мне пришлось развернуть контейнер докеров и получить 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);
           }}
Другие вопросы по тегам