DockerFile 简介

本文详细解释了DockerFile的结构,构建过程中的关键步骤,包括FROM、RUN、MAINTAINER等保留字指令的用法。还介绍了虚悬镜像的概念以及如何查找和删除它们。

目录

1. 是什么

2 构建过程解析

2.1 构建的三个步骤

2.2 Docker内容基础知识

2.3 Docker执行DockerFile的大致流程

3. DockerFile 常用保留字指令

4. 案例理解常用保留字指令

4.1 案例要求

4.2 pull镜像

4.3 编写 Dockerfile文件

4.4 构建

4.5 运行

5. 虚悬镜像

5.1 是什么

5.2 查找容器中的虚悬镜像

5.3 删除虚悬镜像


1. 是什么

DockerFile使用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

2 构建过程解析

2.1 构建的三个步骤

  1. 编写DockerFile文件
  2. docker build命令构建镜像
  3. docker run 依照镜像运行容器实例

2.2 Docker内容基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

2.3 Docker执行DockerFile的大致流程

  1. docker从基础镜像运行要一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerFile中的下一条指令直到所有指令都执行完成

总结:DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

3. DockerFile 常用保留字指令

  1. FROM : 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模版,第一条必须是from
  2. MAINTAINER : 镜像维护者的姓名和邮箱地址
  3. RUN:容器构建时需要运行的命令;
    俩种格式:
           shell:RUN <命令行命令> ,类似于在终端操作shell命令 ,例 RUN yum -y install vim
           exec:RUN ["可执行文件","参数1","参数2"...],例RUN ["./test.php","dev","offline"] 等价         于RUN ./test.php dev offline
    RUN是在docker build时运行
  4. EXPOSE:当前容器对外暴露出的关口
  5. WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
  6. USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
  7. ENV:用来在构建镜像过程中设置环境变量。
    ENV MY_PATH /usr/mytest,这个环境变量可以在后续的任何RUN指令中使用,这就 如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量
  8. VOLUME:容器数据卷,用于数据保存和持久化工作
  9. ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
  10. COPY:类似ADD,拷贝文件和目录到镜像中。
    将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>            位置。COPY src dest  等价于 COPY["src","dest"]
  11. CMD:指定容器启动后要干的事情。和RUN相似,也是俩种格式。
    注意:Dockerfiel 中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run之后的参数替换。
    CMD是在docker run时运行;RUN是在docker build时运行。
  12. ENTRYPOINT:也是一个用来指定容器启动时要运行的命令。类似CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序

4. 案例理解常用保留字指令

4.1 案例要求

在原有centos基础上增加vim + ifconfig + jdk8的功能

4.2 pull镜像

docker pull centos:7

pull拉去centos镜像的时候,建议拉取centos:7(指定版本),要是不指定版本,默认拉取最新版即8.x,但是cengos官方在21年年底停止更新,yum指令没有源,会报错。

4.3 编写 Dockerfile文件

FROM centos:7
MAINTAINER dylan

ENV MY_PATH /usr/local
WORKDIR $MY_PATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络ip
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar。把 jdk-8u181-linux-x64.tar.gz 添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u181-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_181
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80

CMD echo $MY_PATH
CMD echo "success..................ok"
CMD /bin/bash

将上面的内容编写到 /myfile/Dockerfile 文件中。(下载的jdk 也在这个目录中)

4.4 构建

docker build -t 新镜像名字:TAG .
注意 上面TAG 后面后个点


