基于docker的MPI安装

本文详细介绍了如何在Docker环境下安装MPI并配置多节点通信。首先,从下载CentOS7镜像开始,通过yum安装相关依赖,然后下载并安装MPICH,配置SSH无密码登录。接着,创建一个docker网络段,启动三个容器作为MPI节点,并实现SSH免密登录。最后,编写并运行简单的MPI程序,验证集群配置的成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、制作MPI镜像

1.下载centos7镜像并安装mpi

拉去centos7的镜像,并查看其镜像ID

docker pull centos:7
docker images

在这里插入图片描述

# 取前几位imageID即可
docker run -it eeb6 /bin/bash

进入容器后,首先下载必要的库

yum -y update
yum -y install openssh-clients
yum -y install openssh-server
yum -y install nano
yum -y install net-tools
yum -y install gcc
yum -y install gcc-c++
yum -y install gcc-gfortran
yum -y install sudo
yum -y install passwd
yum -y install make
yum -y install nfs-utils

这里先回到window,下载mpich-3.3.1.tar.gz,并保存至docker的宿主机 下载地址

在docker宿主机另窗口执行,将mpich压缩文件传递给容器

docker cp ./下载/mpich-3.3.1.tar.gz   ${container id}:/mpi

到容器内部有压缩包的文件夹,对其进行解压

tar -xzvf  mpich-3.3.1.tar.gz

解压完后进入文件夹中,进行安装

./configure
make
make install

在configure过程中,如果出现报错说没安装什么包,重新安装后再次./configure即可

安装完成后配置环境变量

vi ~/.bashrc

进入此文件后,添加下属三个环境变量

export MPI_ROOT=/home/mpi/mpich-3.3.1
export PATH=$MPI_ROOT/bin:$PATH
export MANPATH=$MPI_ROOT/man:$MANPATH

添加完退出后,再输入source ~/.bashrc使其生效

最后可以利用mpi自带的example进行测试

mpirun -n 6 /home/mpi/mpich-3.3.1/examples/cpi

成功的运行结果如下
在这里插入图片描述

2.配置ssh

1.依次执行

mkdir -p /var/run/sshd
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
#一直Enter即可

2.修改 /etc/ssh/sshd_config 配置信息:
UsePAM yes 改为 UsePAM no
UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no

sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
#启动ssh
/usr/sbin/sshd -D &
#检测是否启动成功
netstat -apn | grep ssh
#修改密码
passwd

改成123456,方便记忆

3.提交容器变为镜像

docker commit -m "description" -a "author information" [containterid] name:tag

在这里插入图片描述


二、创建节点

1. 制作一个docker网段

docker network create --subnet=192.168.10.0/16 network_mpi
docker network ls

2. 创建三个容器

创建容器,容器都与主机的目录挂载,为他们设定名字,设定ip

#node4节点
docker run -it --name node4 -h node4 --net network_my --ip 192.168.10.20 --add-host node5:192.168.10.21  --add-host node6:192.168.10.22 -v  /home/mpi/work:/home/mpi/work  3c2e /bin/bash
exit

#node5节点
docker run -it --name node5 -h node5 --net network_my --ip 192.168.10.21 --add-host node4:192.168.10.20  --add-host node6:192.168.10.22 -v  /home/mpi/work:/home/mpi/work  3c2e /bin/bash
exit

#node6节点
docker run -it --name node6 -h node6 --net network_my --ip 192.168.10.22 --add-host node4:192.168.10.20  --add-host node5:192.168.10.21 -v  /home/mpi/work:/home/mpi/work  3c2e /bin/bash
exit

现在已经可以在宿主机的对应目录/home/mpi/work添加文件并自动挂载进三台节点机了

3. 配置ssh无密码登陆

1.重新启动一下ssh

#启动ssh
/usr/sbin/sshd -D &
#检测是否启动成功
netstat -apn | grep ssh
  1. 在每个节点依次进行ssh登录
#node4
ssh node4
cd ~/.ssh
#显示出known_hosts后,继续执行
ssh-keygen -t rsa
#一直Enter,再次ls,会出现三个文件
ls

#node5
ssh node5
cd ~/.ssh
#显示出known_hosts后,继续执行
ssh-keygen -t rsa
#一直Enter,再次ls,会出现三个文件
ls

#node6
ssh node6
cd ~/.ssh
#显示出known_hosts后,继续执行
ssh-keygen -t rsa
#一直Enter,再次ls,会出现三个文件
ls

在这里插入图片描述

  1. 先将所有节点的公钥发到一个节点中
#把node5的公钥发给node4
#node5
scp ~/.ssh/id_rsa.pub root@node4:~/.ssh/5.pub

#把node6的公钥发给node4
#node6
scp ~/.ssh/id_rsa.pub root@node4:~/.ssh/6.pub
  1. 在这个节点将所有公钥写进一个文件
#node4
#自己
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
#写node5
cat ~/.ssh/5.pub >> ~/.ssh/authorized_keys
#写node6
cat ~/.ssh/6.pub >> ~/.ssh/authorized_keys

5.再将这个文件发给其他节点

#node4
#发给node5
scp ~/.ssh/authorized_keys root@node5:~/.ssh/
#发给node6
scp ~/.ssh/authorized_keys root@node6:~/.ssh/

此时三台节点已实现相互免密码登录了,可以通过ssh node【】登录进行尝试


三、编写文件

由于三台机器已经把/home/mpi/work挂载到宿主机的对应目录下,我只需要把hello.c文件传到宿主机的对应目录即可
hello.c

#include <stdio.h>
#include "mpi.h"

int main(int argc, char *argv[]) 
{
    int myrank, size;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int namelen;
    
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Get_processor_name(processor_name, &namelen);
    
    printf("Processor %d of %d on %s: Hello World!\n", myrank, size, processor_name);

    MPI_Finalize();

    return 0;
}

还可以编写一个控制由哪个节点来运行的文件machinefile

node4
node5
node6

当其放在对应目录下后,三个节点已有此文件,在其中一个节点对hello.c进行编译

mpicc  -o  hello  hello.c 

此时三个节点均已有编译好的hello文件
在这里插入图片描述
在其中一个节点按照编写好的machinefile运行程序,如下所示

#-f表示使用哪个控制文件 -n表示进程数量
mpiexec -f machinefile -n 6 ./hello

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值