Попытка подключиться к разъему Python внутри Docker-контейнера с хоста - PullRequest
0 голосов
/ 06 мая 2019

Я должен внедрить в свой класс Распределенных систем Алгоритм Беркли, и я решил сделать это на python с сокетами.Предполагается, что ведущий работает на хосте, а ведомые - в док-контейнерах.

Самое близкое, что я получил от подключения хоста (в качестве главного устройства) к контейнеру (в качестве ведомого устройства), отображало порты с флагом -p 9000:9000 для запуска контейнера, хост успешно подключается к контейнеру, ноне получает и не отправляет ничего (то же самое для контейнера), с этим я пришел к выводу, что сокет python внутри процесса просто не получает пакеты из порта.Я уже пробовал использовать флаг -net=host, но хост просто не может найти контейнер.Один из моих достижений состоял в том, чтобы создать два контейнера докеров и пропинговать один из другого, используя имя хоста, указанное в /etc/hosts, но это не то, чего я действительно хочу.

У меня весь код в github если вам нужен источник.Код комментируется на английском языке, но документация на португальском

Подводя итог, все, что я хочу сделать, - это открыть сокет с python внутри контейнера докера и иметь возможность подключиться к хост-машине, какую сетьКонфигурация, мне нужно, чтобы я мог это сделать?

РЕДАКТИРОВАТЬ: Подробнее

Следующий скрипт bash используется для создания трех контейнеров докеров, а затем выполнения команды в каждом из них для клонированиямой репозиторий, перейдите в него и в тестовую папку, содержащую bash, чтобы запустить подчиненное устройство, а затем запустить мастер на хосте:

docker run -it -d -p 127.0.0.1:9000:9000/tcp --name slave1 python bash
docker run -it -d -p 127.0.0.1:9001:9001/tcp --name slave2 python bash
docker run -it -d -p 127.0.0.1:9002:9002/tcp --name slave3 python bash

docker exec -t -d slave1 bash -c 'git clone https://github.com/guilhermePaciulli/BerkeleyAlgorithm.git;cd BerkeleyAlgorithm;git pull;cd test;bash slave_1.sh'
sleep 1
docker exec -t -d slave2 bash -c 'git clone https://github.com/guilhermePaciulli/BerkeleyAlgorithm.git;cd BerkeleyAlgorithm;git pull;cd test;bash slave_2.sh'
sleep 1
docker exec -t -d slave3 bash -c 'git clone https://github.com/guilhermePaciulli/BerkeleyAlgorithm.git;cd BerkeleyAlgorithm;git pull;cd test;bash slave_3.sh'
sleep 1

bash test/master.sh

Для запуска каждого экземпляра я использую другую команду bash

  • Для создания экземпляра ведомого, который я использую:
python ../main.py -s 127.0.0.1:9000 175 logs/slave_log_1.txt

-s - это флаг, который сообщает классу main.py, что это подчиненное устройство, 127.0.0.1:9000 - это ipи порт, который этот подчиненный будет слушать (и мастер будет подключаться), а остальные - просто конфигурации (этот пример используется для первого подчиненного).

  • И для insПодтвердите мастер, которого я использую:
python ./main.py -m 127.0.0.1:8080 185 15 test/slaves.txt test/logs/master_log.txt

Так же, как и ведомый, -m сообщает main, что это мастер, 127.0.0.1:8080 - это ip и порт, к которому мастер собирается подключитьсядля раба, а остальные просто конфигурации.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Когда вы запускаете процесс серверного типа внутри контейнера Docker, его необходимо настроить для прослушивания по специальному адресу «все интерфейсы» 0.0.0.0. Каждый контейнер имеет свое собственное понятие localhost или 127.0.0.1, и если вы установите процесс для прослушивания или привязки к 127.0.0.1, он может быть достигнут только из его собственного localhost, который отличается от всех других контейнеров 'localhost и хост localhost.

В показанной вами серверной команде вы запустите что-то вроде

python ../main.py -s 0.0.0.0:9000 175 logs/slave_log_1.txt

(Строго подумайте о создании Dockerfile, чтобы описать, как создать и запустить свой образ. Запуск нескольких пустых контейнеров, git clone в каждый, а затем запуск процессов вручную - это большая ручная работа, которую можно потерять, как только вы docker rm контейнер.)

0 голосов
/ 06 мая 2019

Я просмотрел ваш код и увидел, что вы создали сокет сервера и связали его с портом и прослушивали, но я не смог найти, где вы вызываете метод socket.accept ()?

...