1、DSL语法

FROM:基础镜像
MAINTAINER:维护者信息
RUN:安装软件
ADD:COPY文件,会自动解压
WORKDIR:cd 切换工作目录
VOLUME:目录挂载
EXPOSE:内部服务端口
CMD:执行 Dockfile 中的命令
ENV:设置环境变量

2、FROM(指定基础Image)

构建指令,必须指定且需要在 Dockfile 其他指令的前面,后续的指令都依赖于该指令指定的 Image,FROM 指定的基础 IMAGE 可以是官方远程仓库中的,也可以位于本地仓库。 FROM 命令告诉 docker 我们构建的镜像是以哪个(发行版)镜像为基础的,第一条指令必须是 FROM 指令,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令。
该指令有两种格式: FROM 七、DLS语法 - 图1 指定基础 image 为该 image 的最后修改的版本。或者
FROM 七、DLS语法 - 图2: 指定基础 image 为该 image 的一个 tag 版本。
RUN后面接要执行的命令,比如,我们想要在镜像中安装 vim,只需要在 Dockfile 中写入 RUN yum install -y vim


3、 MAINTAINER(用于指定镜像创建者信息)

构建指令,用于将 image 的制作者相关的信息写入到 image 中,当我们对该 image 执行 docker inspect 命令时,输出中有相应的字段记录该信息

4、RUN(安装软件用)

构建指令,RUN 可以运行任何被基础 image 支持的命令,如基础 image 选择了 ubuntu,那么软件管理部分只能使用 ubuntu 的命令
该指令有两种格式: RUN RUN [“executable”,”param1”,”param2” …]

5、CMD(设置 container 启动时执行的操作)

设置指令,用于 container 启动时执行的操作,该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
该指令有三种格式: CMD [“executable”,”param1”,”param2” …] CMD command param1 param2
当 Dockerfile 指定了 ENTRYPOINT,那么使用下面的格式 CMD [“param1”,”param2”]
其中: ENTRYPOINT 指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以 param1 和 param2 作为参数执行 所以如果 CMD 指令使用上面的格式,那么 Dockerfile 中必须要有配套的 ENTRYPOINT。

6、ENTRYPOINT(设置 container 启动时执行的操作)

设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
两种格式: ENTRYPOINT [“executable”,”param1”,”param2”] ENTRYPOINT command param1 param2

该指令的使用分为两种情况,一种是独自使用,另一种和 CMD 指令配合使用。 当独自使用时,如果你还使用了 CMD 命令且 CMD 是一个完整的可执行命令,那么 CMD 指令和ENTRYPOINT 会互相覆盖,只有最后一个 CMD 或者 ENTRYPOINT 有效。
CMD命令将不会被执行,只有ENTRYPOINT执行被执行 CMD echo “Hello world” ENTRYPOINT ls -l
另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分; ENTRYPOINT指令只能使用JSON方式执行命令,而不能指定参数。

FROM ubuntu CMD [“-l”] ENTRYPOINT [“/usr/bin/ls”]

7、USER(设置 container 容器的用户)

设置指令,设置启动容器的用户,默认是 root 用户
指定memcache的运行用户 ENTRYPOINT [“memcached”] USER daemon 或者 ENTRYPOINT [“memcached”,”-u”,”daemon”]

8、EXPOSE(指定容器需要映射到宿主机的端口)

设置指令,该指令会将容器中的端口映射到宿主机器中的某个端口,当需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。 要完成这个整个操作需要两个步骤,首先在 Dockfile 使用 EXPOSE 设置需要映射的容器端口,然后在运行容器的时候指定,p选项加上 EXPOSE 设置的端口,这样EXPREEE设置的端口号会被随机映射宿主机器职工的一个端口号。 也可以指定需要映射到宿主机器的那个端口,这时需要确保宿主机器上的端口号没有被使用,EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
格式 EXPOSE […]

映射到一个端口 EXPOSE port1 相应的运行容器使用的命令 docker run -p port1 image

映射多个端口 EXPOSE port1 port2 port3 相应的运行容器使用的命令 docker run -p port1 -p port2 -p port3 image 还可以指定需要映射到宿主机器上的某个端口号 docker run -p host_port1:port1 -p host_port2:port2 host_port3:port3 image
端口映射是 docker 比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。 宿主机器的IP地址是固定的,我们可将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务是都要查看容器的IP的地址

9、ENV(用于设置环境变量)

主要用于设置容器运行时的环境变量
格式 ENV
设置后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在 docker run —env key=value时设置或修改环境变量
假如安装了Java程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写: ENV JAVA_HOME /path/to/java/dirent

10、ADD(从src复制文件到container的dest路径)

主要用于将宿主机中的文件添加到镜像中 构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和guid为0; 如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录; 如果文件是可识别的压缩格式,则docker湖帮忙解压缩(注意压缩格式); 如果是文件且中不使用斜杆结束,则会将视为文件,的内容会写入; 如果是文件且中使用斜杆结束,则会文件拷贝到目录下。
格式: ADD

是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是远程的文件url;

11、VOLUME(指定挂载点)

设置指令,使容器中的一个目录具有持久化存储数据的功能,该日录可以被容器本身使用,也可以共享始其他容器使用,我们知道容会使用的是AUFS, 这种文件系统不能持久化数据,当容器关闭后。所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockefile中使用该指令.
格式: VOLUME [““]
例如: FROM base VOLUME [“/tmp/data”]
运行通过该Dockerfile生成image的容器。/tmp/data目录中的数据在容器关闭后。里面的数据还存在. 例如另一个容器也有持久化数据的网求。且想使用上面容器共享的/tmp/data目录。那么可以运行下面的命令启动一个容器: docker run -t -i -rm -volumes-from ccntainer1 image2 bash 其中:container1为第一个容器的ID。image2为第二个容器运行image的名字。


12、WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令),对RUN,ENTRYPOINT生效。

格式: WORKDIR /path/to/workdir
在/p1/p2下执行vim a.txt WORKDIR /p1 WORKDIR p2 RUN vim a.txt

13、ONBUILD(在子镜像中执行)

格式: ONBUILD
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。