Я создаю Dockerized систему, которая будет создавать и отключать различные типы серверов в HTTP API для целей тестирования интеграции. Я начинаю свой проект с экспериментов по созданию и запуску нескольких FTP-серверов одновременно.
Я хочу запускать FTP-серверы на разных IP-адресах, чтобы тесты могли создавать и отключать серверы, не мешая друг другу. В будущем это должно позволить при необходимости распараллеливать тесты.
В моем контейнере Docker я настроил различные сети в соответствии с этой конфигурацией Docker Compose:
version: '2'
services:
missive-box-of-tricks:
image: missive-box-of-tricks
networks:
network-01:
aliases:
- network-01
network-02:
aliases:
- network-02
network-03:
aliases:
- network-03
network-04:
aliases:
- network-04
network-05:
aliases:
- network-05
(trimmed - there's 10 of these)
networks:
network-01:
driver: bridge
network-02:
driver: bridge
network-03:
driver: bridge
network-04:
driver: bridge
network-05:
driver: bridge
(trimmed - there's 10 of these)
Это приводит к набору сетей внутри контейнера (снова обрезанных):
~ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:14:00:02
inet addr:172.20.0.2 Bcast:172.20.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3249 (3.1 KiB) TX bytes:0 (0.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:AC:16:00:02
inet addr:172.22.0.2 Bcast:172.22.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3249 (3.1 KiB) TX bytes:0 (0.0 B)
eth2 Link encap:Ethernet HWaddr 02:42:AC:15:00:02
inet addr:172.21.0.2 Bcast:172.21.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3249 (3.1 KiB) TX bytes:0 (0.0 B)
eth3 Link encap:Ethernet HWaddr 02:42:AC:17:00:02
inet addr:172.23.0.2 Bcast:172.23.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3249 (3.1 KiB) TX bytes:0 (0.0 B)
eth4 Link encap:Ethernet HWaddr 02:42:AC:18:00:02
inet addr:172.24.0.2 Bcast:172.24.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3249 (3.1 KiB) TX bytes:0 (0.0 B)
Сетевые псевдонимы разрешимы, поэтому я ожидаю, что FTP-сервер сможет прослушивать network-01
и т.д. Я использую эту команду для запуска сервера изнутри контейнера:
PUBLIC_HOST=network-01
# -P -Force the specified IP address in reply to a PASV/EPSV/SPSV command
# -S -Connections are accepted on the specified IP and port
# -l -This is the authentication type, in the form "protocol:path"
# -E -Only allow authenticated users (if you wanted anonymous only you would substitute -e).
# -j -If the user doesn't have a home directory create it at first login.
# -R -Disallow the usage of the chmod command.
# -B -Instruct the standalone server to start in the background
# -g -Custom pidfile location (defaults to /var/run/pure-ftpd.pid)
# -d Verbose logging
/usr/sbin/pure-ftpd \
-S $PUBLIC_HOST \
-p $MIN_PASV_PORT:$MAX_PASV_PORT \
-g $PID_FILE \
-l $USER_DB \
-d \
-E \
-j \
-R
Я сбросил PID и файлы базы данных пользователей, чтобы избежать конфликта, но на самом деле даже один сервер не запускается. Я получаю такую ошибку:
Невозможно запустить автономный сервер: адрес недоступен
Я получу то же самое, если добавлю декларацию PASV:
-P $PUBLIC_HOST \
Я также получу то же самое, если укажу IP-адрес явно, а не использую переменную среды.
Итак, почему этот IP-адрес недоступен? Есть ли другой способ создать диапазон IP-адресов внутри среды Docker, а затем привязать экземпляр PureFTP для прослушивания только одного?
Это решено. Для прослушивания определенного IPv4-адреса нельзя просто использовать чистый IP-адрес, а разделитель портов в виде двоеточия не распознается.
Допустимые синтаксисы используют запятую, например, для порта по умолчанию и конкретного порта соответственно:
-S 192.168.0.42,
-S 192.168.0.42,8021