Dockerfile入门:构建镜像的完整指南
目录一、dockerfile简介什么是dockerfiledockerfile是什么为什么要用dockerfileDockerfile、Docker镜像和Docker容器的关系二、DockerFile需要注意的编写规范三、Docekrfile指令解析四、常用的Dockerfile指令详解、格式与用法4.1 FROM必须4.2 MAINTAINER4.3 USER4.4 ENV必须4.5 VOLUME4.6 EXPOSE4.7 COPY4.8 ADD4.9 WORKDIR4.10 RUN必须4.11 CMD五、docker build构建镜像六、【实战】docker自定义镜像1、编写Dockerfile2、构建镜像3、查看镜像七、总结相关文章一、dockerfile简介什么是dockerfileDockerfile 是一个用来构建镜像的文本文件文本内容包含了一条条构建镜像所需的指令(Instruction)和操作命令;每一条指令构建一层镜像因此每一条指令的内容就是描述该层镜像应当如何构建也就是你要执行的操作命令。dockerfile是什么dockerfile是纯文本文件dockerfile是用来构建镜像的dockerfile 用于指示 docker image build 命令自动构建Image的源代码dockerfile构建镜像的的格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefdocker/spanspan stylecolor:#98c379 build/spanspan stylecolor:#d19a66 -t/spanspan stylecolor:#98c379 要打的镜像名:版本号/spanspan stylecolor:#98c379 Dockerfile路径/span/code/span/spandockerfile构建镜像的的实例span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefdocker/spanspan stylecolor:#98c379 build/spanspan stylecolor:#d19a66 -t/spanspan stylecolor:#98c379 work:v1/spanspan stylecolor:#98c379 ./span/code/span/span为什么要用dockerfile❓在dockerhub中官方提供很多镜像已经能满足我们99的服务了,为什么还需要自定义镜像️解析是官方的镜像很多同时也可以满足我们99的服务但是如果有的公司要做自己的产品那么官网的镜像肯定是没有的这时候就需要用到自定义镜像而自定义镜像就是dockerfile构建成的我们可以用dockerfile自定义写需要的操作来用dockerfile的指令来实现最终采用docker build来构建镜像构建完镜像可以采用docker save命令打成tar包以便于日后在其他服务器上使用也可以采用docker push提交到私有镜像仓库或dockerhub中。如上图所示Dockerfile是独立于本地docker实例的一个文本文件用于自动化地构建具有特定功能的docker镜像。Dockerfile镜像构建三部曲1构建Dockerfile文件2采用docker build命令构建镜像3采用docker run命令依据镜像运行容器实例。Dockerfile、Docker镜像和Docker容器的关系从应用软件开发角度来看它们分别表示软件开发的三个阶段1Dockerfile是软件开发的原材料2Docker镜像是软件的交付品3Docker容器是Docker交付镜像的实例化代表软件的实际运行过程。总结Dockerfile面向开发Docker镜像为交付标准Docker容器与部署、运维相关三则相辅相成缺一不可他们是Docker的三大基石。Docker在实际运行中Dockerfile、Docker镜像、Docker容器三者的运作内容如下所示1、Dockerfile定义了进程需要的一切内容包括代码执行、文件/环境变量、依赖包、运行环境、操作系统发行版本、服务进程、内核进程等等很多与操作系统底层相关的内容。2、通过docker build指令会生成一个Docker镜像它是为用户提供各种服务的基础3、Docker容器则是一个实例化的服务进程。二、DockerFile需要注意的编写规范1. # 代表注释2.指令必须要大写后面最少需要带一个参数最多无限制;3.执行dockerfile的时候指令是按照从上到下的顺序执行的三、Docekrfile指令解析注意指令全部都必须为大写后面跟的是你要执行的操作命令指令功能简介FROM指定构建新image是使用的基础image通常必须是Dockerfile的第一个有效指令定义一个基础镜像。LABEL附加到image之上的元数据键值格式定义一些元数据。ENV以键值格式设定环境变量可被其后的指令所调用且基于新生成的image运行的Container中也会存在这些变量。RUN以FROM中定义的image为基础环境运行指令命令生成结果将作为新image的一个镜像层并可由后续指令所使用。RUN后跟要执行的命令。CMD基于dockerfile生成的image运行的container时CMD能够指定容器中默认运行的程序因而其只应该定义一次。ENTRYPOINT类似于CMD指令的功能但不能被命令行指定要运行的应用程序覆盖且与CMD共存时CMD的内容将作为该指令中定义的程序的参数。WORKDIR相当于cd切换目录的命令如果切换的那个地方没有哪个目录则会自动创建一个目录。COPY相当于cp命令复制主机上或者前一阶段构建结果中需要使用--from选项文件或目录生成新的镜像。ADD与COPY指令的功能相似但ADD传输压缩包的时候是可以解压的。VOLUME指定基于新生成的Image运行Container时期望作为volume使用的目录。EXPOSE指定基于新生成的lmage运行Container时期望 暴露的端口但实际暴露与否取决于docker run”命令的选项支持TCP和UDP协议。USER为Dockerfile中该指令后面的RUN、CMD和ENTRYPOING指令中要运行的应用程序指定运行者身份UID以及一个可选的GID。ARG定义专用于build过程中的变量但仅对该指标之后的调用生效其值可由命令行选项--build-arg进行传递。ONBUILD触发器生效于由该Dockerfile 构建出的新l/mage被用于另一个Dockerfile中的FROM指令作为基础镜像时。STOPSIGNAL用于通知Container终止的系统调用信号。HEALTHCHECK定义检测容器应用的健康状态的具体方法。SHELL为容器定义运行时使用的默认shel程序Linux系统默认使用 [/bin/sh”-c], Windows默认使用 [’cmd, /S,/C]。四、常用的Dockerfile指令详解、格式与用法必须是写dockerfile必须有的没有加的是可选的。4.1 FROM必须指定一个基础镜像必须为第一个命令。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefFROM/spanspan stylecolor:#98c379 基础镜像/span/code/span/span举例一个nvidia、cuda10.1的centos7基础镜像span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefFROM/spanspan stylecolor:#98c379 nvidia/cuda:10.1-cudnn7-devel-centos7/span/code/span/span4.2 MAINTAINER维护者信息可以写邮箱编辑人等等。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 邮箱/名字/span/code/span/span举例展示邮箱和名字span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 liucy/span span stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 121212qq.com/span span stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 121212163.com/span/code/span/span4.3 USER指定运行容器时的用户名或 UID后续的 RUN 也会使用指定用户。使用USER指定用户时可以使用用户名、UID或GID或是两者的组合。当服务不需要管理员权限时可以通过该命令指定运行用户。并且可以在之前创建所需要的用户格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefUSER/spanspan stylecolor:#98c379 用户名/span span stylecolor:#abb2bf/span span stylecolor:#61afefUSER/spanspan stylecolor:#98c379 user:group /span span stylecolor:#abb2bf/span span stylecolor:#61afefUSER/spanspan stylecolor:#98c379 uid /span span stylecolor:#abb2bf/span span stylecolor:#61afefUSER/spanspan stylecolor:#98c379 uid:gid /span span stylecolor:#abb2bf/span span stylecolor:#61afefUSER/spanspan stylecolor:#98c379 user:gid /span span stylecolor:#abb2bf/span span stylecolor:#61afefUSER/spanspan stylecolor:#98c379 uid:group/span/code/span/span举例指定root用户span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefUSER/spanspan stylecolor:#98c379 root/span/code/span/span4.4 ENV必须设置环境变量格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefENV/spanspan stylecolor:#98c379 环境变量路径/span/code/span/span举例设置jdk1.8的环境变量span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefENV/spanspan stylecolor:#98c379 JAVA_HOME/usr/local/jdk1.8.0_333//span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 export/spanspan stylecolor:#98c379 JRE_HOME/spanspan stylecolor:#e06c75$JAVA_HOME/spanspan stylecolor:#98c379/jre/span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 export/spanspan stylecolor:#98c379 CLASSPATH.:/spanspan stylecolor:#e06c75$JAVA_HOME/spanspan stylecolor:#98c379/lib:/spanspan stylecolor:#e06c75$JRE_HOME/spanspan stylecolor:#98c379/lib/span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 PATH/spanspan stylecolor:#e06c75$JAVA_HOME/spanspan stylecolor:#98c379/bin:/spanspan stylecolor:#e06c75$PATH/span/code/span/span4.5 VOLUME用于指定持久化目录指定此目录可以被挂载出去格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefVOLUME/spanspan stylecolor:#98c379 挂载路径/span/code/span/span举例挂载到/data目录span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefVOLUME/spanspan stylecolor:#abb2bf [/spanspan stylecolor:#98c379/data/spanspan stylecolor:#abb2bf]/span/code/span/span4.6 EXPOSE设置端口EXPOSE指令是声明运行时容器提供服务端口这只是一个声明在运行时并不会因为这个声明应该就会开启这个端口的服务。在Dockerfile中写入这样的声明有两个好处是帮助镜像使用者理解这个镜像服务的守护端口以方便配置映射在运行是使随机端口映射时也就是docker run -P(大写)时会自动随机映射EXPOSE端口。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefEXPOSE/spanspan stylecolor:#98c379 端口号/span/code/span/span举例设置一个8080端口span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefEXPOSE/spanspan stylecolor:#d19a66 8080/span/code/span/span4.7 COPY复制文件相当于linux命令中的cp命令功能类似ADD但是是不会自动解压文件也不能访问网络资源格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefCOPY/spanspan stylecolor:#98c379 源文件及路径/spanspan stylecolor:#98c379 目标路径/span/code/span/span举例复制一个mysql到/usr/local/下span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefCOPY/spanspan stylecolor:#98c379 /root/mysql/spanspan stylecolor:#98c379 /usr/local//span/code/span/span4.8 ADD将本地文件添加到容器中tar类型文件会自动解压(网络压缩资源不会被解压)可以访问网络资源类似wget。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefADD/spanspan stylecolor:#98c379 源文件及路径/spanspan stylecolor:#98c379 目标路径/span/code/span/span举例移动一个mysql-2-2.tarspan stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefADD/spanspan stylecolor:#98c379 /usr/local/mysql-2-2.tar/spanspan stylecolor:#98c379 /root//span/code/span/span4.9 WORKDIR切换目录相当于linux命令中的cd命令切换到这个目录进入容器时就是这个目录所以workdir就属于启动默认的目录。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefWORKDIR/spanspan stylecolor:#98c379 目录名/span/code/span/span举例设置启动就在/data/目录span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefWORKDIR/spanspan stylecolor:#98c379 /data//span/code/span/span4.10 RUN必须构建镜像时执行的命令执行的命令就是你指定的要他干什么使用linux命令就可以。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefRUN/spanspan stylecolor:#98c379 要执行的命令/span/code/span/span举例打镜像时下载一个netstat命令span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefRUN/spanspan stylecolor:#98c379 yum/spanspan stylecolor:#d19a66 -y/spanspan stylecolor:#98c379 install/spanspan stylecolor:#98c379 net-tools/span/code/span/span4.11 CMD构建镜像后调用也就是在容器启动时才进行调用。写一次dockerfile只能出现一次CMD而出现CMD的地方就属于结尾如果下面有RUN指令则都不执行。格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefCMD/spanspan stylecolor:#98c379 要执行的命令/span/code/span/span举例执行删除dockerfile打完镜像要删除dockerfilespan stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefCMD/spanspan stylecolor:#98c379 rm/spanspan stylecolor:#d19a66 -rf/spanspan stylecolor:#98c379 /data/dockerfile/span/code/span/span五、docker build构建镜像dockerfile构建镜像的的格式span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefdocker/spanspan stylecolor:#98c379 build/spanspan stylecolor:#d19a66 -t/spanspan stylecolor:#98c379 要打的镜像名:版本号/spanspan stylecolor:#98c379 Dockerfile路径/span/code/span/spandockerfile构建镜像的的实例span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefdocker/spanspan stylecolor:#98c379 build/spanspan stylecolor:#d19a66 -t/spanspan stylecolor:#98c379 work:v1/spanspan stylecolor:#98c379 ./span/code/span/span六、【实战】docker自定义镜像说明此处只是测试使用并不能用到生产中生产中要根据自己的情况来写可以构建成镜像也可以创建容器可以进入容器查看这些文件但是web页面访问不到因为没有加入jar包之类的可以自行放入一个jar包端口设置3000然后启动jar包就可以了去访问web页面了。前言有一点特别重要构建镜像的时候要看好你的文件是不是这个目录要不然打到一半会报错说找不到文件切记要记得放文件在放文件的目录执行。1、编写Dockerfilespan stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#7f848eem#创建Dockerfile文本/em/span span stylecolor:#61afefvim/spanspan stylecolor:#98c379 Dockerfile/span/code/span/spanspan stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#7f848eem#设置基础镜像/em/span span stylecolor:#61afefFROM/spanspan stylecolor:#98c379 nvidia/cuda:10.1-cudnn7-devel-centos7/span span stylecolor:#7f848eem#维护者信息/em/span span stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 liucy/span span stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 121212qq.com/span span stylecolor:#61afefMAINTAINER/spanspan stylecolor:#98c379 121212163.com/span span stylecolor:#7f848eem#指定运行时的用户以及镜像的实际用户/em/span span stylecolor:#61afefUSER/spanspan stylecolor:#98c379 root/span span stylecolor:#7f848eem#下载netstat命令/em/span span stylecolor:#61afefRUN/spanspan stylecolor:#98c379 yum/spanspan stylecolor:#d19a66 -y/spanspan stylecolor:#98c379 install/spanspan stylecolor:#98c379 net-tools/span span stylecolor:#7f848eem#设置jdk1.8的环境/em/span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 JAVA_HOME/usr/local/jdk1.8.0_333//span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 export/spanspan stylecolor:#98c379 JRE_HOME/spanspan stylecolor:#e06c75$JAVA_HOME/spanspan stylecolor:#98c379/jre/span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 export/spanspan stylecolor:#98c379 CLASSPATH.:/spanspan stylecolor:#e06c75$JAVA_HOME/spanspan stylecolor:#98c379/lib:/spanspan stylecolor:#e06c75$JRE_HOME/spanspan stylecolor:#98c379/lib/span span stylecolor:#61afefENV/spanspan stylecolor:#98c379 PATH/spanspan stylecolor:#e06c75$JAVA_HOME/spanspan stylecolor:#98c379/bin:/spanspan stylecolor:#e06c75$PATH/span span stylecolor:#7f848eem#开放一个3000端口/em/span span stylecolor:#61afefEXPOSE/spanspan stylecolor:#d19a66 3000/span span stylecolor:#7f848eem#移动并解压Grafana.tar安装包/em/span span stylecolor:#61afefADD/spanspan stylecolor:#98c379 /root/Grafana.tar/spanspan stylecolor:#98c379 /home//span span stylecolor:#7f848eem#复制当前目录下的所有到/data/cs/里/em/span span stylecolor:#61afefCOPY/spanspan stylecolor:#98c379 .//spanspan stylecolor:#98c379 /data/home//span span stylecolor:#7f848eem#设置python3.6.8环境/em/span span stylecolor:#61afefRUN/spanspan stylecolor:#98c379 cd/spanspan stylecolor:#98c379 /data/Python-3.6.8//spanspan stylecolor:#abb2bf /spanspan stylecolor:#61afef./configure/spanspan stylecolor:#d19a66 --prefix/root/python36/spanspan stylecolor:#abb2bf /spanspan stylecolor:#61afefmake/spanspan stylecolor:#abb2bf /spanspan stylecolor:#61afefmake/spanspan stylecolor:#98c379 install/spanspan stylecolor:#abb2bf /spanspan stylecolor:#61afefln/spanspan stylecolor:#d19a66 -s/spanspan stylecolor:#98c379 /root/python36/bin/python3.6/spanspan stylecolor:#98c379 /usr/bin/python3/spanspan stylecolor:#abb2bf /spanspan stylecolor:#61afefln/spanspan stylecolor:#d19a66 -s/spanspan stylecolor:#98c379 /root/python36/bin/pip3/spanspan stylecolor:#98c379 /usr/bin/pip3/span span stylecolor:#7f848eem#切换到/data/目录/em/span span stylecolor:#61afefWORKDIR/spanspan stylecolor:#98c379 /data//span span stylecolor:#7f848eem#最后执行删除Dockerfile/em/span span stylecolor:#61afefCMD/spanspan stylecolor:#98c379 rm/spanspan stylecolor:#d19a66 -rf/spanspan stylecolor:#98c379 Dockerfile/span/code/span/span2、构建镜像span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#61afefdocker/spanspan stylecolor:#98c379 build/spanspan stylecolor:#d19a66 -t/spanspan stylecolor:#98c379 dockerfile:v1/spanspan stylecolor:#98c379 ./span/code/span/span等待构建完成。3、查看镜像span stylebackground-color:#282c34span stylecolor:#abb2bfcode classlanguage-bashspan stylecolor:#abb2bf[rootcs ~]# docker images/span span stylecolor:#61afefREPOSITORY/spanspan stylecolor:#98c379 TAG/spanspan stylecolor:#98c379 IMAGE/spanspan stylecolor:#98c379 ID/spanspan stylecolor:#98c379 CREATED/spanspan stylecolor:#98c379 SIZE/span span stylecolor:#61afefdockerfile/spanspan stylecolor:#98c379 v1/spanspan stylecolor:#98c379 15c89s63e742/spanspan stylecolor:#d19a66 2/spanspan stylecolor:#98c379 months/spanspan stylecolor:#98c379 ago/spanspan stylecolor:#98c379 8.5GB/span/code/span/span

