这个看似简单的任务变得非常困难。
我正在尝试从.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的想法吗?
答案 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 地址的事件中,假设要配置负载均衡器(我能想到的一个蹩脚用例),您应该依靠配置而不是代码。
这是一个小用例。
该解决方案包含三个组成部分:
docker-compose
(有网络)docker-compose
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}
.env
文件.
.
.
WEB_API_1_IP=192.168.0.10
WEB_API_2_IP=192.168.0.11
.
.
.
NETWORK_SUBNET=192.168.0.0/24
AddEnvironmentVariables
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddEnvironmentVariables();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});