首页 > 解决方案 > 如何将 mpirun 与主节点和从节点一起使用,它们都是不同机器上的 Docker 容器?

问题描述

假设我们在同一个本地网络上有两台机器 A 和 B。为了这个论点,它们的 IP 地址分别是 10.0.0.1 和 10.0.0.2。两台机器上的防火墙都已设置为允许所有端口的连接。我们验证 A 可以使用 SSH 连接到 B,反之亦然。

我们将使用(几乎)相同的文件Dockerfiledocker-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

danieldv/hode:latest我们将在计算机 B上用 'slave' 替换 'master'使用与此问题无关的)。

请注意,我们使用端口2222SSH 连接到 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 公钥从容器的外壳发送masterslave使用。我们验证我们可以使用.ssh-copy-id slavemasterslavemasterssh 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!)

我该怎么做才能使此设置正常工作?还是我想做的事情根本不可能?如果是,有人可以给我一个详细的工作示例吗?

标签: dockerdocker-composempi

解决方案


推荐阅读