Разрешение Dns Не Выполняется, Когда Контейнер Запускается Через Docker-Compose

  • Автор темы Genry_real
  • Обновлено
  • 22, Oct 2024
  • #1

Недавно я решил опробовать контейнеры Windows и использую для этой цели свой частный сервер Minecraft (в качестве хобби-проекта).

У меня есть подготовленный образ на базе Windows Server Core 2022.

Когда я запускаю контейнер вручную, он работает отлично:

 
 
 dns: <DNS server IP>
 

(я монтирую папку сервера Minecraft, чтобы обеспечить постоянную конфигурацию мира и сервера)

Однако я обычно использую следующий файл docker-compose, чтобы упростить этот процесс:

services: mc-server: build: context: . dockerfile: Dockerfile_server2022 image: minecraft:winserver2022 platform: windows container_name: MinecraftServer restart: unless-stopped ports: - "25565:25565" volumes: - type: bind source: C:/MinecraftDocker/MinecraftServer target: C:/MinecraftServer

При этом контейнер и серверный процесс внутри него запускаются нормально, но подключение к нему приводит к некоторому сообщению об ошибке, утверждающему, что серверы аутентификации Minecraft не работают (конечно, это не так). Почти идентичный файл компоновки прекрасно работает с контейнерами Linux (в той же хост-системе).

Самое странное, что я создал этот образ, который использую для запуска contianer вручную, с помощью вышеупомянутого файла компоновки. Мне кажется, что при запуске службы через docker-compose что-то блокирует связь контейнера с серверами mojang, но не входящие соединения от клиентов (я вижу неудачную попытку подключения и имя подключающейся учетной записи на серверах консольный вывод). Однако я не могу хоть убей понять, что именно. Я попытался удалить из файла создания все, кроме самого минимума (контекст, порты и тома), но безрезультатно.

Есть ли какие-либо существенные различия в том, как docker-compose настраивает сеть и брандмауэры в контейнере, и в том, что делает docker run? В частности, во взаимодействии с ядром сервера Windows?

РЕДАКТИРОВАТЬ: DNS виноват Я покопался еще немного и нашел URL-адреса API-серверов, с которыми взаимодействует серверное приложение Minecraft при проверке личности клиента. Это привело меня к выводу, что любое разрешение DNS из контейнера завершается с ошибкой, когда он запускается через docker-compose, но не при запуске через docker run. В любом случае он может нормально пинговать соответствующие IP-адреса. Вопрос в том, почему?

РЕДАКТИРОВАТЬ2: обходной путь Оказывается, докер-контейнер пытается получить ответы DNS от шлюза, настроенного в создании сети, и по какой-то причине получает только ответы «сбой сервера». И наоборот, docker run просто захватывает конфигурацию DNS хоста, поэтому это работает.

Когда я переопределяю основной DNS-сервер контейнера, созданный с помощью docker-compose, добавляя его в конфигурацию службы, он внезапно может прекрасно разрешать имена хостов:

docker run -it -p 25565:25565 --mount type=bind,source="C:\MinecraftDocker\MinecraftServer",target=C:/MinecraftServer minecraft:winserver2022

Хотя мне бы очень хотелось выяснить, почему контейнер не получает ответа от сетевого шлюза, это, по крайней мере, полезный обходной путь. Буду признателен за любые дополнительные идеи или идеи относительно основной причины или того, почему эта проблема не возникает для контейнеров Linux, запущенных через Compose, но моя насущная проблема, по крайней мере, решена.

#docker #docker-compose #dockerfile #windows

Genry_real


Рег
22 Sep, 2006

Тем
65

Постов
192

Баллов
547
  • 25, Oct 2024
  • #2

Обходной путь

Хотя я не нашел основной причины того, почему это влияет только на конкретную комбинацию контейнеров Windows и docker-compose, я хочу добавить обходной путь, упомянутый во втором редактировании, для пользы других людей:

Я решил свою проблему, переопределив основной DNS-сервер контейнера. После добавления этого в конфигурацию службы он внезапно смог нормально разрешать имена хостов:

 
 services:

mc-server:

build:

context: .

dockerfile: Dockerfile_server2022

image: minecraft:winserver2022

platform: windows

container_name: MinecraftServer

restart: unless-stopped

ports:

- "25565:25565"

volumes:

- "C:/MinecraftDocker/MinecraftServer:C:/MinecraftServer"
 

Оказывается, докер-контейнер пытается получить ответы DNS от шлюза, настроенного в сети, которую генерирует Compose, и по какой-то причине получает только ответы «сбой сервера». И наоборот, docker run просто захватывает конфигурацию DNS хоста, поэтому это работает. Почему это затрагивает только мои контейнеры Windows, я не знаю.

Дальнейшее чтение:

DNS в ссылке на файл создания

Руководство по работе в сети в Compose

 

Lyanchik


Рег
20 Jun, 2006

Тем
70

Постов
201

Баллов
571
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно