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..."
如果您喜欢这篇文章,别忘了点赞和评论哦!