D004.1 Dockerfile例子详解及常用指令

0x00 教程内容

  1. 构建Hadoop集群例子详解
  2. Dockerfile额外指令说明

0x01 构建Hadoop集群例子详解

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. FROM
FROM ubuntu

解释:后面接镜像,如本地没有则从中央仓库下载,此处为从中央仓库获取ubuntu镜像,格式还可以为:FROM image:tag,tag为版本号。

注意:Dockerfile中第一条指令必须是FROM指令,一个Dockerfile中创建多个镜像时,可以多次使用FROM指令

b. MAINTAINER
MAINTAINER shaonaiyi shaonaiyi@163.com

解释:指定维护者信息,向读者申明,这是shaonaiyi写的Dockerfile文件,shaonaiyi@163.com为维护人的邮箱,加上相关信息显得更加专业一点。

c. ENV
ENV 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. COPY
COPY 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. RUN
RUN /etc/init.d/ssh start
解释:启动ssh服务

l. CMD
CMD ["/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

0x02 Dockerfile额外指令说明

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 总结

  1. Dockerfile的指令不止以上13种,还ARG(构建参数)、HEALTHCHECK(健康检查)等,自行搜索资料学习
  2. 本教程比较简单,输入扩展学习,具体流程步骤,请参考文章:
    D001.7 Docker搭建Hadoop集群(实践篇)
  3. 学习过程中,请对比Spark集群、Zookeeper集群的Dockerfile文件来学习,请参照本博客的其他学习文章。

作者简介:邵奈一
大学大数据讲师、大学市场洞察者、专栏编辑
公众号、微博、CSDN邵奈一
本系列课均为本人:邵奈一原创,如转载请标明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值