У меня есть два контейнера докеров, которые не связаны (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 раз.