在我们进行JavaEE开发的中构时候,经常使用Maven或者Gradle进行包管理,建镜当我们需要某一个包时,像用只需在Maven或者Gradle添加该包的文本文档唯一标识,这个包就能从远程仓库拉取到本地,中构搭建私服的建镜也会先从私服里拉取该包。当我们自己封装了一个比较好的像用包,也可以通过这些工具推送给远程仓库。文本文档正好,中构Docker镜像的建镜拉取或者推送也是相同的原理。 通过前两章的像用讲解,相信大家对于Docker的文本文档相关概念、常用命令有了基本的中构了解,也知道怎么从远程 Pull 一个镜像,建镜那远程的像用镜像是怎么来的呢?如果我们想自己创建一个镜像又该怎么做呢?今天就来说一说Dockerfile!Dockerfile 是一个包含用户能够构建镜像的所有命令的文本文档,它有自己的语法以及命令,Docker 能够从 Dockerfile 中读取指令自动的源码库构建镜像! Dockerfiler的本质是一个文本文档,既然是一个文本文档,就要了解这个文档的编写规则,也就是对 Dockerfile 的语法和命令需要了解,下面就来说一说它的相关指令! 1、FROM from就是从哪里来,对于Docker官方说法就是指定基础镜像,当前镜像是基于哪个镜像创建的,有点类似 Java 中的类继承。FROM 指令必是 Dockerfile 文件中的首条命令。 2、MAINTAINER 镜像维护者的信息,已经舍弃该指令。 3、LABEL 4、ENV ENV ENV = ... 设置环境变量! 5、WORKDIR 设置工作目录,在该指令后的站群服务器 RUN、CMD、ENTRYPOINT, COPY、ADD 指令都会在该目录执行。如果该目录不存在,则会创建! 6、RUN RUN 会在当前镜像的最上面创建一个新层,并且能执行任何的命令,然后对执行的结果进行提交。提交后的结果镜像在 Dockerfile 的后续步骤中可以使用。 7、ADD 从宿主机拷贝文件或者文件夹到镜像,也可以复制一个网络文件!如果拷贝的文件是一个压缩包,会自动解压缩! 8.COPY 从宿主机拷贝文件或者文件夹到镜像,不能复制网络文件也不会自动解压缩! 9、VOLUME VOLUME 用于创建挂载点,一般配合 run 命令的 -v 参数使用。 10、EXPOSE 指定容器运行时对外暴露的端口,但是该指定实际上不会发布该端口,它的功能是镜像构建者和容器运行者之间的亿华云记录文件。 回到容器命令中的 run 命令部分,run 命令有 -p 和 -P 两个参数。 如果是 -P 就是随机端口映射,容器内会随机映射到 EXPOSE 指定的端口;如果是 -p 就是指定端口映射,告诉运维人员容器内需要映射的端口号。 11、CMD 指定容器启动时默认运行的命令,在一个 Dockerfile 文件中,如果有多个 CMD 命令,只有一个最后一个会生效! 12、ENTRYPOINT 这个指令与 CMD 指令类似,都是指定启动容器时要运行的命令,如果指定了 ENTRYPOINT,则 CMD 指定的命令不会执行! 在一个 Dockerfile 文件中,如果有多个 ENTRYPOINT 命令,也只有一个最后一个会生效!不同的是通过 docker run command 命令会覆盖 CMD 的命令! 执行的命令不会覆盖 ENTRYPOINT,docker run 命令中指定的任何参数都会被当做参数传递给 ENTRYPOINT! RUN、CMD、ENTRYPOINT 区别: ---RUN 指令是在镜像构建时运行,而后两个是在容器启动时执行! ---CMD 指令设置的命令是容器启动时默认运行的命令,如果 docker run 没有指定任何的命令,并且 Dockerfile 中没有指定 ENTRYPOINT,那容器启动的时候就会执行 CMD 指定的命令!有点类似代码中的缺省参数! ---如果设置了 ENTRYPOINT 指令,则优先使用!并且可以通过 dockerrun 给该指令设置的命令传参! ---CMD 有点类似代码中的缺省参数。 13、USER 用于指定运行镜像所使用的用户。 14、ARG 指定在镜像构建时可传递的变量,定义的变量可以通过 dockerbuild --build-arg = 的方式在构建时设置。 15、ONBUILD 当所构建的镜像被当做其他镜像的基础镜像时,ONBUILD 指定的命令会被触发! 16、STOPSIGNAL 设置当容器停止时所要发送的系统调用信号! 17、HEALTHCHECK 该指令可以告诉 Docker 怎么去检测一个容器的运行状况! 18、SHELL 用于设置执行命令所使用的默认的 Shell 类型!该指令在 Windows 操作系统下比较有用,因为 Windows 下通常会有 CMD 和 Powershell 两种 Shell,甚至还有 SH。 以上就是Dockerfile的相关指令,既然对这些指令有了大概的了解,那么怎么来构建呢?当然使用Docker提供的构建命令:docker build [OPTIONS] PATH | URL | - -f:指定要使用的 Dockerfile 路径,如果不指定,则在当前工作目录寻找 Dockerfile 文件! -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。 看看redis和nodejs的Dockerfile长什么样: