【问题标题】:Access ftp service via other docker container通过其他 docker 容器访问 ftp 服务
【发布时间】:2019-01-22 13:52:24
【问题描述】:

我有一个 Golang 应用程序,它应该连接到 FTP 服务器。

现在,Golang app 和 FTP Server 都是 dockerized,但我不知道如何从 Golang app 连接到 FTP 服务器

这是我的 docker-compose.yml

version: '2'

services:
  myappgo:
    image: myappgo:exp
    volumes:
      - ./volume:/go
    networks:
      myappgo_network:
    env_file:
      - test.env

  ftpd-server:
    container_name: ftpd-server
    image: stilliard/pure-ftpd:hardened
    ports:
      - "21:21"
      - "30000-30009:30000-30000"
    environment:
      PUBLICHOST: "localhost"
      FTP_USER_NAME: "test"
      FTP_USER_PASS: "test"
      FTP_USER_HOME: "/home/test"
    restart: on-failure
    networks:
      myappgo_network:

networks:
  myappgo_network:

当我运行 docker compose 时,所有服务都已启动。

我可以通过以下方式获取 ftp 容器的 IP:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ftpd-server

然后,我在我的 golang 容器中为 alpine 安装了一个 ftp 客户端,lftp:

docker exec -it my_app_go sh
apk add lftp
lftp -d ftp://test:test@172.19.0.2 # -d for debug
lftp test@172.19.0.2:~> ls
---- Connecting to 172.19.0.2 (172.19.0.2) port 21
`ls' at 0 [Connecting...]

我错过了什么?

【问题讨论】:

  • 端口线好吗? ```- "30000-30009:30000-30000"```` 最后30000应该是30009吧?

标签: docker ftp docker-compose docker-networking


【解决方案1】:

至少,您需要 21/TCP 用于命令,20/TCP 用于 ftp-server 上的数据:

ports:
  - "21:21"
  - "20:20"
  - "30000-30009:30000-30009"

我稍微更改了您的撰写文件:

version: '2'

services:
  myappgo:
    image: alpine:3.8
    tty: true
    networks:
      swarm_default:

  ftpd-server:
    container_name: ftpd-server
    image: stilliard/pure-ftpd:hardened
    ports:
      - "21:21"
      - "20:20"
      - "30000-30009:30000-30009"
    environment:
      PUBLICHOST: "localhost"
      FTP_USER_NAME: "test"
      FTP_USER_PASS: "test"
      FTP_USER_HOME: "/home/test"
    restart: on-failure
    networks:
      swarm_default:

networks:
  swarm_default:

然后我在 ftp-server 文件 /home/test/1 上创建,我可以从 mygoapp-container 看到它:

/ # lftp ftp://test:test@172.19.0.2
lftp test@172.19.0.2:/> dir
-rw-r--r--    1 0          0                   0 Jan 22 14:18 1

【讨论】:

【解决方案2】:

首先简化你的dockerfile

version: '3'  # i assume you can migrate to version 3, yes?
services:
  myappgo:
    image: myappgo:exp
    volumes:
      - ./volume:/go
    env_file:
      - test.env
  ftpd-server:
    image: stilliard/pure-ftpd:hardened
    environment:
      PUBLICHOST: "0.0.0.0"
      FTP_USER_NAME: "test"
      FTP_USER_PASS: "test"
      FTP_USER_HOME: "/home/test"
    restart: on-failure

第二,默认网络由docker-compose创建;不需要明确地这样做。所有服务都以它们的名字连接到它,所以你不是通过ip而是通过像ftpd-server这样的名字来访问它们

第三,如果你从内部访问它们,你不需要暴露你的端口。如果你需要从外部访问它们,那么你就暴露了。

接下来,启动 ftp 并绑定到 0.0.0.0 - 将任何 tcp 服务绑定到 localhost127.0.0.1 使其只能在本地访问。

最后,使用服务名称进行连接。忘记ip 地址和docker inspect。您从 myappgo 到 ftp 的连接看起来像 ftp://ftpd-server/foo/bar

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2021-08-21
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多