构建信息:
[+] Building 29.6s (12/12) FINISHED                                                                                                                                                                 docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                          0.0s
 => => transferring dockerfile: 827B                                                                                                                                                                          0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                             0.0s
 => => transferring context: 2B                                                                                                                                                                               0.0s
 => [1/7] FROM docker.io/library/centos:7                                                                                                                                                                     0.0s
 => [internal] load build context                                                                                                                                                                             0.0s
 => => transferring context: 107B                                                                                                                                                                             0.0s
 => CACHED [2/7] WORKDIR /usr/local                                                                                                                                                                           0.0s
 => CACHED [3/7] RUN yum -y install vim                                                                                                                                                                       0.0s
 => CACHED [4/7] RUN yum -y install net-tools                                                                                                                                                                 0.0s
 => [5/7] RUN yum -y install glibc.i686                                                                                                                                                                      11.4s
 => [6/7] RUN mkdir /usr/local/java                                                                                                                                                                           0.5s 
 => [7/7] ADD jdk-8u181-linux-x64.tar.gz /usr/local/java/                                                                                                                                                     5.7s 
 => exporting to image                                                                                                                                                                                       11.6s 
 => => exporting layers                                                                                                                                                                                      11.5s 
 => => writing image sha256:e31b03196027d41b27e2f4342fa0705405b03b180b0239a95f1bb8a11cfbd4e0                                                                                                                  0.0s 
 => => naming to docker.io/library/centosjava:1.0.1    

4.5 运行

docker run -it 新镜像名字:TAG

5. 虚悬镜像

5.1 是什么

仓库名、标签都是<none>的镜像,称之为dangling image。

5.2 查找容器中的虚悬镜像

docker image ls -f dangling=true

5.3 删除虚悬镜像

虚悬镜像已经失去存在价值,可以删除

[root@localhost ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] 

