- 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