Вопрос или проблема
Я хотел добавить свой локальный компьютер с Windows в сеть Docker Swarm на своих серверах Linux, чтобы создать локальную среду разработки для контейнера Docker на ASP.NET Core, который будет работать на узле менеджера Swarm в продакшене. Visual Studio до сих пор не поддерживает удаленную разработку через SSH, и постоянная отправка кода на сервер и сборка там слишком утомительна для разработки и тестирования.
Проблема:
Насколько я понимаю, служба Docker Swarm работает в среде Hyper-V, привязанной к сети ingress, и слушает порты Swarm 7946 / 4789. Однако эти порты не опубликованы на моем хосте Windows 10. Я даже могу привязать эти порты к 0.0.0.0 на своем хосте. Только когда я пытаюсь запустить контейнер Docker с этими опубликованными портами, он говорит мне, что они уже заняты. Есть ли способ, как я могу перенаправить порты хоста 7946 / 4789 на службу Swarm?
Что я пробовал до сих пор, так это привязка сети ingress к моему адаптеру Ethernet, удалив сеть ingress и запустив
docker network create --driver overlay --ingress --subnet=10.0.0.0/24 --gateway=10.0.0.1 --opt "com.docker.network.windowsshim.interface=Ethernet 2" ingress
но это не помогло!
Вот некоторая информация о системе:
ipconfig:
Конфигурация IP Windows
Адаптер Ethernet Ethernet 2:
Специфический DNS-суффикс подключения . :
IPv6-адрес. . . . . . . . . . . : 2a00:1358:e2f1:3b00:4202:9e83:fa24:6707
Временный IPv6-адрес. . . . . . : 2a00:1358:e2f1:3b00:92c:7ade:660f:c77d
Временный IPv6-адрес. . . . . . : 2a00:1358:e2f1:3b00:9c95:3ae0:6431:b4da
Локальный IPv6-адрес. . . . . . : fe80::1cb7:4e4e:a8fb:93ee%13
IPv4-адрес. . . . . . . . . . . : 192.168.10.82
Маска подсети . . . . . . . . . . . : 255.255.255.0
Шлюз по умолчанию . . . . . . . . . : fe80::1%13
192.168.10.254
Адаптер Ethernet vEthernet (Default Switch):
Специфический DNS-суффикс подключения . :
Локальный IPv6-адрес . . . . . : fe80::eaf2:dbaf:f9d:638%35
IPv4-адрес. . . . . . . . . . . : 172.27.128.1
Маска подсети . . . . . . . . . . . : 255.255.240.0
Шлюз по умолчанию . . . . . . . . . :
Адаптер Ethernet vEthernet (WSL):
Специфический DNS-суффикс подключения . :
Локальный IPv6-адрес . . . . . : fe80::3ee5:43db:efc8:1705%78
IPv4-адрес. . . . . . . . . . . : 172.22.96.1
Маска подсети . . . . . . . . . . . : 255.255.240.0
Шлюз по умолчанию . . . . . . . . . :
docker network inspect ingress
[
{
"Name": "ingress",
"Id": "0hrgne7zeoddycvgqnwcpwhk0",
"Created": "2024-11-12T19:36:51.519811517Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": true,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"ingress-sbox": {
"Name": "ingress-endpoint",
"EndpointID": "14a6b225aada0dfc1753e8d0f9ddc410a659fef4d293bb431bed5970e4091929",
"MacAddress": "02:42:0a:00:00:02",
"IPv4Address": "10.0.0.2/24",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4096",
"com.docker.network.windowsshim.interface": "Ethernet 2"
},
"Labels": {},
"Peers": [
{
"Name": "3af7970abd29",
"IP": "192.168.65.3"
}
]
}
]
hnsdiag list networks
Сеть : C08CB7B8-9B3C-408E-8E30-5E16A3AEB444
Имя : Default Switch
Тип : ICS
Адрес подсети : 172.27.128.0/20
Шлюз : 172.27.128.1
Сеть : B95D0C5E-57D4-412B-B571-18A81A16E005
Имя : WSL
Тип : ICS
Адрес подсети : 172.22.96.0/20
Шлюз : 172.22.96.1
Get-VMSwitch
Имя SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
Default Switch Internal
WSL Internal
Для тестирования я просто попытался инициализировать swarm как менеджер:
docker swarm init
Swarm initialized: current node (lyk12wrxsk7cf2ma6wmln2m4m) is now a manager.
Чтобы добавить рабочего в этот swarm, выполните следующую команду:
docker swarm join --token SW.. 192.168.65.3:2377
Сервис доступен из контейнера в сети ingress
nc -vz 192.168.65.3 2377
192.168.65.3 (192.168.65.3:2377) open
Таким образом, теоретически я мог бы развернуть контейнер службы Docker, который перенаправляет опубликованные порты хоста на службу Swarm, но должен быть лучший способ?
Обновление:
Я попытался перенаправить порты с помощью контейнера socat:
trajano/multisocat:latest "/multisocat" 11 минут назад Запущен 11 минут 0.0.0.0:12377->2377/tcp, 0.0.0.0:14789->4789/udp, 0.0.0.0:17946->7946/tcp, 0.0.0.0:17946->7946/udp socat_relay.1.1ogxoypz2h1q0rxigh4hom8do
Оказывается, эти порты также не слушают на моем хосте! Хотя я использовал mode: host
- target: 4789
published: 14789
protocol: udp
mode: host
Когда я запускаю свой хост как отдельный менеджер, порты на реле открываются на хосте.
Ответ или решение
Проблема недоступности узла-работника Docker Swarm на Windows
Ваша ситуация с недоступностью узла-работника Docker Swarm на Windows требует комплексного подхода для решения. В данном ответе мы рассмотрим основные причины проблем в вашем окружении, а также предложим некоторые шаги для их устранения.
Понимание сетевой архитектуры Docker Swarm
Docker Swarm использует несколько сетевых технологий, включая модули, такие как overlay и ingress, для управления распределенными контейнерами. Вы правы, что ingress-сеть связана с уникальными портами, такими как 7946 и 4789. Эти порты предназначены для управляемой коммуникации между узлами Swarm, но они не всегда доступны извне из-за ограничений, связанных с Hyper-V на Windows.
При этом, поскольку Windows использует Hyper-V, ваша система автоматически создает виртуальные сетевые адаптеры. Это может стать причиной конфликтов портов, которые вы наблюдаете, когда стараетесь привязать их к вашему хосту.
Проверка состояния сети
-
Проверка конфигурации сети: Убедитесь, что ваша сеть Docker настроена правильно. Использование команды
docker network inspect ingress
позволяет вам увидеть текущее состояние сети. На основании вашего вывода видно, что ingress сеть настроена для использования overlay в виртуальной среде. -
Проверка открытых портов на хосте: Используйте такие инструменты, как
netstat
, чтобы проверить, какие порты действительно открыты на вашем Windows-хосте. Это необходимо, поскольку даже если Docker говорит, что порты не заняты, это может быть связано с работой других приложений или правилами брандмауэра.
Нахождение решения
-
Настройка брандмауэра: Убедитесь, что ваш Windows Defender или сторонние брандмауэры настроены на разрешение трафика через 7946 и 4789. Это может быть необходимым шагом, чтобы сделать порты доступными для вашего узла-работника.
-
Переопределение сетевого интерфейса: Попытка привязки ingress сети к вашему Ethernet адаптеру, как вы делали, несколько раз была доказана изолированной к тому, что она не работает с Hyper-V. Если возможно, попробуйте использовать другие сетевые адаптеры или настройки.
-
Проверка статуса служб Docker: Выполните команду
docker service ls
, чтобы проверить, правильно ли работают ваши службы и не находятся ли они в состоянии сбоя. Это поможет понять, являются ли проблемы сетевыми или связанными с самим Docker. -
Кастомизация контейнерй: Использование Docker-сетевого контейнера для перенаправления портов, как вы уже пытались с
socat
, является разумным подходом, но может потребовать дополнительной настройки сети на хосте. -
Подключение к Linux-серверу: Если у вас есть возможность, настройте SSH туннелирование для подключения к вашему Linux-серверу из Windows. Это позволит вам тестировать и разрабатывать код локально через виртуальную частную сеть (VPN).
Заключение
Ваша задача по интеграции Windows-узла в Swarm сетевую архитектуру имеет множество потенциальных сложностей, особенно в свете ограничений Hyper-V. Это требует детального анализа текущих сетевых настроек и возможно, использования альтернативных решений для вашего рабочего процесса. Продолжайте отслеживать порты и сетевые подключения, а также экспериментируйте с различными способами туннелирования, чтобы найти наилучший функциональный подход.