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 地址的情况下,假设要配置一个负载均衡器(我能想到的一个蹩脚的用例),您应该依靠配置而不是代码。
这是一个小用例。
解决方案包含三个组成部分:
docker-compose
(有网络)
- .env 文件与
docker-compose
同级
- 在 .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>();
});
这个看似简单的任务其实很难。
我正在尝试从 .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 地址的情况下,假设要配置一个负载均衡器(我能想到的一个蹩脚的用例),您应该依靠配置而不是代码。
这是一个小用例。
解决方案包含三个组成部分:
docker-compose
(有网络)- .env 文件与
docker-compose
同级
- 在 .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>();
});