构建docker分布式模拟环境

2019-11-24  本文已影响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

其中,

增加免密登录

通过上述的操作之后,我们已经等到了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 这个文章

上一篇下一篇

猜你喜欢

热点阅读