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-адрес, скажем, для настройки балансировщика нагрузки (один неудачный вариант использования, который я мог придумать), вы должны полагаться на конфигурацию, а не на код.
Вот небольшой пример использования.
Решение состоит из трех компонентов:
- (с сетью)
- .env на том же уровне, что и
- Настройка переменных среды в коде .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);
}}