DockerFile理解

DockerFile是什么

      Docker的使用主要如下步骤:

       1)手动按规则编制DockerFile的文件

       2)使用docker build命令从DockerFile生成docker镜像

       3)执行docker run命令从docker镜像构建docker容器

     DockerFile是用来构建镜像的构建文件,是由一系列命令和参数组成的构建脚本。

     centos的DockerFile例子如下:

FROM scratch
MAINTAINER The CentOS Project <[email protected]>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
    vendor="CentOS" \
    license="GPLv2" \
    build-date="2016-06-02"

# Default command
CMD ["/bin/bash"]

        其中,scratch镜像为基础镜像,俗称元镜像,为所有镜像的祖先。

        上述FROM、MAINTAINER、ADD、LABEL、CMD为保留字。保留字都必须为大写字母,并且后面必须至少有一个参数。指令按从上到下执行。每条指令都会创建一个新的镜像层,并对镜像进行提交。

        #代表注释行。

DockerFile构建过程

        docker执行的大致流程如下:

        1)docker从基础镜像运行一个容器。

        2)执行一条指令并对容器进行修改。

        3)执行类似docker commit的命令提交,形成一个新的镜像。

        4)docker基于新的镜像运行新的容器。

        5)执行DockerFile中的下一条指令,直至所有指令执行完成。

      

DockerFile保留字指令

保留字指令
FROM 当前新镜像基于哪个镜像进行构建
MAINTAINER 镜像维护者以及邮箱
RUN 容器构建时需要运行的命令
EXPOSE 容器运行对外暴露的端口号
WORKDIR 客户端登录后所默认的工作目录
ENV 在构建过程中设置环境变量
ADD

把文件复制到指定目录下

ADD的功能为COPY+unzip

COPY 把文件复制到指定目录下
VOLUME 容器数据卷,用于保存数据和持久化
CMD

指定一个容器在运行时,要运行的命令。

如果DockerFile中有多条CMD,则只有最后一条生效。

CMD命令的优先级低于docker run中的参数,所以会被替换掉。

ENTRYPOINT

指定一个容器在运行时,要运行的命令。

CMD命令的优先级与docker run中的参数相同,所以命令会追加执行。

ONBUILD 当构建一个被继承的DockerFile时运行的命令,也就是说,如果DockerFile中有这一个保留字,并且其子镜像被重新构建时,其会被重新构建。该方法类似于钩子。

           命令也可以用图表示如下:

          

DockerFile案例

      1)定制一个centos,实现包含vim和ifconfig组件。

FROM centos

MAINTAINER zhanhai <[email protected]>
ENV mypath /tmp
WORKDIR $mypath

RUN yun -y install vim
RUN yun -y install net-tools

EXPOSE 80
CMD /bin/bash

    完成后执行如下命令构建镜像以及运行容器,build命令的最后的“.”是指当前路径:

docker build -f /tmp/dockerfile2 -t haylen/centos:1.3 .
docker images haylen/centos
docker run -it haylen/centos

     2)定制一个centos,实现可以curl命令下载网页中内容,实践ENTRYPOINT命令。

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]

      完成后执行如下命令构建镜像以及运行容器。

docker build -f /tmp/dockerfile3 -t haylen/queryip .
docker images haylen/queryip
docker run -it haylen/queryip -i

      在该场景下,使用“-i”,则会在命令“curl -s http://ip.cn”后追加了“-i”,相当于“curl -s http://ip.cn -i”,实现显示请求头的打印。

      3)定制一个centos,实践ONBUILD命令。

      首先创建father的镜像/tmp/dockerfile4:

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
ONBUILD RUN echo "father is onbuild..."

      对父镜像进行build:

docker build -f /tmp/dockerfile4 -t fatherimage .

      然后创建子镜像的dockerfile文件dockerfile5:

FROM fatherimage
RUN yum install -y curl
CMD ["curl", "-s", "http://ip.cn"]

      对子镜像进行build:

docker build -f /tmp/dockerfile5 -t sonimage .

      在构建过程中,会有父镜像的构建打印"father is onbuild..."

如果您喜欢这篇文章,别忘了点赞和评论哦!

发布了172 篇原创文章 · 获赞 93 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/chenzhanhai/article/details/100278079