Docker для настройки среды разработки Windows

Я пытаюсь понять, как настроить среду разработки для локальной разработки нескольких API.

Моя среда разработки выглядит следующим образом:

Хост-компьютер: 10.10.4.19 SQL Server 2016 Express Установлен на хосте, который прослушивает 10.10.4.19,1433, к которому я могу подключиться локально с хоста и с других компьютеров в сети.

Докер для стабильной версии Windows, установлен и разрабатывается netcore webapis, которые помещаются в контейнер и запускаются локально, и я хочу подключиться к экземпляру SQL Server на хосте.

В идеале каждый контейнер должен иметь статический IP-адрес в какой-либо сети NAT, однако мне не удалось получить статические IP-адреса, работающие для настройки сети NAT по умолчанию с помощью docker для Windows.

Я пробовал настроить прозрачную сеть, но, вероятно, это не сработает, поскольку мне это не нужно в сети. Я хотел бы, чтобы они были доступны только хосту или через какое-то сопоставление портов IP-адресом хоста с помощью команды docker run -p.

У меня запущены и работают контейнеры (за исключением статических IP-адресов), но я не могу получить доступ к хосту. Я могу пинговать (что я предполагаю) хост на IP-адресе шлюза, найденном в контейнере, но я не могу получить доступ к каким-либо службам, работающим на хосте.

Изнутри контейнера я могу пинговать другие компьютеры в сети (IE 10.10.4.22) и иметь доступ в Интернет, но по какой-то причине я не могу пинговать хост в 10.10.4.19. Истекло время ожидания запроса.

Итак, вопрос, который я задаю, заключается в том, как я могу настроить сеть NAT с доступом в Интернет, где контейнеры могут взаимодействовать с хостом и другими контейнерами, а хост также может общаться со всеми контейнерами. И в идеале я мог бы настроить статические IP-адреса для каждой службы, где я мог бы настроить nginx или какой-либо другой обратный прокси-сервер на хосте, чтобы обрабатывать запросы прокси к каждому контейнеру.

Я попытался создать отдельный NAT с помощью docker network create -d NAT mynat, но он сообщает мне, что объект уже существует.

Я попытался получить доступ к экземпляру SQL хоста по IP-адресу 10.10.4.19 и адресу 172.20.xxx.1, определенному на виртуальном сетевом адаптере, однако ни один из них не будет подключаться к экземпляру SQL или любому веб-сайту / api, который у меня запущен на хосте. Однако контейнеры могут получить доступ к веб-сайтам / API других ПК в сети. Только не хозяин.

Итак, я думаю, я спрашиваю, можно ли вообще получить доступ к службам хоста изнутри контейнера?

Большая часть найденной мной документации основана на Linux, и я не уверен, можно ли ее использовать так же или нет.

Мы будем очень признательны за любое направление, которое может дать кто угодно.

РЕДАКТИРОВАТЬ:

Поиграв всю ночь с сетями докеров, я смог заменить сеть Docker NAT по умолчанию на свою собственную, чтобы я мог указать статический IP-адрес.

Для этого я добавил "bridge: "none" в файл daemon.json, расположенный в C: \ ProgramData \ Docker \ config. Это сделало так, что сеть NAT по умолчанию не создается по умолчанию

Затем я выполнил следующие команды в административной оболочке PowerShell, чтобы создать свою собственную сеть NAT.

PS C:\WINDOWS\system32> stop-service com.docker.service
PS C:\WINDOWS\system32> stop-service hns
PS C:\WINDOWS\system32> del 'C:\ProgramData\Microsoft\Windows\HNS\HNS.data'
PS C:\WINDOWS\system32> Get-ContainerNetwork | Remove-ContainerNetwork
PS C:\WINDOWS\system32> Get-NetNat | Remove-NetNat
PS C:\WINDOWS\system32> start-service hns
PS C:\WINDOWS\system32> start-service com.docker.service
PS C:\WINDOWS\system32> docker network create -d nat --subnet=192.168.1.0/24 --gateway=192.168.1.1 mynat
d0d31ecf39ec6cada948c3158b176e9a67d7e0ba6458208d9c91b240587c0763

Затем я могу запустить свои контейнеры с помощью следующей команды

docker run -itd --net=mynat --ip=192.168.1.25 --rm <containername>

Однако: я все еще не могу получить доступ к экземпляру SQL Server Express на хост-компьютере. Я думал, что смогу получить к нему доступ по адресу 192.168.1.1,1433 \ SQL2016 или 10.10.4.19 \ SQL2016, однако я получаю сообщение об ошибке: поставщик: Сетевые интерфейсы SQL, ошибка: 26 - Ошибка при обнаружении сервера / указанного экземпляра для обоих.

Проверка связи 192.168.1.1 действительно возвращает результаты, однако проверка связи 10.10.4.19 возвращает время ожидания запроса.

Я установил статический IP-адрес 192.168.1.1 на виртуальном сетевом адаптере, и это, похоже, ничего не помогло. Надеюсь, кто-то знает, как получить доступ к хосту из контейнера. Спасибо!

РЕДАКТИРОВАТЬ2:

Теперь я могу запустить api на хосте. Честно говоря, я не уверен, что изменилось. Но теперь я могу подключиться к службе по адресу http://192.168.1.1/api, работающей на хосте изнутри. контейнер.

ПРИМЕЧАНИЕ. Привязка порта, похоже, не работает при переходе к настройке статического IP-адреса в контейнере. Вы можете использовать службу только на порту EXPOSE в файле dockerfile, и запуск команды docker с -p 5600:9606 не отображается на 5600, он по-прежнему отображается только на 9606. вызов 192.168.1.25:9606 работает, но localhost: 5600 - нет.

Однако я все еще не могу подключиться к экземпляру SQL Server Express по IP-адресу 192.168.1.1. Я попытался добавить IP 192.168.1.1 в привязки SQL Server, но, похоже, это не сработало.

Параметры TCP IP для SQL Server

Я могу подключиться с хоста по адресу 10.10.4.19,1433 \ SQL2016, но не могу подключиться по адресу 192.168.1.1,1433 \ SQL2016, поэтому я предполагаю, что это проблема здесь. Брандмауэр Windows отключен.

Я также установил виртуальный сетевой адаптер NAT для использования статического IP 192.168.1.1, но все еще не могу подключиться к экземпляру SQL Server по адресу 192.168.1.1,1433 \ SQL2016

настройка сети


person Mechanic    schedule 19.05.2017    source источник
comment
Любой шанс, что я смогу объяснить причину отрицательных голосов или комментарий, чтобы помочь   -  person Mechanic    schedule 19.05.2017
comment
Это был хороший вопрос (и ответ, за который проголосовали оба), но вы могли бы сделать свой исходный вопрос более заметным и переместить свои две правки в ответ (которые вы затем можете принять)   -  person VonC    schedule 20.05.2017


Ответы (1)


Последнее, что мне нужно было сделать, это включить ipv4 и ipv6 (поскольку ipv6 использовался для некоторых проверок аутентификации, я думаю) на хост-сервере для sql server express 2016. И добавил правила брандмауэра.

Надеюсь, это поможет кому-то еще настроить локальную разработку и развертывание докеров на одном сервере.

введите здесь описание изображения

Единственное, что я до сих пор не могу сделать, это сопоставление портов хоста и контейнера.

person Mechanic    schedule 19.05.2017