Docker 镜像构建 dockerfile详解 镜像优化

本文详细介绍了Dockerfile的使用,包括语法规则、指令详解,以及如何通过优化镜像构建过程来减小镜像体积,如减少RUN命令、清理中间产物和使用多阶段构建。推荐使用Dockerfile而非docker commit来构建镜像,以提高透明度和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 镜像构建

  • 在构建容器化应用时,相当重要的步骤莫过于镜像制作,通常镜像的制作有两种方式:
  1. 使用现有的容器使用docker commit 生成镜像
  2. 使用Dockerfile进行镜像构建
  • 采用docker commit 生成的镜像实际上是容器内的文件系统进行修改再进行提交,而运行的容器实际上是在镜像的文件系统顶层添加了一层读写层,所都的修改都是基于这一层,当生成镜像时会将这一层数据保存,所以每次使用commit提交镜像时候都会比原来多一层,这样会使得镜像越来越大并且不易维护。同时,对于镜像使用者来说完全不透明,使用者不清楚该镜像怎么样构建的,是否安全等,这种方式及其不推荐。
  • 而使用Dockerfile构建镜像,对于使用者来说完全透明,构建镜像的每一个步骤都在Dockerfile文件中描述的清清楚楚,同时当需要对镜像修改时候,只需修改Dockerfile文件中的指令,维护镜像只需要维护一个Dockerfile,这也是镜像构建的最佳方式。

1.1 docker commit (不推荐)

注意:dockercommit 无法看到我们在 shell 中做了什么操作,镜像无法审计,有安全隐患,不推荐使用
docker load -i busybox.tar 或者 docker pull busybox拉取一个镜像
docker run it --name vm1 busybox 运行容器
Ctrl+p+q退出容器但不不关闭容器
docker tattach vm1重新连接到容器
docker commit vm1 test:v1 提交更改过的容器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 Dockerfile方式(推荐)

新建一个目录来存放dockerfile,里面不要放其他文件mkdir /root/docker
vim /root/docker/dockerfile

[root@server2 ~]# mkdir /root/docker
[root@server2 ~]# vim /root/docker/dockerfile
[root@server2 ~]# cat /root/docker/dockerfile 
FROM busybox
RUN echo testmyr1 > file1
RUN echo testmyr2 > file2

cd /root/docker
docker build -t test:v2..表示提交当前目录中的内容
docker history test:v2可以看见构建过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 相同的步骤从缓存中读取
    注意:要使用缓存特性,前面的内容都不能更改,只能新增

2. dockerfile详解

  • Dockerfile实际上就是一个文本文件,只不过这里的文件内容被Docker Deamon识别从而进行镜像构建。
  • 使用Dockerfile步骤:
  1. 编写Dockerfile文件,用于描述镜像生成的步骤
  2. 使用docker build -t name:tag 命令构建镜像

2.1语法规则

1.#号代表注解。
2.Dockerfile每一行都是以某个指令(约定大写字母)开始,后面可加参数构成完整指令,用于描述镜像构建步骤。
3.指令从上倒下依次执行
4.Dockerfile的第一个指令一定是FROM指令,用于指定基础镜像
5.Dockerfile还可以使用.dockerignore文件来忽略在制作镜像时候需要忽略的文件或者目录,列如使用COPY指令时候忽略某些文件或者目录。
6.所有指令参数为数组时,最好使用双引号
  • 环境变量引用
1.若要在Dockerfile中引环境变量则使用$variable_name或${variable_name}
2.当变量为空或者变量值未设置可以使用${variable_name:-value}来指定变量的默认值
  • docker build命令
  • docker build 命令用于基于Dockerfile构建镜像,使用语法:
  • docker build [OPTIONS] PATH | URL | -
  • 其中PATH代表含有Dockfile的目录,当然也可以是URL中含有Dockerfile
    常用选项:
-t, --tag list  指定生成镜像标签,格式为name:tag
-f, --file string  单独指定Dockerfile文件位置
--build-arg list  设置构建时的变量
--no-cache  构建镜像时候不使用缓存

2.2 指令详解

  • Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD
类型 命令
基础镜像信息 FROM
维护者信息
镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令 CMD、ENTRYPOINT
  1. FROM :指定基础镜像

定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个busybox镜像的容器,再进行修改一样,基础镜像是必须指定的。而FROM就是指定基础镜 像,因此一个Dockerfile中FROM是必备的指令,并且必须是第一条指令。
如:指定busybox作为基础镜像

FROM buxybox
  1. RUN:执行命令

RUN指令在新镜像内部执行的命令,如:执行某些动作、安装系统软件、配置系统信息之类&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值