Нет Интернета изнутри локального сервисного сетевого контейнера
Я играю с Service Fabric Mesh на своем локальном ПК, но я борюсь с доступом в Интернет из контейнера (Windows).
Я использую стандартный шаблон веб-приложения из Visual Studio 2017:
public static async Task<int> Main(string[] args)
{
try
{
var test = await (new System.Net.Http.HttpClient()).GetStringAsync("http://google.com");
Console.WriteLine(test);
Вы ожидаете, что какой-то HTML будет напечатан, но я получаю следующее исключение:
System.Net.Http.HttpRequestException: такой хост не известен ---> System.Net.Sockets.SocketException: такой хост не известен в System.Net.Http.ConnectHelper.ConnectAsync(строковый хост, порт Int32, CancellationToken cancellationToken) --- Конец внутренней трассировки стека исключений --- в System.Net.Http.ConnectHelper.ConnectAsync(строковый хост, порт Int32, CancellationToken cancellationToken) в System.Threading.Tasks.ValueTask`1.get_Result() в System.Net.Http.HttpConnectionPool.CreateConnectionAsync(запрос HttpRequestMessage, CancellationToken cancellationToken) в System.Threading.Tasks.ValueTask`1.get_Result() в System.Net.Http.HttpConnectionPool.Task.ask ValueTask`1.get_Result () в System.Net.Http.HttpConnectionPool.SendWithRetryAsync(запрос HttpRequestMessage, Boolean doRequestAuth, CancellationToken cancellationToken) в System.Net.Http.RedirectHandler. onToken) в System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, запрос HttpRequestMessage, cts CancellationTokenSource, логические disposeCts) в System.Net.Http.HttpClient.GetStringSain1 (WebSync1. GetSync.1.AsC). Строка [] args)
Базовый образ докера используется microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1709
и если я бегу:docker run microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1709 ping google.com
тогда я получаю:
PS C:\Windows\system32> docker run microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1709 ping google.com
Pinging google.com [172.217.168.238] with 32 bytes of data:
Reply from 172.217.168.238: bytes=32 time=16ms TTL=56
Reply from 172.217.168.238: bytes=32 time=15ms TTL=56
Reply from 172.217.168.238: bytes=32 time=15ms TTL=56
Reply from 172.217.168.238: bytes=32 time=16ms TTL=56
Ping statistics for 172.217.168.238:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 15ms, Maximum = 16ms, Average = 15ms
Что я делаю неправильно?
Обновление 1:
Когда я запускаю образ Docker напрямую, я получаю:
PS C:\Users\XXX> docker run microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1803 ipconfig.exe /all
Windows IP Configuration
Host Name . . . . . . . . . . . . : XXX
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : XXX
Ethernet adapter Ethernet:
Connection-specific DNS Suffix . : XXX
Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter
Physical Address. . . . . . . . . : 00-15-5D-38-EE-09
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::1c14:1ec3:9b85:5f56%4(Preferred)
IPv4 Address. . . . . . . . . . . : 172.20.192.4(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . : 172.20.192.1
DHCPv6 IAID . . . . . . . . . . . : 67114333
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-23-7C-13-F1-00-15-5D-38-EE-09
DNS Servers . . . . . . . . . . . : 172.20.192.1
10.10.0.184 <-- IP of my local machine
10.10.0.1 <-- My router
NetBIOS over Tcpip. . . . . . . . : Disabled
Если я сделаю то же самое (System.Diagnostics.Process.Start("ipconfig.exe", "/all");
) внутри кода, запущенного в Service Fabric:
Windows IP Configuration
Host Name . . . . . . . . . . . . : 0ded1f75fa51
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : Application1
Ethernet adapter Ethernet:
Connection-specific DNS Suffix . : XXX
Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter
Physical Address. . . . . . . . . : 00-15-5D-38-E5-2C
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::1d25:4204:2cd4:1bb0%4(Preferred)
IPv4 Address. . . . . . . . . . . : 172.20.202.176(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . : 172.20.192.1
DHCPv6 IAID . . . . . . . . . . . : 67114333
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-23-7C-11-32-00-15-5D-38-E5-2C
DNS Servers . . . . . . . . . . . : 172.20.192.1
10.10.0.184
NetBIOS over Tcpip. . . . . . . . : Disabled
Как вы можете видеть 10.10.0.1 (мой маршрутизатор / шлюз отсутствует в качестве DNS-сервера в последнем дампе). Как мне это добавить?
1 ответ
Вам нужно добавить команду EXPOSE в начало dockerfile, это известная ошибка, т.е.
FROM ..
WORKDIR ...
EXPOSE 80
Также была проблема с DNS в Windows Containers 1709. Можете ли вы попробовать использовать более новый базовый слой и попробовать еще раз?
Кроме того, ICMP заблокирован внутри Azure. Вы можете использовать PSPing для проверки возможности подключения.
Больше информации здесь.
Поскольку протокол ICMP не разрешен через балансировщик нагрузки Azure, вы заметите, что не можете пропинговать виртуальную машину Azure из Интернета, а из виртуальной машины Azure вы не можете пропинговать местоположения в Интернете.