5

Я пытаюсь заставить мое приложение нормально работать в Docker, но у меня проблемы с ним.

Приложение подключается к удаленному FTP-серверу в режиме PASV и помещает файл. Довольно просто и отлично работает без докера. Ни FTP-сервер, ни клиент не находятся за NAT; но клиент становится NAT'd, потому что я использую мостовую сеть Docker. (Использование конфигурации моста по умолчанию http://pastie.org/10954592)

Если я смотрю tshark на FTP-сервере при запуске клиентского приложения, оно обменивается большим количеством пакетов, поэтому оно "подключается" к серверу, но приложение ничего не получает обратно. Это заставляет меня предположить, что когда FTP-сервер пытается ответить на этот эмпирический порт, он не перенаправляется обратно в контейнер Docker из хост-ОС.

Итак, надеемся подвести итог, есть ли хороший способ, чтобы эти порты pasv были правильно перенаправлены на док-мост? Ограничение: У меня нет контроля над FTP-сервером на производстве, поэтому я не могу просто жестко закодировать список портов pasv для iptables.

Спасибо за любые идеи!

1 ответ1

0

PASV FTP отлично работает внутри контейнеров Docker.

С помощью Docker Swarm становится сложнее, но это возможно с одной репликой или в режиме развертывания mode:global с отображением портов с использованием mode:host .

Поскольку режим PASV является состоянием, последующие запросы необходимо направлять на тот же узел в кластере.

Пример стека с использованием режима хоста

services:
  ftp:
    image: vendor/vsftpd
    ports:
      - { target: 20,    published: 20, mode: host }
      - { target: 21,    published: 21, mode: host }
      - { target: 21100, published: 21100, mode: host }
      - { target: 21101, published: 21101, mode: host }
      - { target: 21102, published: 21102, mode: host }
    deploy:
      mode: global

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .