Допустим, у нас есть две машины, 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!)
Что я могу сделать, чтобы эта настройка работала? Или то, что я пытаюсь сделать, просто невозможно? Если да, кто-нибудь может привести подробный рабочий пример?