【发布时间】:2019-01-26 06:42:43
【问题描述】:
使用.net core 在容器本身中获取当前 docker 容器 IP 地址的最佳方法是什么?
我尝试将我的容器注册到托管在 Docker 主机(而不是容器)上的 Consul 服务器,并且我需要在启动时获取容器 IP 地址以进行注册。因为任何容器启动时 IP 地址都会发生变化,所以我不能将其硬编码到 appsettings.json 中。我关注了这个tutorial。说到本节:
// Get server IP address
var features = app.Properties["server.Features"] as FeatureCollection;
var addresses = features.Get<IServerAddressesFeature>();
var address = addresses.Addresses.First();
// Register service with consul
var uri = new Uri(address);
var registration = new AgentServiceRegistration()
{
ID = $"{consulConfig.Value.ServiceID}-{uri.Port}",
Name = consulConfig.Value.ServiceName,
Address = $"{uri.Scheme}://{uri.Host}",
Port = uri.Port,
Tags = new[] { "Students", "Courses", "School" }
};
收到的address 仅包含环回地址,而不包含实际的容器地址(从外部看 - 运行Consul 的主机)。我已经尝试使用HttpContext(即启动类中的null)和IHttpContextAccessor,此时也没有包含任何内容。
编辑:这是我appsettings.json的一部分:
"ServiceRegistry": {
"Uri": "http://172.28.112.1:8500",
"Name": "AuthServiceApi",
"Id": "auth-service-api-v1",
"ContainerAddress": "http://<CONTAINER_IP/DNS>",
"Checks": [
{
"Service": "/health",
"Timeout": 5,
"Interval": 10
}
],
"Tags": [ "Auth", "User" ]
}
Uri 来自我的主机系统,我设法在 Consul 中注册了该服务。缺少的部分是 <CONTAINER_IP/DNS>,Consul 需要它来对该特定容器执行一些检查。在这里,我需要容器的 IP 或可以从主机系统访问它的 DNS。我知道这个 IP 会随着每次容器启动而切换,并且它在设置中仅用于演示目的(如果我能在启动时获得 IP,我很高兴)。
【问题讨论】:
-
请问您为什么不喜欢使用 docker 主机名?这样,您根本不必担心内部 IP 地址,因为 docker 充当 DHCP 服务器,并且(默认情况下)容器的主机名就是它的名称。所以containername 将带您进入在 docker 中运行的容器之一
-
您还应该遍历
addresses.Addresses属性。你只是选第一个,可能还有其他更合适的 -
@Tseng:我是否也可以使用它的 container_id 作为主机名,因为我在
docker-compose中设置了container_name并且还使用了副本(完全不确定这将如何协同工作)?我对 docker 很陌生,不知道有这样的方法。我很欣赏其他不依赖 IP 的解决方案 :-) -
另外请记住,在 Docker Compose 上下文中,Compose 会告诉 Docker 每个容器可以通过其在
docker-compose.yml文件中的键访问,这将不同于容器名称或容器私有主机名.
标签: docker asp.net-core consul