实现原理:一台阿里云主机+docker+iptables

网络拓扑图

docker网心云命令 网心云 docker_hadoop

操作步驟如下:

  1. 安裝docker,详情请自行百度
  2. 安装好之后你可以在云主机上键入ifconfig查看,会发现多了一个docker0的虚拟网卡,这是安装docker之后默认创建的,当然我们也可以自己创建一个虚拟网络
  3. 创建自己的虚拟网络,在阿里云主机上键入:docker network create dockerNetBridge
  4. 再次在阿里云主机上键入:ifconfig发现多了一个新的虚拟网卡,这个新网卡就是我们创建的虚拟网络dockerNetBridge的网卡
  5. 我们可以在阿里云主机上键入:docker network ls

    发现网卡的名字就是br-NETWORK ID
  6. 然后我们选定镜像启动几个容器实例,这里我用的镜像是centos8的镜像,在启动镜像的时候我指定使用的虚拟网络是dockerNetBridge, 命令如下
docker run -d -it -v /file/docker2:/opt --name docker-2 --network dockerNetBridge --network-alias docker-2 300e315adb2f
docker run -d -it -v /file/docker3:/opt --name docker-3 --network dockerNetBridge --network-alias docker-3 300e315adb2f
docker run -d -it -v /file/docker4:/opt --name docker-4 --network dockerNetBridge --network-alias docker-4 300e315adb2f
  1. 此时我们在阿里云宿主机键入:docker network inspect dockerNetBridge查看这个虚拟网络的详情:
  2. 我们可以在 阿里云主机,容器docker-2,docker-3,docker-4之间互相ping,发现都是ok的,都是能ping通的,然后就可以部署分布式hadoop集群了(请参考别的blog)。
  3. 在docker-2,docker-3,docker-4上部署好集群之后,怎么访问的通呢?加入我们的namenode是部署在docker-2上面的,从第7步的截图,我们可以发现docker-2在虚拟网络 dockerNetBridge中的ip是172.19.0.2,我们知道那么我们怎么通过我们的浏览器访问namenode 的50070端口呢?即访问http://172.19.0.2:50070
  4. 我们本地的浏览器想访问阿里云主机只能访问阿里云的外网,即http://112.126.X.X:50070,那怎么访问到阿里云上的容器里面的50070端口呢,答案就是iptables路由,
  5. 先判断iptables服务是否开启,可以在阿里云主机键入:以下命令
systemctl status iptables #查看iptables服务
systemctl start  iptables #开启iptables服务
systemctl stop iptables #关闭iptables服务
systemctl restart iptables #重启iptables状服务
  1. 确认iptables服务打开后,如果你不懂iptables的四表五链,你就在阿里云主机依次键入下面的命令:
iptables -F PREROUTING
iptables -F INPUT
iptables -F OUTPUT
iptables -F POSTROUTING
iptables -F FORWARD
  1. 然后再在阿里云主机添加路由命令键入:
iptables -t nat -A PREROUTING  -p tcp --dport 50070 -j DNAT --to-destination 172.19.0.2:50070

解释一下这个命令:大致意思就是访问阿里云主机50070端口的请求都会被转发到172.19.0.2:50070去
因为阿里云主机和docker-2,docker-3,docker-4之间都是网络互通的,且都在172.19.0.0网段,所以可以发送过来的请求都会被转发到docker-2容器内进行处理,然后返回。如果设置错了,你可以重复第12,13步。然后就可以直接在浏览器键入:http://112.126.X.X:50070, 这时候阿里云就会将请求转发给docker-2的容器的50070端口进行处理了。