上一篇写了一个Docker的 Java,Scala环境的Docker镜像的制作,使用的是构建的方式。今天将的是在容器基础上制作新的镜像。正好就以我们大数据环境Hadoop集群环境为例。本人也是第一次在Docker上搭建,会存在许多的问题,正好可以与大家交流一番。
准备工作
这里,我们需要先准备一下我们的基础环境,我们昨天的基础环境是存在问题的,比如说,没有 vim , 没有 ip addr 等,有点不方便使用。所以我们在昨天的基础上再重新构建一个发布出去:
# 指定基镜像 centos
FROM centos:centos7.7.1908
MAINTAINER Fisher "sunyang.iot@gmail.com"
# 先执行更新
RUN yum -y update
# 复制jdk到指定目录
ADD jdk-8u201-linux-x64.tar.gz /opt/module
# 配置jdk环境
ENV JAVA_HOME /opt/module/jdk1.8.0_201
ENV PATH $PATH:$JAVA_HOME/bin
# 检测java版本,确认是否安装成功
RUN java -version
ADD scala-2.11.11.tgz /opt/module
# 配置SCALA 环境
ENV SCALA_HOME /opt/module/scala-2.11.11
ENV PATH $PATH:$SCALA_HOME/bin
# 安装 Vim
RUN yum -y install vim
# 安装 ip
RUN yum -y install initscripts
RUN yum -y install openssh-server
RUN yum -y install openssh-clients
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &&
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
CMD [ "sh", "-c", "systemctl start sshd;bash"]
我们构建好之后,我们的新镜像就是: sun1534/docker-java-scala:7.8.11.1,我们就在这个基础上去搭建我们的大数据Hadoop的基础环境。一步一步来。
搭建准备
搭建环境,我们可以准备三个 docker 容器,分别是 master , slave01 , slave02 .
docker run -itd --privileged --name master -h master sun1534/docker-java-scala:7.8.11.1 /usr/sbin/init
docker run -itd --privileged --name slave01 -h slave01 sun1534/docker-java-scala:7.8.11.1 /usr/sbin/init
docker run -itd --privileged --name slave02 -h slave02 sun1534/docker-java-scala:7.8.11.1 /usr/sbin/init
docker exec -it master /bin/bash
docker exec -it slave01 /bin/bash
docker exec -it slave02 /bin/bash
老夫尝试的从master 使用 ssh 访问 slave01 ,有错误: ssh: connect to host slave01 port 22: Connection refused
. 老夫也不知道咋回事,这也是第一次折腾呀。连接拒绝了,先看看防火墙,在查看防火墙的时候报了这么一个错误:Failed to get D-Bus connection: Operation not permitted
, 这个错误是因为 我们的 容器中有用到 systemctl 的指令,但是他没有权限去执行。所以我们在创建容器的时候就应该使用:docker run -itd --privileged --name master -h master sun1534/docker-java-scala:7.8.11.1 /usr/sbin/init
, 当然和上面的是一样的了,因为上面的是我修改后的嘛。这个权限问题解决之后,我发现这个问题居然解决了。好神奇。
开始部署我们的Hadoop
现在的问题,就相当于在三台服务器里面去搭建我们的Hadoop集群环境。这一个可以参看我之前的博文:大数据框架开发基础之Hadoop(2) 从零开始搭建集群. 这里呢,我就不和大家做其他的介绍说明了。我这里也全部在 root 账户下去执行了,也就不说给 hadoop开辟hadoop用户,给hive一个hive用户啥的了。只是一个测试环境,我们稍微简单一点。同样。这里我只搭建一个很简单的集群环境,至于针对这个集群要做什么样的优化,就是后面的使用它的人来做了。
提交我们的修改
docker commit -m="docker-hadoop-namenode" -a="sunyang.iot@gmail.com" 01c751404010 sun1534/docker-hadoop-namenode:1.0
docker commit -m="docker-hadoop-datanode" -a="sunyang.iot@gmail.com" 85523e229c79 sun1534/docker-hadoop-datanode:slave01.1.0
docker commit -m="docker-hadoop-datanode" -a="sunyang.iot@gmail.com" da010995d410 sun1534/docker-hadoop-datanode:slave02.1.0
然后,我们在提交到Docker Hub上去.
docker-hadoop-namenode
docker-hadoopdatanode
怎么使用我们镜像
版本号说明
- 基础镜像: docker-base
- hadoop: 2.7.2
- Java: 1.8.0_201
- Scala: 2.11.11
1.0
搭建的基础服务,默认为三个机器。
使用说明
镜像拉取
# 拉去我们的 namenode
docker pull sun1534/docker-hadoop-namenode:1.0
# 拉去我们的 datanode
# slave01/slave02 是我们的两个不同的节点,我们的JobHistory,ResourceManager,SecondaryNameNode 分别部署在三个节点上,因此都需要拉取
docker pull sun1534/docker-hadoop-datanode:slave01.1.0
docker pull sun1534/docker-hadoop-datanode:slave02.1.0
配置说明
服务说明
服务名 | 机器 | 开放端口 |
---|---|---|
NameNode | master | 50070 |
ResourceManager | slave01 | 8088 |
JobHistory | slave01 | 10020,19888 |
创建容器
我们的容器创建后,是需要使用到 systemctl 命令的,因此,我们使用下面的方式去创建我们的容器,我们可根据需要去开放我们的端口。
docker run -itd --privileged --name master -h master -p 50070:50070 sun1534/docker-hadoop-namenode:1.0 /usr/sbin/init
容器创建之后,我们需要手动修改我们的 /etc/hosts,如果我们不知道我们的容器的 IP 地址,可以 使用下面的命令去获取:
docker inspect <container name or id>| grep IPAddress
在创建好容器后,请先修改 /etc/hosts 文件,增加内容如下:
127.17.0.2 master
127.17.0.3 slave01
127.17.0.4 slave02
到此,我们的Hadoop集群环境便可以启动了。
sbin/start-all.sh