一、基础指令
FROM
- 格式:
FROM <image>
FROM <image>:<tag>
- 解释:
FROM
是Dockerfile
里的第一条而且只能是除了首行注释之外的第一条指令。
MAINTAINER
- 格式:
MAINTAINER <name>
- 解释:
指定该Dockerfile
文件的维护者信息。类似我们在docker commit
时候使用-a
参数指定的信息。
RUN
- 格式:
RUN <command> # shell模式
RUN["executable", "param1", "param2"] # exec模式
- 解释:
表示当前镜像构建时候运行的命令 - 注释:
-
shell
模式:类似于/bin/bash -c command
举例:RUN echo hello
- exec模式:类似于
RUN ["/bin/bash", "-c", "command"]
举例:RUN ["echo", "hello"]
EXPOSE
- 格式:
EXPOSE <port> [<port>...]
- 解释:
设置Docker
容器对外暴露的端口号,Docker
为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p
或者-P
参数对容器的端口进行分配。
ENTRYPOINT
- 格式:
ENTRYPOINT ["executable", "param1","param2"] # exec 模式
ENTRYPOINT command param1 param2 # shell模式
- 解释:
容器启动时执行的指令,每个Dockerfile
中只能有一个ENTRYPOINT
,当指定多个时,只有最后一个起效。
二、文件编辑指令
这一节,我们从指令详解、ADD
实践、COPY
实践、VOLUME
实践这四个方面来学习。
注意:
-
ADD
和COPY
相当于数据卷操作; -
VOLUME
相当于数据卷容器操作。
ADD
- 格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
- 解释:
将指定的<src>
文件复制到容器文件系统中的<dest>
src
指的是宿主机,dest
指的是容器
如果源文件是个压缩文件,则docker
会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
COPY
- 格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
- 解释:
单纯复制文件场景,Docker
推荐使用COPY
VOLUME
- 格式:
VOLUME ["/data"]
- 解释:
VOLUME
指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点,通过VOLUME
指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
举例:VOLUME ["/var/lib/tomcat7/webapps/"]
ADD
实践
- 拷贝普通文件,
Dockerfile
文件内容:
......
# 执行命令
......
# 增加文件
ADD ["sources.list","/etc/apt/sources.list"]
......
- 拷贝压缩文件,
Dockerfile
文件内容:
......
# 执行命令
......
# 增加文件
ADD ["linshi.tar.gz","/nihao/"]
......
COPY
实践
- 修改
Dockerfile
文件内容:
......
# 执行命令
......
# 增加文件
COPY index.html /var/www/html/
......
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
VOLUME
实践
修改Dockerfile
文件内容:
# 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME
VOLUME ["/data/"]
......
三、环境指令详解
这一节,我们从指令详解、ENV
实践、WORKDIR
实践这三个方面来学习。
ENV
- 格式:
ENV <key> <value>
ENV <key>=<value>
- 解释:
设置环境变量,可以在RUN
之前使用,然后RUN
命令时调用,容器启动时这些环境变量都会被指定.
WORKDIR
- 格式:
WORKDIR /path/to/workdir # shell模式
- 解释:
切换目录,为后续的RUN
、CMD
、ENTRYPOINT
指令配置工作目录。 相当于cd
可以多次切换(相当于cd
命令),
也可以使用多个WORKDIR
指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 则最终路径为 /a/b/c。
ENV
实践
- 修改
Dockerfile
文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV
ENV NIHAO=helloworld
WORKDIR
实践
- 修改
Dockerfile
文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR
WORKDIR /nihao/GuiYiHuShen/
RUN ["touch","GuiYiHuShen.txt"]