相关新闻

Dify开源LLMOps平台:高效构建AI应用的实践指南

Dify开源LLMOps平台:高效构建AI应用的实践指南

1. 项目概述:Dify作为开源LLMOps平台的崛起在2023年AI智能体爆发式增长的背景下,Dify作为一款开源的LLMOps(大语言模型运维)平台迅速进入开发者视野。这个由国内团队开发的项目,本质上是一个面向生产环境的AI应用开发框…

2026/7/31 1:24:50 阅读更多
rom和ram的区别是什么

rom和ram的区别是什么

当然。RAM(随机存取存储器)和 ROM(只读存储器)是计算机系统中最核心的两种存储器,它们最根本的区别在于数据的易失性和读写特性,这也决定了它们在计算机中扮演的完全不同的角色。1. 核心区别对比特性维度RA…

2026/7/31 1:24:50 阅读更多
WPF开发个人记账系统:MVVM与SQLite实战

WPF开发个人记账系统:MVVM与SQLite实战

1. 项目概述:个人记账小系统的核心价值这个个人记账小系统是我在业余时间开发的一个轻量级财务管理工具,主要解决日常收支记录的痛点。相比市面上复杂的记账软件,它去除了所有冗余功能,保留了最核心的记账、统计和报表功能。整个系…

2026/7/31 2:24:52 阅读更多
[Android ] 自动滑动屏幕器 AutoSlide v2.5.2

