Назад | Перейти на главную страницу

Контейнер Docker не может подключиться к общедоступному порту другого контейнера

У меня есть два контейнера докеров, которые не связаны (SMTP + веб-сервер). Контейнер SMTP предоставляет порт 25 для всех интерфейсов. (docker run -p 25:25 smtp). Я могу добраться до него снаружи.

Однако мой веб-контейнер не может подключиться к порту 25 контейнера SMTP (через общедоступный IP-адрес хоста). Разве нельзя к нему подключиться? Порт открыт для всего мира.

В чем техническая причина проблемы с подключением?


Кто-то еще спросил это на Reddit, но толкового ответа там не было.

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

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

Ваш веб-контейнер должен иметь возможность связываться с SMTP-сервером через порт 25 хоста докера, поскольку вы настроили эту карту между хостом и контейнером SMTP. Используя общедоступный адрес хоста, ваш веб-контейнер сможет взаимодействовать с контейнером SMTP.

Обновить: Я написал тестовый пример, который мне подходит. Не могли бы вы подтвердить, что это не работает в вашей среде. Не стесняйтесь менять порты сервера с 5000 ко всему, что вы хотите, убедитесь, что вы заменили все экземпляры. В клиенте app.py добавьте свой IP в большой [YOUR PUBLIC IP] немного. Вам не нужен питон на вашем компьютере, чтобы проверить это - но образ alpine занимает всего около 80 МБ.

Сервер

app.py

from xmlrpc import server

serv = server.SimpleXMLRPCServer(('0.0.0.0', 5000))

 def echo(word):
    return "echo: {}".format(word)

serv.register_function(echo)
serv.serve_forever()

Dockerfile

FROM python:3-alpine
WORKDIR /app
COPY app.py .
EXPOSE 5000
ENTRYPOINT python app.py

Строить с docker build -t server:tobyd

Бежать с docker run -d -p 5000:5000 server:tobyd

Клиент

app.py

from xmlrpc import client
proxy = client.ServerProxy('http://[YOUR PUBLIC IP]:5000')

for i in range(10):
    print(proxy.echo('cats'))

Dockerfile

FROM python:3-alpine
WORKDIR /app
COPY app.py .
ENTRYPOINT python app.py

Строить с docker build -t client:tobyd

Бежать с docker run -d --name client_tobyd client:tobyd

Ожидания
docker logs client_tobyd должен иметь cats распечатано 10 раз.