Доступ к сервису ftp через другой докер-контейнер - PullRequest
0 голосов
/ 22 января 2019

У меня есть приложение Golang, и оно должно подключаться к FTP-серверу.

Теперь и приложение Golang, и FTP-сервер подключены к док-станции, но я не знаю, как подключиться к FTP-серверу изПриложение Golang

Вот мой 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, все службы работают.

Я могу получить IP-адрес контейнера ftp с:

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

И затем я установил ftp-клиент для alpine в свой контейнер golang, 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...]

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Как минимум, вам нужен 21 / TCP для команд и 20 / TCP для данных на ftp-сервере:

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

Я немного изменил ваш compose-файл:

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-сервере файл /home/test/1 и вижу его из mygoapp-контейнера:

/ # 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
0 голосов
/ 22 января 2019

Сначала упростите свой 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 к localhost или 127.0.0.1 делает ее доступной только локально.

Наконец, используйте имена служб для подключения. Забудьте о ip адресах и docker inspect. Ваше соединение от myappgo до ftp будет выглядеть как ftp://ftpd-server/foo/bar

...