[Android ] 自动滑动屏幕器 AutoSlide v2.5.2

[Android ] 自动滑动屏幕器 AutoSlide v2.5.2 链接:https://pan.xunlei.com/s/VOyn5SeJcqYjuVq7amd63yTsA1?pwdsyte# 一款免费开源的专为测试与内容浏览设计的屏幕自动滑动工具。其采用Kotlin架构开发,通过模拟手指滑动行为,无需root执行…

2026/7/31 2:14:52 阅读更多
HART协议详解:05 HART现场通信实战

HART协议详解:05 HART现场通信实战

第五季 HART现场通信实战 ——从USB-HART Modem抓包到工程诊断:让协议知识变成维修能力 各位工业现场的工程师朋友们,大家好! 经过前四季的系统学习,我们已经构建了HART协议的完整理论框架: 第一季:六层生命模型与本质认知 第二季:物理层4–20mA与FSK魔法 第三季:数…

2026/7/31 0:14:40 阅读更多
维修工程师的示波器实战:02 探头地线——示波器最大的“坑”

维修工程师的示波器实战:02 探头地线——示波器最大的“坑”

第二篇:探头地线——示波器最大的“坑” ——那根不起眼的小地线,可能比你测的信号还重要 很多工程师第一次用示波器时,都会经历这样一个“惊魂”时刻。 某食品厂包装线,伺服偶发报警。年轻工程师判断是编码器信号受干扰,便拿出示波器认真测量。波形一出来,所有人都倒…

2026/7/31 0:14:40 阅读更多