docker-compose соединяет сервер / клиентские контейнеры с разных устройств в локальной сети - PullRequest
0 голосов
/ 03 марта 2019

Я использую 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

1 Ответ

0 голосов
/ 03 марта 2019

Мне кажется, что даже если служба [deviceA] запущена и работает, существует какой-то брандмауэр, не разрешающий внешние подключения к нему извне.

Возможно, вам следует проверитьКонфигурация брандмауэра в [deviceA].

ВОПРОСЫ МАРШРУТА

Если это проблема маршрутизации, вы должны увидеть таблицу маршрутизации в hostB с

netstat -nr

И убедитесь, что существует допустимый маршрут к hostA

Если действительного маршрута не существует, вы должны добавить его с помощью

sudo route add -net hostA_IP/MASK gw HOSTB_DEFAULT_GATEWAY

INTER DOCKERS COMUNICATIONS

После создания сети,вы можете запускать контейнеры на нем с помощью опции docker run --network =.Контейнеры, которые вы запускаете в этой сети, должны находиться на том же хосте Docker.Каждый контейнер в сети может немедленно связываться с другими контейнерами в сети.

Подробнее о понимании связи с докером: См. Документацию докера здесь

...