Centos 7+Docker+MPI+NFS的安装及实现MPI多节点计算
前言
虚拟化集群系统
在虚拟化技术得到广泛使用后,人们为了实现计算机(服务器)资源的充分利用和切分,将一台计算机(服务器)利用虚拟化技术分割为多台独立的虚拟机使用,并通过管理软件实现虚拟资源的分配和管理,从而显著提高计算机的工作效率。
虚拟机与Docker
虚拟机是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在windows系统里运行Linux系统。
但是由于虚拟机,资源占用多、冗余步骤多、启动慢,这些缺点,Linux发展出了另一种虚拟化技术,Linux容器。
Linux容器,不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆包一整套操作系统,只需要软件工程所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的工作。
因此,对于大规模的数据运算,我们可以基于docker容器虚拟化技术,构建多个容器,采用MPI多节点并行计算,从而充分利用计算机软硬件计算资源,实现高效计算。
一、安装docker
1.环境准备
在VMware安装虚拟机Centos 7,网络可设置为桥接模式,可参照我的博客中3.1.3进行配置网络。
2.移除已经安装过的docker
#sudo yum remove docker docker-engine docker.io
3.更新包索引
#sudo yum update
4.使用命令安装docker
#yum install -y docker
5.查看是否安装成功
#yum list installed | grep docker
6.启动docker服务
#systemctl start docker
7.查看是否启动成功
#systemctl status docker
8.查看已安装docker版本
#docker version
9.测试运行 hello-world
#docker run hello-world
第一阶段,完成了docker的安装部署
二、制作mpi节点docker镜像
1.拉取centos7镜像
#docker pull centos:7
2.查看刚刚所拉取的镜像id
#docker images
docker images可查看image id
3.创建并进入docker容器
#docker run -it ${image id} /bin/bash
4.重新进入运行中的容器
#docker exec -it ${container id} /bin/bash
container id为之前新建的容器id,可通过docker ps -a进行查看
5.进入容器,安装必需软件
#yum install -y openssh-clients openssh-server nano net-tools gcc gcc-c++ sudo passwd make nfs-utils
6.安装mpich
6.1在/root下创建mpi目录
#mkdir mpi
#查看该目录是否创建成功
#ls
6.2在docker宿主机,打开火狐浏览器输入网址,下载mpich-3.3.1.tar.gz,并保存至下载
https://www.mpich.org/static/downloads/3.3.1/
6.3将mpich压缩文件传递给容器,在docker宿主机另一个命令行窗口执行
#docker cp ./下载/mpich-3.3.1.tar.gz ${container id}:/mpi
6.4回到容器底下,进入mpi目录,ls 一下,查看是否移动成功
移动成功则会有mpich-3.3.1.tar.gz压缩包文件
6.5新建一个mpich目录,把mpich压缩包解压到其中
#mkdir /mpi/mpich
#tar -xzvf mpich-3.3.1.tar.gz -C /mpi/mpich
#cd /mpi/mpich/mpich-3.3.1
#./configure --disable-fortran --prefix=/mpi/mpich
#make
#make install
6.6添加环境变量
编辑用户的.bashrc文件添加两行:
PATH=$PATH:/root/mpi/mpich/bin
export PATH
#cd bin
#vi ~/.bashrc
#cat ~/.bashrc
#source ~/.bashrc
source执行生效后使用mpirun执行cpi检测是否成功
#mpirun -n 6 /mpi/mpich/mpich-3.3.1/examples/cpi
6.7配置ssh
1.给root用户设置密码
#passwd
2.依次执行
# 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即可
3.直接使用vi编辑
将UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no
#vi /etc/ssh/sshd_config
使用sed命令把UsePAM yes 改为 UsePAM no
#sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
#sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
4.启动ssh命令
#/usr/sbin/sshd -D &
#输入这个命令无反应,可继续在上述执行文本中黏贴“检测是否成功的代码后”Enter即可
5.检测是否成功:
#netstat -apn | grep ssh
6.提交配置好的centos7容器为镜像
#docker commit ${container id} ${image_name}
docker commit ${container id} centos7_mpi,只需要更换中间容器id
三、安装测试多节点mpi
1.在docker宿主机,创建多节点连接的子网
注意:这里的ip是docker内部网络,所以不用更改,直接执行
#docker network create --subnet=192.168.10.0/16 network_mpi
#docker network ls
2.以之前制作的镜像启动容器node1
#docker run -it --name node1 -h node1 --net network_mpi --ip 192.168.10.11 --add-host node2:192.168.10.12 ${cento7_mpi image id} /bin/bash
3.在新的窗口启动容器node2
注意在这里需要用管理员权限 su 输入密码后在执行以下命令
#docker run -it --name node2 -h node2 --net network_mpi --ip 192.168.10.12 --add-host node1:192.168.10.11 ${cento7_mpi image id} /bin/bash
4.配置两个容器的ssh免密登录:
首先两个容器启动ssh,注意node1与node2都要执行
#/usr/sbin/sshd -D &
#直接Enter即可
其次依次在node1和node2上配置免密ssh登录对方
#ssh node1/node2
最后,在每个节点下执行如下操作
#cd ~/.ssh
#ls
#显示出known_hosts后,继续执行
#ssh-keygen -t rsa
#一直Enter,再次ls,会出现三个文件
最后,分别在两个节点执行如下命令,设置结点间的免密登录
#ssh-copy-id -i ./id_rsa.pub root@node2
#ssh-copy-id -i ./id_rsa.pub root@node1
5.最后编辑servers文件,使用mpirun执行多节点测试。
首先,进入mpich目录,编辑servers文件,使用mpirun执行多节点测试。
vi servers
#在该文件输入如下信息:
node1:3
node2:3
#mpirun -n 6 -f ./servers ./mpich-3.3.1/examples/cpi
总结
至此,已完成Centos 7+Docker+MPI+NFS基础环境的搭建,利用docker容器虚拟化,实现了单机多节点运行MPI程序,实现并行化计算,极大地提升了并行计算的效率。
记得点个赞噢!!!