网站域名需要续费吗,广州市网站建设科技公司,杭州科技网站,建设什么网站可以赚钱【Docker】从零开始#xff1a;17.Dockerfile 概述1.什么是Dockerfile2.Dockerfile构建三大步骤3.Docker执行Dockerfile流程 一张图理解Dockerfile常用保留指令~FROM~~MAINTAINER~~RUN~两种格式 ~EXPOSE~~WORKDIR~~USER~~ENV~~ADD~~COPY~两种格式 ~VOLUME~~CMD~两种格式注意 ~… 【Docker】从零开始17.Dockerfile 概述1.什么是Dockerfile2.Dockerfile构建三大步骤3.Docker执行Dockerfile流程 一张图理解Dockerfile常用保留指令~FROM~~MAINTAINER~~RUN~两种格式 ~EXPOSE~~WORKDIR~~USER~~ENV~~ADD~~COPY~两种格式 ~VOLUME~~CMD~两种格式注意 ~ENTRYPOINT~命令格式 概述
1.什么是Dockerfile
Dockerfile是一个包含用于构建Docker映像的指令的文本文件。这些指令可以包括指定基础映像、添加文件、设置环境变量、执行命令等。Docker通过读取Dockerfile中的指令自动生成映像。Dockerfile是自定义镜像的一套规则Dockerfile由多条指令构成Dockerfile中的每一条指令都会对应于Docker镜像中的每一层Dockerfile每条保留字指令都必须为大写字母且后面要跟随至少一个参数Dockerfile每行支持一条指令每条指令可携带多个参数一条指令可以用方式去写多条指令。Dockerfile支持以“#”为开头的注释Dockerfile每条指令都会创建一个新的镜像层并对镜像进行提交
2.Dockerfile构建三大步骤 #mermaid-svg-R113CtlS8OpPvG6J {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-R113CtlS8OpPvG6J .error-icon{fill:#552222;}#mermaid-svg-R113CtlS8OpPvG6J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-R113CtlS8OpPvG6J .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-R113CtlS8OpPvG6J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-R113CtlS8OpPvG6J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-R113CtlS8OpPvG6J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-R113CtlS8OpPvG6J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-R113CtlS8OpPvG6J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-R113CtlS8OpPvG6J .marker.cross{stroke:#333333;}#mermaid-svg-R113CtlS8OpPvG6J svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-R113CtlS8OpPvG6J .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-R113CtlS8OpPvG6J .cluster-label text{fill:#333;}#mermaid-svg-R113CtlS8OpPvG6J .cluster-label span{color:#333;}#mermaid-svg-R113CtlS8OpPvG6J .label text,#mermaid-svg-R113CtlS8OpPvG6J span{fill:#333;color:#333;}#mermaid-svg-R113CtlS8OpPvG6J .node rect,#mermaid-svg-R113CtlS8OpPvG6J .node circle,#mermaid-svg-R113CtlS8OpPvG6J .node ellipse,#mermaid-svg-R113CtlS8OpPvG6J .node polygon,#mermaid-svg-R113CtlS8OpPvG6J .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-R113CtlS8OpPvG6J .node .label{text-align:center;}#mermaid-svg-R113CtlS8OpPvG6J .node.clickable{cursor:pointer;}#mermaid-svg-R113CtlS8OpPvG6J .arrowheadPath{fill:#333333;}#mermaid-svg-R113CtlS8OpPvG6J .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-R113CtlS8OpPvG6J .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-R113CtlS8OpPvG6J .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-R113CtlS8OpPvG6J .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-R113CtlS8OpPvG6J .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-R113CtlS8OpPvG6J .cluster text{fill:#333;}#mermaid-svg-R113CtlS8OpPvG6J .cluster span{color:#333;}#mermaid-svg-R113CtlS8OpPvG6J div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-R113CtlS8OpPvG6J :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 编写Dockerfile文件 docker build命令构建镜像 docker run依镜像运行容器实例 3.Docker执行Dockerfile流程 #mermaid-svg-JxahQHUklhvaZund {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JxahQHUklhvaZund .error-icon{fill:#552222;}#mermaid-svg-JxahQHUklhvaZund .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JxahQHUklhvaZund .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-JxahQHUklhvaZund .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JxahQHUklhvaZund .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JxahQHUklhvaZund .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JxahQHUklhvaZund .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JxahQHUklhvaZund .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JxahQHUklhvaZund .marker.cross{stroke:#333333;}#mermaid-svg-JxahQHUklhvaZund svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JxahQHUklhvaZund .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JxahQHUklhvaZund .cluster-label text{fill:#333;}#mermaid-svg-JxahQHUklhvaZund .cluster-label span{color:#333;}#mermaid-svg-JxahQHUklhvaZund .label text,#mermaid-svg-JxahQHUklhvaZund span{fill:#333;color:#333;}#mermaid-svg-JxahQHUklhvaZund .node rect,#mermaid-svg-JxahQHUklhvaZund .node circle,#mermaid-svg-JxahQHUklhvaZund .node ellipse,#mermaid-svg-JxahQHUklhvaZund .node polygon,#mermaid-svg-JxahQHUklhvaZund .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JxahQHUklhvaZund .node .label{text-align:center;}#mermaid-svg-JxahQHUklhvaZund .node.clickable{cursor:pointer;}#mermaid-svg-JxahQHUklhvaZund .arrowheadPath{fill:#333333;}#mermaid-svg-JxahQHUklhvaZund .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JxahQHUklhvaZund .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JxahQHUklhvaZund .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-JxahQHUklhvaZund .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-JxahQHUklhvaZund .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JxahQHUklhvaZund .cluster text{fill:#333;}#mermaid-svg-JxahQHUklhvaZund .cluster span{color:#333;}#mermaid-svg-JxahQHUklhvaZund div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JxahQHUklhvaZund :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} docker从基础镜像运行一个容器 执行一条指令并对容器作出修改 执行类似docker commit的操作提交一个新的镜像层 docker再基于刚提交的镜像运行一个新容器 执行dockerfile中的下一条指令直到所有指令都执行完成 一张图理解Dockerfile 常用保留指令
FROM
基础镜像当前新镜像是基于哪个镜像的指定一个已经存在的镜像作为模板第一条必须是from
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
两种格式
shell 格式
RUN yum -y install vimexec 格式
RUN [可执行文件,参数1,参数2,....]
RUN [./test.sh,yes,1] #等价于 RUN ./test.sh yes 1EXPOSE
当前容器对外暴露出的端口
WORKDIR
指定在创建容器后终端默认登陆的进来工作目录一个落脚点
USER
指定该镜像以什么样的用户去执行如果都不指定默认是root
ENV
用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest这个环境变量可以在后续的任何RUN指令中使用这就如同在命令前面指定了环境变量前缀一样 也可以在其它指令中直接使用这些环境变量 比如WORKDIR $MY_PATH
ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY
类似ADD拷贝文件和目录到镜像中。 将从构建上下文目录中 源路径 的文件/目录复制到新的一层的镜像内的 目标路径 位置
两种格式
shell 格式
COPY src destexec 格式
COPY [src, dest]src源路径源文件或者源目录 dest目标路径容器内的指定路径该路径不用事先建好路径不存在的话会自动创建。
VOLUME
容器数据卷用于数据保存和持久化工作
CMD
指定容器启动后的要干的事情
两种格式
shell 格式
CMD 命令
CMD cd ~exec 格式
CMD [可执行文件,参数1,参数2,....]src源路径源文件或者源目录 dest目标路径容器内的指定路径该路径不用事先建好路径不存在的话会自动创建。
注意
Dockerfile 中可以有多个 CMD 指令但只有最后一个生效CMD 会被 docker run 之后的参数替换它和前面RUN命令的区别 CMD是在docker run 时运行。RUN是在 docker build时运行。
ENTRYPOINT
也是用来指定一个容器启动时要运行的命令
类似于 CMD 指令但是ENTRYPOINT不会被docker run后面的命令覆盖 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
命令格式
ENTRYPOINT [可执行文件,参数1,参数2,....]ENTRYPOINT可以和CMD一起用一般是变参才会使用 CMD 这里的 CMD 等于是在给 ENTRYPOINT 传参。 当指定了ENTRYPOINT后CMD的含义就发生了变化不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令他两个组合会变成ENTRYPOINT “[CMD]”
案例如下假设已通过 Dockerfile 构建了 nginx:test 镜像
是否传参按照dockerfile编写执行传参运行Docker命令docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf衍生出的实际命令nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/new.conf
如果 docker run 后面指定参数 会覆盖cmd里面的参数