教程目录
0x00 教程内容- 构建Hadoop集群例子详解
- Dockerfile额外指令说明
1. Hadoop集群Dockerfile文件
FROM ubuntu
MAINTAINER shaonaiyi shaonaiyi@163.com
ENV BUILD_ON 2019-01-29
RUN apt-get update -qqy
RUN apt-get -qqy install vim wget net-tools iputils-ping openssh-server
ADD ./jdk-8u161-linux-x64.tar.gz /usr/local/
ADD ./hadoop-2.7.5.tar.gz /usr/local
#增加JAVA_HOME环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV HADOOP_HOME /usr/local/hadoop-2.7.5
ENV PATH $HADOOP_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$PATH
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys
copY config /tmp
RUN mv /tmp/ssh_config ~/.ssh/config && \
mv /tmp/hadoop-env.sh $HADOOP_HOME/etc/hadoop/hadoop-env.sh && \
mv /tmp/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml && \
mv /tmp/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml && \
mv /tmp/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml && \
mv /tmp/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml && \
mv /tmp/master $HADOOP_HOME/etc/hadoop/master && \
mv /tmp/slaves $HADOOP_HOME/etc/hadoop/slaves && \
mv /tmp/start-hadoop.sh ~/start-hadoop.sh && \
mkdir -p /usr/local/hadoop2.7/dfs/data && \
mkdir -p /usr/local/hadoop2.7/dfs/name
RUN echo $JAVA_HOME
workdir /root
RUN /etc/init.d/ssh start
CMD ["/bin/bash"]
2. 详细解读
a. FROMFROM ubuntu
解释:后面接镜像,如本地没有则从中央仓库下载,此处为从中央仓库获取ubuntu镜像,格式还可以为:FROM image:tag,tag为版本号。
注意:Dockerfile中第一条指令必须是FROM指令,一个Dockerfile中创建多个镜像时,可以多次使用FROM指令
b. MAINTAINERMAINTAINER shaonaiyi shaonaiyi@163.com
解释:指定维护者信息,向读者申明,这是shaonaiyi写的Dockerfile文件,shaonaiyi@163.com为维护人的邮箱,加上相关信息显得更加专业一点。
c. ENVENV BUILD_ON 2019-01-29
解释:配置环境变量,可以在Dockerfile文件中用RUN指令使用,也可以在生成容器后,在容器中使用。此处即表示,BUILD_ON的值为2019-01-29。
d. RUN
RUN apt-get update -qqy
RUN apt-get -qqy install vim wget net-tools iputils-ping openssh-server
解释:RUN command或RUN [“EXECUTABLE”,“ParaM1”,“ParaM2”…]
前者在shell终端中运行命令,/bin/sh -c command ,例如:/bin/sh -c “echo hello”;
后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c",“echo shaonaiyi”];
此处为前者,执行apt-get的相关指令,更新包库和安装相关插件,ubuntu的apt-get与centos的yum类似,-qqy为需要输入y的时候,默认输入y。
e. ADD
ADD ./jdk-8u161-linux-x64.tar.gz /usr/local/
ADD ./hadoop-2.7.5.tar.gz /usr/local
解释:ADD src dest,将src路径的内容复制到dest路径下,此处为将jdk与hadoop安装包复制到/usr/local/路径下,tar.gz或者tar等文件会自动解压。src也可以是一个URL路径。
f. ENV
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV HADOOP_HOME /usr/local/hadoop-2.7.5
ENV PATH $HADOOP_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$PATH
解释:添加环境变量,给java和hadoop都配上环境变量,并将路径追加到PATH,用":"进行拼接:$HADOOP_HOME/bin:$JAVA_HOME/bin:
g. RUN
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys
解释:ssh-keygen -t rsa -f ~/.ssh/id_rsa -P
:生成免秘钥,cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
:将公钥追加到authorized_keys文件chmod 600 ~/.ssh/authorized_keys
:赋予权限&& \
表示一行的结束,多条指令则使用
h. copYcopY config /tmp
解释:copY src dest,复制本地主机(即shaonaiyi000)的src目录或者文件到之后生成的容器的desc目录,desc不存在则会自动创建。此处意思是将我们写好的config文件夹全服复制到容器的/tmp目录
i. RUN
RUN mv /tmp/ssh_config ~/.ssh/config && \
mv /tmp/hadoop-env.sh $HADOOP_HOME/etc/hadoop/hadoop-env.sh && \
mv /tmp/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml && \
mv /tmp/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml && \
mv /tmp/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml && \
mv /tmp/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml && \
mv /tmp/master $HADOOP_HOME/etc/hadoop/master && \
mv /tmp/slaves $HADOOP_HOME/etc/hadoop/slaves && \
mv /tmp/start-hadoop.sh ~/start-hadoop.sh && \
mkdir -p /usr/local/hadoop2.7/dfs/data && \
mkdir -p /usr/local/hadoop2.7/dfs/name
RUN echo $JAVA_HOME
解释:分别将对应的配置文件拷贝到对应的路径下
注意:最后一行mkdir -p /usr/local/hadoop2.7/dfs/name
没有&& \
j. workdir
解释:workdir /root
相当于cd /root
如后面如果还有CMD、ENTRYPOINT等指令,则切换到/root路径执行,可以使用多个workdir指令
k. RUNRUN /etc/init.d/ssh start
解释:启动ssh服务
l. CMDCMD ["/bin/bash"]
解释:
CMD支持三种格式
- CMD [“executable”,“param1”,“param2”],使用exec执行,这是推荐的方式。
- CMD command param1 param2 在/bin/sh中执行。
- CMD [“param1",“param2”] 提供给ENTERYPOINT的默认参数。
CMD指定容器启动时执行的指令,每个Dockerfile只能有一个CMD指令,多个CMD指令只会执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。
额外说明:
请结合config/start_container.sh理解,CMD ["/bin/echo", "shaonaiyi"]
build后运行(假设镜像名为sny):docker run sny
就会输出: shaonaiyi
效果类似于开机启动项
如果docker run命令如果指定了参数会把CMD里的参数覆盖,如:docker run -it sny /bin/bash
,/bin/bash即为参数。
比如启动sny镜像:docker run sny /bin/echo echo_shaonaiyi
就不会输出:shaonaiyi,因为CMD命令被”/bin/bash”覆盖了,而会输出:echo_shaonaiyi
1. 指令总结
a. Dockerfile中的指令中包括FROM、MAINTAINER、ENV、RUN、ADD、copY、workdir、CMD、EXPOSE、ENTRYPOINT、VOLUME、USER、ONBUILD等13个指令。
b. 我们上面讲解过的有:
FROM、
MAINTAINER、
ENV、
RUN、
ADD、
copY、
workdir、
CMD
八个指令;
还有:
EXPOSE、
ENTRYPOINT、
VOLUME、
USER、
ONBUILD
这五个接下来讲解。
2. 额外五个指令
a. EXPOSE
解释:
EXPOSE port
申明container暴露内部服务开启的端口,仅仅是声明,还不是映射。
意图主要有两个,一是让镜像使用者知道,这个端口可能有用途。二是可以让镜像使用者在启动容器时映射。docker run -d -p 127.0.0.1:33305:22 centos
容器的22端口被映射到主机的33305端口;
还可以供外部连接使用。
b. ENTRYPOINT
解释:
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile文件只能有一个ENTRYPOINT,存在多个时只有最后一个生效。
c. VOLUME
解释:
VOLUME ["/data"]
可以将本地文件夹或者其他container的文件夹挂载到container中。
d. USER
解释:
USER username
指定容器运行时的用户或UID,与workdir类似,一个是切换目录,一个是切换用户,USER后续的RUN , CMD 以及 ENTRYPOINT 这类命令的身份都会起作用。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。切换用户前,用户需要提前创建好。
e. ONBUILD
解释:
ONBUILD [INSTRUCTION]
创建镜像时,父镜像不会执行,集成其生成子镜像的时候才会执行。例如Dockerfile创建了镜像sample:ONBUILD RUN python generate.py
则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,才会自动执行ONBBUILD指令内容,等价
于在新的要构建镜像的Dockerfile中增加了一条指令:
FROM A
RUN python generate.py
0xFF 总结
- Dockerfile的指令不止以上13种,还ARG(构建参数)、HEALTHCHECK(健康检查)等,自行搜索资料学习
- 本教程比较简单,输入扩展学习,具体流程步骤,请参考文章:
D001.7 Docker搭建Hadoop集群(实践篇) - 学习过程中,请对比Spark集群、Zookeeper集群的Dockerfile文件来学习,请参照本博客的其他学习文章。
作者简介:邵奈一
大学大数据讲师、大学市场洞察者、专栏编辑
公众号、微博、CSDN:邵奈一
本系列课均为本人:邵奈一原创,如转载请标明出处