美文网首页
构建docker分布式模拟环境

构建docker分布式模拟环境

作者: 夜雨宵城 | 来源:发表于2019-11-24 15:27 被阅读0次

    前言

    本文的主要目的是通过docker在一台单独的centos服务器上搭建一个用于模拟分布式环境。方案主要是为了满足以下的需求:
    在其他的同网段机器上面可以透明的访问到docker模拟的服务集群上面
    各个docker服务的ip都是静态的
    目前的方案上面存在一个缺陷,就是docker的宿主机上面 无法 通过网络访问到docker模拟的服务器集群。

    实施方案

    整个的实施方案包括一下几个步骤,构建sshd镜像,设置网络环境,生成镜像,增加免密登录功能。其中,docker的宿主机是centos7.7的,docker是目前最新的版本(Docker version 19.03.5, build 633a0ea),服务器的网段为192.168.31.0/24,网关ip为192.168.31.1。ps:这个是我自己家的ip,也没啥安全性可言,就不打码了,方便大家看得清楚。docker的简单安装配置可以查看之前的文档

    构建sshd镜像

    构建镜像是基于最新的centos镜像构建的,具体的Dockerfile如下,大家在一个空文件夹下面跑一下即可。由于只是作为一个验证的环境,所以我们简单的将镜像的root密码设置为root。目前的镜像主要是用于功能验证环节。

    FROM centos 
    MAINTAINER fern
    
    RUN yum install openssh-server openssh-clients passwd -y \
        && /bin/echo "root" | passwd --stdin root \
        && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
        && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key \
        && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key \
        && /bin/sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional pam_loginuid.so/g' /etc/pam.d/sshd \
        && /bin/sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
        && /bin/sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config \
        && yum remove passwd -y
    
    EXPOSE 22
    
    CMD ["/usr/sbin/sshd","-D"]
    

    将Dockerfile文件放在宿主机上面,执行如下的命令

    cd /root/work
    docker build -t centos-sshd .
    

    设置网络环境

    为了实现我们的需求,需要将宿主机的网卡设置为混杂模式,该模式需要超级权限,另外,如果宿主机安装在虚拟机上,例如virtualbox等,需要在虚拟机的网卡上面也需要进行设置

    #开启混杂模式,其中enp0s25为宿主机的网卡名
    sudo ip link set enp0s25 promisc on 
    #static-network为后续的docker静态网络名
    docker network create -d macvlan --subnet=192.168.31.0/24 --gateway=192.168.31.1 -o parent=enp0s25 -o macvlan_mode=bridge static-network 
    

    生成镜像

    在这个小节中,主要是为整个环境生成4个docker容器用于模拟相关的业务环境,最新的版本会在生成的容器中自动加入一条指向自身主机名的host,如果你所使用的环境中没有该host条目,可以自行添加相关的命令。

    docker run --net=static-network --ip=192.168.31.230 \
    --name=hadoop-master \
    -h hadoop-master \
    -v /data/program:/data/program:ro \
    -v /data/hadoop/master:/data/work \
    -e TZ="Asia/Shanghai" \
    --add-host hadoop-data1:192.168.31.231 \
    --add-host hadoop-data2:192.168.31.232 \
    --add-host hadoop-data3:192.168.31.233 \
    -itd centos-sshd /usr/sbin/sshd -D
    
    docker run --net=static-network --ip=192.168.31.231 \
    --name=hadoop-data1 \
    -h hadoop-data1 \
    -v /data/program:/data/program:ro \
    -v /data/hadoop/data1:/data/work \
    -e TZ="Asia/Shanghai" \
    --add-host hadoop-master:192.168.31.230 \
    --add-host hadoop-data2:192.168.31.232 \
    --add-host hadoop-data3:192.168.31.233 \
    -itd centos-sshd /usr/sbin/sshd -D
    
    docker run --net=static-network --ip=192.168.31.232 \
    --name=hadoop-data2 \
    -h hadoop-data2 \
    -v /data/program:/data/program:ro \
    -v /data/hadoop/data2:/data/work \
    -e TZ="Asia/Shanghai" \
    --add-host hadoop-master:192.168.31.230 \
    --add-host hadoop-data1:192.168.31.231 \
    --add-host hadoop-data3:192.168.31.233 \
    -itd centos-sshd /usr/sbin/sshd -D
    
    docker run --net=static-network --ip=192.168.31.233 \
    --name=hadoop-data3 \
    -h hadoop-data3 \
    -v /data/program:/data/program:ro \
    -v /data/hadoop/data3:/data/work \
    -e TZ="Asia/Shanghai" \
    --add-host hadoop-master:192.168.31.230 \
    --add-host hadoop-data1:192.168.31.231 \
    --add-host hadoop-data2:192.168.31.232 \
    -itd centos-sshd /usr/sbin/sshd -D
    
    

    其中,

    • 参数--net用于指定我们上一个步骤所配置的网络
    • 参数--ip用于指定容器的静态ip
    • 参数--name用于指定容器名
    • 参数-h用于指定容器的主机名
    • 参数-v用于将宿主机的目录挂载到镜像中。为了便于后续的操作验证,我们将宿主机的程序目录以只读的方式挂载到容器中,并分别给各个容器挂载了一个工作目录
    • 通过-e参数指定环境变量,设置docker容器的时区
    • 参数--add-host用于向宿主机中添加host映射
    • 参数-itd分别指定了镜像名、输入输出

    增加免密登录

    通过上述的操作之后,我们已经等到了4个docker容器,并可以在非宿主机的同网段机器上面,通过ssh方式登录到这4个docker容器中,这个步骤的免密登录其实与在一般的centos服务器上面做免密操作是一致的。分别在4个容器中执行如下的命令

    #生成一个不需要密码的密钥文件
    ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
    ssh-copy-id root@hadoop-master
    ssh-copy-id root@hadoop-data1
    ssh-copy-id root@hadoop-data2
    ssh-copy-id root@hadoop-data3
    

    后记

    网络的相关配置,可以参考一下 https://github.com/alfredhuang211/study-doc 这个文章

    相关文章

      网友评论

          本文标题:构建docker分布式模拟环境

          本文链接:https://www.haomeiwen.com/subject/pdzkwctx.html