使用docker 安装hadoop 集群
首先,使用docker 安装Hadoop集群,需要下载好jdk、Hadoop、的安装包。
其次,准备好Hadoop 镜像。
准备前提知识:
Docker容器后台运行,就必须有一个前台进程.容器内没有后台服务的概念。所以需要一个可以启动后台服务ssh的镜像
对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。
网络配置
docker 中一般默认以172.17.0.0作为主机ip,docker 启动的容器从1开始编号。可以用docker create 自定义网段的固定IP/静态IP地址.(docker 中网络这块还不了解)
docker network create --subnet=172.172.0.0/16 docker-subnet-name
ssh 免密登陆的原理:
ssh 免密登陆是通过密钥来实现的,有两个验证过程。
- 主机验证
- 主机A向主机B发送SSH请求的时候,主机A会先去~/.ssh/knowhosts 文件中查询是否存在主机B的host_key.如果存在,则进行用户验证。不存在,询问是否保存主机B发送过来的host_key.
- 在主机B发送的host_key保存着主机B的/etc/ssh/路径下。在ssh 服务启动的时候自动生成。
- 在主机验证阶段,服务端持有的是私钥,客户端保存的是来自于服务端的公钥。注意,这和身份验证阶段密钥的持有方是相反的
- 用户验证
- 主机A需要将自己生成的公钥(/.ssh/id_rsa.pub)发送到主机B的/.ssh/authorized_keys文件中。
- 主机A访问主机B的时候,主机B用authorized_keys中的公钥随机加密一个数字,发送到A,A用自己的私钥解密,解密成功则可以访问,否则访问失败。
ssh服务配置打包镜像
1 FROM centos
2 MAINTAINER RETURN
3 RUN yum install -y openssh-server
4 RUN yum install -y openssh-clients
5 RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
6 RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#这里生成rsa 加密方式的host_key是因为上述docker 容器中无法在启动ssh 服务,所以要先手动添加。
7 #RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key。可以增加也可以不加,另外一种加密方式
8 RUN yum install -y net-tools.x86_64
9 RUN yum install -y vim
10 RUN echo "root:111111" | chpasswd
11 RUN mkdir /var/run/sshd
12 EXPOSE 22
13
14 CMD ["/usr/sbin/sshd","-D"]
在这里 RUN 可以 用一个 RUN 代替。如下:
1 FROM centos
2 MAINTAINER RETURN
3 RUN yum install -y openssh-server \
&& RUN yum install -y openssh-clients \
&& sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
&& yum install -y net-tools.x86_64 \
&& yum install -y vim \
&& echo "root:111111" | chpasswd \
&& mkdir /var/run/sshd
12 EXPOSE 22
13
14 CMD ["/usr/sbin/sshd","-D"]
#-D:以后台守护进程方式运行服务
用以上方式 run 建立镜像可以减少docker 文件层数。一个run 就是一层。
然后运行
docker run build -t="image-name" .
来建立一个新的镜像。这里不能忘记命令后面的 · 这个点是标示用当前路径下的Dockerfile 进行镜像的建立。
Jdk-镜像制作
1 FROM ssh-centos
2 ADD jdk-8u191-linux-x64.tar.gz /usr/local/
3 RUN mv /usr/local/jdk1.8.0_191 /usr/local/jdk1.8
4 ENV JAVA_HOME /usr/local/jdk1.8
5 ENV PATH $JAVA_HOME/bin:$PATH
docker build -t="image-name" .
tips:
这里的ADD命令是将和Dockerfile 文件同一路径下的问价打包到镜像中,并且会自动进行解压操作。如果不想解压可以用copy 实现。
hadoop镜像制作
1 FROM jdk-centos
2 ADD hadoop-2.7.7.tar.gz /usr/local
3 RUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoop
4 ENV HADOOP_HOME /usr/local/hadoop
5 ENV PATH $HADOOP_HOME/bin:$PATH
docker run -t="image-name" .
制作好Hadoop镜像后,用镜像启动一个容器。这里需要注意的是,启动容器不可以在run 后面增加启动容器的执行命令。否则会默认代替dockerfile 中的cmd 命令,ssh 服务则不会启动。
例如:
docker run -itd --name container-name --net docker-net-name --ip *.*.*.* image-name
#将container-name换为自定义容器的名字。
#docker-net-name换为自己创建的网络组名字
#image-name换为需要的镜像名
这里的image-name 是制作好的hadoop 镜像的name.默认启动ssh 为后台服务(这里的后台服务是做在容器的镜像里)
然后可以用docker exec 进入容器,可以在运行中的容器中执行命令。
docker exec -it container-name commond(/bin/bash)
#这里用bash进入容器,容器中有一个后台服务ssh.
(如有不对,请指出)
网友评论