Я использую docker-compose для развертывания серверного / клиентского приложения на разных устройствах в моей локальной сети.Моя настройка следующая:
В моем файле docker-compose.yml у меня есть служба под названием «сервер», которая зависит от двух дополнительных служб («база данных» и «сеть»).).Эти три службы работают на одном устройстве и могут успешно соединяться друг с другом.Служба 'server' развертывает API на основе Flask, который в идеале должен ожидать запросы от других устройств в той же локальной сети.
В том же файле docker-compose.yml яиметь службу под названием «клиент», которая запускает приложение, которое должно быть развернуто на нескольких устройствах в одной локальной сети.Служба «клиент», независимо от устройства, на котором она работает, должна иметь возможность отправлять запросы службе «сервер», которая находится на другом устройстве в той же локальной сети.
Вот мой файл docker-compose.yml:
version: '3.5'
networks:
outside:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.220.0/24
services:
client:
build: ./client
environment:
TZ: "Europe/Madrid"
command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone &&
nmap -p 8080 192.168.220.220 &&
python -u client/main_controller.py"
restart: always
volumes:
- .:/code
networks:
outside:
server:
build: ./server
environment:
TZ: "Europe/Madrid"
command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone &&
python -u server/main_server.py"
volumes:
- .:/code
ports:
- "8080:8080" # host:container
restart: always
depends_on:
- database
- web
networks:
default:
outside:
ipv4_address: 192.168.220.220
database:
image: mysql:latest
#command: ./database/run_db.sh #mysqld --user=root --verbose
restart: always
volumes:
- ./database:/docker-entrypoint-initdb.d/:ro
ports:
- "3306:3306" # host:container
environment:
MYSQL_ROOT_PASSWORD: root
networks:
default:
web:
image: nginx:latest
restart: always
ports:
- "8081:80"
volumes:
- ./interface:/www
- ./interface/nginx.conf:/etc/nginx/conf.d/default.conf
networks:
default:
Я использую библиотеку запросов python для отправки запросов с «клиента» на «сервер», используя следующий URL:
http://192.168.220.220:8080
Моя проблема в том, что, когда я запускаю оба контейнера, «client» и «service», на одном устройстве [deviceA], они могут успешно обмениваться данными.
Но когда я запускаю контейнеры в разныхУстройства («сервис» на компьютере с Mac OS X [устройство A] и «клиент» на Raspberry Pi [устройство B], оба подключены к той же локальной сети с помощью Wi-Fi), «клиент» не может связаться суказанный IP и порт.
Чтобы проверить, может ли устройство достигнуть комбинации IP: порт, я использую следующую команду сразу после запуска службы «клиент»:
nmap -p 8080 192.168.220.220
, которая даетследующий вывод на [устройство A]:
client_1 | Starting Nmap 7.01 ( https://nmap.org ) at 2019-03-03 12:22 Europe
client_1 | Nmap scan report for raspberry_escape_controller_server_1.raspberry_escape_controller_outside (192.168.220.220)
client_1 | Host is up (0.00012s latency).
client_1 | PORT STATE SERVICE
client_1 | 8080/tcp open http-proxy
client_1 | MAC Address: <mac_address> (Unknown)
client_1 |
client_1 | Nmap done: 1 IP address (1 host up) scanned in 0.71 seconds
и следующий на [deviceB]:
client_1 | Starting Nmap 7.40 ( https://nmap.org ) at 2019-03-03 13:24 CET
client_1 | Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
client_1 | Nmap done: 1 IP address (0 hosts up) scanned in 0.78 seconds
----------- [EDIT 1] -----------
Как подсказывает DTG , здесь вывод команды netstat на [deviceB]:
root@a9923f852423:/code# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.220.1 0.0.0.0 UG 0 0 0 eth0
192.168.220.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Похоже, что это такне может видеть [устройство A], которое должно быть 192.168.220.220