FTP 客户端无法在 Docker 容器内工作

Isk*_*kar 6 networking ftp nat iptables docker

我试图让我的应用程序在 Docker 中正常运行,但遇到了问题。

该应用程序以 PASV 模式连接到远程 FTP 服务器,并 PUT 文件。非常简单,无需 docker 即可正常工作。FTP 服务器和客户端都不在任何 NAT 之后;但是客户端变成了 NAT,因为我使用的是 Docker 桥接网络。(使用默认网桥配置http://pastie.org/10954592

如果我在运行客户端应用程序时查看 FTP 服务器上的 tshark,它会交换大量数据包,因此它正在“连接”到服务器,但应用程序没有收到任何回复。这让我假设当 FTP 服务器尝试在该经验端口上响应时,它不会从主机操作系统路由回 Docker 容器。

所以,希望总结一下,有没有什么好的方法可以将这些 pasv 端口正确转发到 docker 网桥?约束:我无法控制生产中的 FTP 服务器,所以我不能简单地硬编码 iptables 的 pasv 端口列表。

感谢您的任何想法!

Rya*_*yan 1

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
Run Code Online (Sandbox Code Playgroud)