头歌前面我们学习过使用commit构建一个镜像,由于commit在构建镜像时,很容易将无关内容添加到镜像且维护起来十分困难。所以我们不推荐使用commit来构建一个镜像。官方推荐使用Dockerfile来构建一个镜像,这个教程将详细地来讲述Dockerfile。 本关任务是初识Dockerfile,要求学习者参照示例完成使用Dockerfile构建一个名为busybox:v1的镜像,Dockerfile的内容为:以busybox为基础镜像,在基础镜像上,创建一个hello.txt文件。 相关知识 为了完成本关卡,你需要掌握: Dockerfile 简介; FROM 指令和 RUN 指令; 使用 Dockerfile 构建一个镜像; Dockerfile 构建镜像的过程详解。 Dockerfile 简介 从之前的学习中我们可以了解到:镜像的定制实际上就是定制每一层所添加的配置、文件。那么如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是DockerfileDockerfile描述了组装镜像的步骤,其中每一条命令都是单独执行的,除了FROM指令外,其他每一条指令都在上一条指定所生成的镜像基础上执行,执行完会生成一个新的镜像层,新的镜像层覆盖在原来的镜像层之上,从而形成了新的镜像。Dockerfile所生成的最终镜像就是在基础叠加镜像上一层层的镜像层组成的。 在Dockerfile中,指令不区分大小写,但是为了与参数区分,推荐大写。Docker会顺序执行Dockerfile中的指令,第一条必须是FROM指令,它用于指定构建镜像的基础镜像。在Dockerfile中,以#开头的行是注释。 下面我们开始介绍Dockerfile最基本的两条指令:FROM指令和RUN指令。 FROM 指令和 RUN 指令 ●FROM指定基础镜像; 格式:FROM <image>或 FROM <image>:<tag>。 FROM指令的功能是为后面的指令提供基础镜像,因此一个有效的Dockerfile必须以FROM指令作为第一条非注解指令。若FROM指令中tag参数为空,则tag默认为latest;若参数image或tag指定镜像不存在,则返回错误。 ●RUN执行命令; 格式:RUN <command>(shell格式)或RUN [“executable”, “param1“, “param2”](exec格式,非常推荐)。 RUN 指令是用来执行命令行命令的。RUN指令会在前一条命令创建出的镜像的基础上创建一个容器,并在容器中运行命令。在命令结束运行后提交新容器为新镜像,新镜像被Dockerfile的下一条指令使用。 之前说过,Dockerfile中每一个指令都会建立一个镜像层,RUN也不例外。每一个RUN 的行为,就和之前学习的docker commit定制镜像的过程一样:在之前镜像的基础上创建一个容器,在其上执行这些命令,执行结束后,最后 commit 这一层的修改,构成新的镜像。 使用 Dockerfile 构建一个镜像 下面介绍使用Dockerfile构建一个镜像,步骤如下: 首先创建一个空文件夹:mkdir newdir; 然后进入该文件夹:cd newdir; 在该文件夹下创建一个名为Dockerfile的文件,根据实际需求补全Dockerfile的内容; 使用Dockerfile构建一个镜像:docker build -t testimage .(注意这个小数点)其中-t指定新镜像的镜像名。 下面举一个实例,使用Dockerfile构建一个名为testimage的镜像,该镜像具备ubuntu:latest的运行环境,而且在镜像的/目录下创建了一个dir1文件夹。 #先创建一个新的空文件夹 mkdir newdir #进入这个新文件夹中 cd newdir #创建一个Dockerfile文件 touch Dockerfile #补全Dockerfile的内容(为了方便展示,这里用的是echo向Dockerfile中输入内容) echo "FROM ubuntu:latest" > Dockerfile echo "RUN mkdir /dir1" >> Dockerfile #使用该Dockerfile构建一个名为testimage的镜像 docker build -t testimage . Dockerfile 构建镜像的过程详解: 上面的实例创建了一个Dockerfile文件,Dockerfile的内容如下: FROM ubuntu:latest RUN mkdir /dir1 执行d
最新发布
10-22
### Dockerfile简介 Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建步骤。它包含一系列指令,这些指令按顺序执行,用于指定基础镜像、安装软件、设置环境变量等操作,最终构建出一个满足特定需求的 Docker 镜像 [^2]。 ### FROM指令 `FROM` 指令是 Dockerfile 中的第一个指令,用于指定基础镜像。在构建新镜像时,所有操作都是在这个基础镜像之上进行的。例如,若要以 `busybox` 为基础镜像,可在 Dockerfile 中使用 `FROM busybox` 语句。 ### RUN指令 `RUN` 指令用于在镜像构建过程中执行命令。可以使用该指令在基础镜像上安装软件、创建文件等操作。在构建过程中,每执行一次 `RUN` 指令都会生成一层新的镜像。 ### 使用Dockerfile构建名为busybox:v1的镜像并创建hello.txt文件 #### 1. 创建目录并进入 ```bash mkdir -p /usr/local/docker_images/busybox_image1 && cd /usr/local/docker_images/busybox_image1 ``` 此步骤创建一个用于存放 Dockerfile 和相关文件的目录,并进入该目录 [^3]。 #### 2. 创建Dockerfile 使用文本编辑器(如 `vim`)创建 Dockerfile,并添加以下内容: ```Dockerfile FROM busybox RUN touch /hello.txt ``` 上述 Dockerfile 中,`FROM busybox` 指定以 `busybox` 为基础镜像;`RUN touch /hello.txt` 指令在镜像中创建一个名为 `hello.txt` 的文件。 #### 3. 构建镜像 在包含 Dockerfile 的目录下,执行以下命令构建镜像: ```bash docker build -t busybox:v1 . ``` `docker build` 命令用于构建镜像,`-t` 选项用于指定镜像的标签(名称和版本),这里将镜像命名为 `busybox:v1`,最后的 `.` 表示当前目录,即 Dockerfile 所在的目录。该命令会将当前目录下所有数据作为上下文发送给 Docker 服务端,服务端在校验 Dockerfile 格式通过后,逐条执行其中定义的指令。碰到 `RUN` 指令会生成一层新的镜像,最终如果创建镜像成功,会返回最终镜像的 ID [^2]。 ### 构建过程详解 1. **读取 Dockerfile**:`docker build` 命令读取指定路径下的 Dockerfile。 2. **发送上下文**:将指定路径下的所有数据作为上下文发送给 Docker 服务端。 3. **校验格式**:Docker 服务端校验 Dockerfile 的格式是否正确。 4. **执行指令**:按顺序执行 Dockerfile 中的指令。首先执行 `FROM busybox`,获取基础镜像;然后执行 `RUN touch /hello.txt`,在基础镜像上创建 `hello.txt` 文件,并生成一层新的镜像。 5. **返回结果**:如果构建成功,返回最终镜像的 ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值