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

简介: 构建Hadoop集群例子详解; 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文件来学习,请参照本博客的其他学习文章。


相关文章
|
8月前
|
Ubuntu Docker 容器
深入理解Dockerfile:构建镜像的详细解释与常用命令(下)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
187 0
|
16天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
173 75
|
2月前
|
JavaScript 数据库 Docker
一个有用的docker entrypoint脚本的范例
通过这个 Entrypoint 脚本,您可以确保在 Docker 容器启动时执行必要的初始化步骤,并且容器可以根据不同的运行时环境进行相应的配置和操作。这个范例展示了如何编写一个灵活且功能强大的 Entrypoint 脚本,使您的 Docker 容器更加可靠和易于管理。
46 3
|
8月前
|
应用服务中间件 nginx Docker
深入理解Dockerfile:构建镜像的详细解释与常用命令(上)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
1889 0
|
8月前
|
JSON 物联网 Shell
Dockerfile指令详解
Dockerfile指令详解
142 0
|
存储 Kubernetes 调度
k8s及常用指令使用总结
k8s及常用指令使用总结
99 0
Dockerfile(3) - WORKDIR 指令详解
Dockerfile(3) - WORKDIR 指令详解
1076 0
|
存储 Shell 应用服务中间件
学习Docker就应该掌握的dockerfile语法与指令
在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。 ## Docker commit Docker commit一般用做从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dockerfile来完成。 ``` docker commit 容器名 新镜像名:tag ``` 使用这种方式的缺点是:1.对外不
|
JSON NoSQL Redis
Docker常用指令和镜像操作详解一文速学+实例代码
Docker常用指令和镜像操作详解一文速学+实例代码
143 0
Docker常用指令和镜像操作详解一文速学+实例代码
|
存储 Shell 应用服务中间件
Dockerfile : 常用指令
Dockerfile : 常用指令
1253 1
Dockerfile : 常用指令

热门文章

最新文章