Как я могу использовать mpirun с главным и подчиненным узлами, которые являются контейнерами Docker на разных машинах? - PullRequest
0 голосов
/ 06 ноября 2019

Допустим, у нас есть две машины, A и B, в одной локальной сети. Их IP-адреса 10.0.0.1 и 10.0.0.2, соответственно, ради этого аргумента. Брандмауэры на обеих машинах настроены так, чтобы разрешать соединения на всех портах. Мы проверяем, что A может подключаться к B с помощью SSH и наоборот.

Мы будем использовать (почти) те же самые файлы Dockerfile и docker-compose.yml для развертывания контейнеров на A и B. Dockerfile содержит:

FROM danieldv/hode:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN service ssh restart

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

RUN cat /dev/zero | ssh-keygen -q -N ""
RUN echo 'Host *\n    Port 2222' >> ~/.ssh/config

EXPOSE 22
CMD /usr/sbin/sshd -D

И файл docker-compose.yml содержит:

version: "3"
services:
  dc_test:
    build: .
    ports:
      - "2222:22"
      - "10000-10100:10000-10100"
    environment:
      MPICH_PORT_RANGE: "10000:10100"
    extra_hosts:
      - "master:10.0.0.1"
      - "slave:10.0.0.2"
    hostname: master

Где мы заменим «master» на «slave» на компьютере B. Обратите внимание, что базовый контейнер, danieldv/hode:latest, это контейнер, который я сам создал (доступен на Docker Hub), в котором установлен MPICH (а также куча других вещей, которые я часто использую, которые не имеют отношения к этому вопросу).

Обратите внимание, что мы используем порт2222 для SSH в контейнеры на A и B, чтобы избежать конфликтов с портом 22 на их соответствующих хост-компьютерах. Также обратите внимание, что мы пересылаем порты в диапазоне 10000:10100 и ограничиваем MPI только использованием портов в этом диапазоне для соединений.

Сначала мы запускаем контейнер на B, выполняя

docker-compose build
docker-compose up -d

из B.

Затем мы создаем и входим в контейнер на A, выполняя

docker-compose build
docker-compose run dc_test bash

от A.

Далее мы отправляем открытый ключ ssh от master до slave, используя ssh-copy-id slave из оболочки контейнера master. Мы проверяем, что можем войти в slave из master, используя ssh slave.

Наконец, мы запускаем mpirun -hosts master,slave hostname. Ожидаемый результат этой команды:

master
slave

сохранить из заказа. Тем не менее, на самом деле я получаю вывод:

master
[proxy:0:1@slave] HYDU_sock_connect (utils/sock/sock.c:172): unable to connect from "slave" to "master" (Connection timed out)
[proxy:0:1@slave] main (pm/pmiserv/pmip.c:185): unable to connect to server master at port 10000 (check for firewalls!)

Что я могу сделать, чтобы эта настройка работала? Или то, что я пытаюсь сделать, просто невозможно? Если да, кто-нибудь может привести подробный рабочий пример?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...