本章内容

Dockerfile基础命令详解。

本文实操全部基于Ubuntu 20.04
宿主机 => linux服务器本身

上节粗略介绍了Dockerfile相关命令,这节把一些常用的命令进行详细解释,我们还是以NginxDockerfile为主。


指令

FROM 【指定创建镜像的基础镜像】

AS 彻底替换镜像源_docker


Dockerfile必须首行可存在多条,大部分Dockerfile基础镜像可以选用体积较小的镜像如Alpine或Debian作为基础镜像,有些则可以使用基础依赖为基础镜像,比如启动Java项目就可以使用JDK作为基础镜像,Vue项目则可以使用node作为基础镜像。

--------------------------------------------------------------------------------------------------------------------------

LABEL 【为镜像添加标签信息】

AS 彻底替换镜像源_linux_02


标签你懂得,有快速筛选出某个特征镜像的东东,可存在多条。

--------------------------------------------------------------------------------------------------------------------------

ENV 【指定镜像的环境变量】

AS 彻底替换镜像源_docker_03


变量嘛~你也懂得,就是肯定会有调用它的地方,Dockerfile也一样,一般会在RUN中被调用到,后续镜像启动的容器中也会存在,可被docker run --env命令显式覆盖替换,不建议相同变量名被多次赋值,可存在多条。

--------------------------------------------------------------------------------------------------------------------------

RUN 【运行命令】

AS 彻底替换镜像源_linux_04


RUN有俩种格式,RUN 命令shell终端执行命令即/bin/sh -cRUN ["exec","参数1","参数2"]则是以exec执行,可以指定用何种终端执行命令,执行多条命令类似shell,可以使用\来进行换行,可存在多条RUN命令,每一条为一镜像层,跟CMD类似,在docker build时运行。

--------------------------------------------------------------------------------------------------------------------------

COPY 【复制内容到镜像】

AS 彻底替换镜像源_linux_05


复制以当前Dockerfile上下相对路径中的内容到镜像中的路径下,镜像中的目录不存在则自动创建,支持正则匹配,可存在多条,类似ADD,但不会对压缩内容进行解压。

--------------------------------------------------------------------------------------------------------------------------

ENTRYPOINT 【指定镜像默认入口命令】

AS 彻底替换镜像源_运维_06


其实就是镜像创建的容器启动时的初始命令,有俩种格式,参考RUN,不可存在多条,若存在多条,则以最后一条为准,可被docker run --entrypoint命令显式覆盖替换。

--------------------------------------------------------------------------------------------------------------------------

EXPOSE 【声明镜像监听端口】

AS 彻底替换镜像源_AS 彻底替换镜像源_07


该命令只有声明作用,并不能自动分配端口去映射,可以在运行容器时显式指定端口docker run -p 宿主机端口:容器端口,可存在多条。

--------------------------------------------------------------------------------------------------------------------------

STOPSIGNAL 【指定镜像创建的容器退出的信号值】

AS 彻底替换镜像源_linux_08


指定在执行docker stop执行停止容器时,会发给容器的信号,默认情况下会发出SIGTERM,其目的是为了让容器能够优雅的退出,但是如果容器在接受相应指令后(10s)内还是没有停止,此时Docker会帮它退出,此时会发送SIGKILL信号将容器杀死。

--------------------------------------------------------------------------------------------------------------------------

CMD 【指定启动容器时默认执行的命令】

AS 彻底替换镜像源_linux_09


CMD有三种格式,CMD ["exec","参数1","参数2"]相当于执行exec 参数1 参数2,如图中则为nginx -g daemon off;CMD exec 参数1 参数2相当于在shell中执行,一般用于交互的应用;CMD ["参数1","参数2"]ENTRYPOINT提供默认参数,不可存在多条,若存在多条,则以最后一条为准,可被docker run命令显式覆盖替换,跟RUN类似,在docker run时运行。

--------------------------------------------------------------------------------------------------------------------------

ADD 【添加内容到镜像】

AS 彻底替换镜像源_服务器_10


复制以当前Dockerfile上下相对路径中的内容到镜像中的路径下,复制的内容可以是urltar压缩文件,普通文件;镜像中的目录不存在则自动创建,支持正则匹配,可存在多条,类似COPY,但会对压缩内容进行解压。

--------------------------------------------------------------------------------------------------------------------------

WORKDIR 【指定镜像的工作目录】

AS 彻底替换镜像源_AS 彻底替换镜像源_11


为后续Dockerfile中的指令指定工作目录,可存在多条,不推荐使用相对路径,若使用相对路径,则会基于之前的指定路径,推荐使用绝对路径。

--------------------------------------------------------------------------------------------------------------------------

VOLUM 【给镜像创建一个挂载点】

AS 彻底替换镜像源_服务器_12


可以在镜像创建的容器运行时从本地主机或其他容器挂载数据卷。


构建

编写Dockerfile完成后,可以在该文件目录下执行docker build,也可以通过-f来指定Dockerfile的路径,命令如下。

AS 彻底替换镜像源_linux_13


通过-t指定镜像标签,末尾追加构建镜像的上下文路径,构建中ADDCOPYRUN都会生成一层新的镜像,构建成功后会返回相对应的镜像ID。

AS 彻底替换镜像源_运维_14


当一个Dockerfile存在多个FROM时,每一个FROM都代表一个阶段,不起别名的情况下(as),从上到下依次从0递增,即假设上图的第一个FROM不指定别名builder下,第二个FROM下的COPY则是COPY --from=0 /app/dist /data;不管指不指定别名,其都是从指定阶段拷贝资源到该阶段。

当然docker build也提供了大量的附加命令,比如指定其可使用的内存量、缓存量等,还有像上文的指定镜像的标签,镜像文件的路径等等,这里就不做展开了,感兴趣的童鞋自行去了解。

构建之父镜像

一般情况下构建新的镜像都需要指定其父镜像,其是生成镜像的基本,会直接影响镜像生成后的大小等,我们可以选择俩种父镜像来构建镜像,一种是基础镜像(如FROM scratch),另一种是普通镜像(如上文中图片里的nodenginxdebian等)。

类似于git.gitignoreDocker也有自己的忽略文件. dockerignore,同理可以让Docker忽略匹配的路径或文件,这里就不过多扩展。


写在文末。

接下来的更新就是实践篇了,文章将转变为代码为基础,我会尽可能的将注释写明,方便各位童鞋理解与掌握,敬请期待吧~;附大纲。

AS 彻底替换镜像源_服务器_15