Dockerfile

Posted mry6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile相关的知识,希望对你有一定的参考价值。

Dockerfile简介

dockerFile用来帮助我们构建自己的镜像

Dockerfile解析过程:

Dockerfile基本语法

官方说明:https://docs.docker.com/engine/reference/builder/

命令作用
FROM当前镜像是基于哪个镜像构建 第一个指令必须是FROM
MAINTAINER镜像维护者的姓名和邮箱地址 废弃
RUN构建镜像时需要运行的指令
EXPOSE当前容器对外暴露出的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY类似于ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作 docker -v /root/data:/usr/local/tomcat/webapps
CMD指定一个容器启动时要运行的命令;Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令;ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

1.FROM命令
1》基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现
2》语法

FROM <image>
FROM <image>[:<tag>]   使用版本号不写为latest
FROM <image>[@<digest>]  使用摘要

2.MAINTAINER命令
1》镜像维护者的姓名和邮箱地址[废弃]
2》语法

MAINTAINER <name>

3.RUN命令
1》RUN命令将在当前镜像之上的新层中执行任何命令并提交结果。生成的提交镜像将用于Dockerfile中的下一步
2》语法

RUN <command> (shell form,the command is run in a shell,which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN echo hello

RUN ["executable", "param1", "param2"]  (exec form)
RUN ["/bin/bash", "-c", "echo hello"]

4.EXPOSE命令
1》用来指定构建的镜像在运行为容器时对外暴露的端口
2》语法

EXPOSE 80/tcp   如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp

5.WORKDIR命令
1》用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
2》语法

WORKDIR /path/to/workdir

WORKDIR /a
WORKDIR b #/a/b
WORKDIR c #/a/b/c
#注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对

6.ENV命令
1》用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
2》语法

ENV <key> <value>
ENV <key>=<value> ...

7.ADD命令
1》用来从context上下文复制新文件、目录或远程文件url,并将他们添加到位于指定路径的镜像文件系统中。
2》语法

ADD home* /mydir/    #通配符添加多个文件
ADD hom?.txt /mydir/   #通配符添加
ADD test.txt relativeDir/   #可以指定相对路径
ADD test.txt /absoluteDir/  #也可以指定绝对路径
ADD url

8.COPY命令
1》用来将context目录中指定文件复制到镜像的指定目录中
2》语法

COPY src dest
COPY ["<src>",... "<dest>"]

9.VOLUME命令
1》用来定义容器运行时可以挂载到宿主机的目录
2》用法

VOLUME ["/data"]

10.CMD命令
1》用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
2》注意:Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
3》语法

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"]  (as default parameters to ENTRYPOINT)
CMD command param1 param2  (shell form)

11.ENTRYPOINT命令
1》ENTRYPOINT指令的目的也是为容器指定默认执行的任务。
ENTRYPOINT指令有两种使用方式,就是我们前面介绍的 exec 模式和 shell 模式。
2》语法

ENTRYPOINT ["executable", "param1", "param2"]   // 这是exec模式的写法,注意需要使用双引号
ENTRYPOINT command param1 param2    //这是shell模式的写法

Dockerfile使用流程

1.创建Dockerfile文件

touch Dockerfile


2.拉取centos镜像
查看docker镜像版本号地址:https://hub.docker.com/_/centos?tab=tags

docker pull centos:7

3.添加Dockerfile文件内容

FROM centos:7
#RUN yum install -y vim
#RUN yum install -y wget
RUN ["yum","install","-y","wget","vim"]
EXPOSE 8080
EXPOSE 9200
WORKDIR /data
WORKDIR aa
WORKDIR bb
ENV BASE_DIR=/data/aa/bb
COPY aa.txt $BASE_DIR
ADD bb.txt $BASE_DIR
#ADD https://downloads.apache.org/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz /data/aa/bb
ADD mv apache-tomcat-8.5.65 tomcat
VOLUME /data/aa/bb
#CMD ls /
ENTRYPOINT ["ls","/"]

4.构建自定义镜像

 docker build -t centos7:01 .

-t:指定镜像的名称
. :指定Dockerfile文件所在的路径

5.效果

以上是关于Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile与Dockerfile实战

Dockerfile与Dockerfile实战

Dockerfile(Dockerfile的详细使用通过Dockerfile构建apache镜像)

linux12 - dockerfile06 --> Dockerfile构建djiango和java

Dockerfile使用方法详解

初识Dockerfile+进阶Dockerfile(手把手叫你如何编写Dockerfile)