Docker file解析

news2025/1/16 1:48:07

文章目录

      • 简介
      • 构建的三步骤
      • Docker执行Dockerfile的大致流程
      • DockerFile常用保留字指令
      • 创建第一个Dockerfile
      • 镜像的缓存特性

Docker file 解析

简介

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本,记录了镜像构建的所有步骤。Dockerfile中每一个指令都会创建一个镜像层,上层是依赖于下层的。Docker会缓存已有镜像的镜像层,构建新镜像时,如果镜像层已经存在,就直接使用,无须重新创建。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。也就是说,如果我们改变Dockerfile指令的执行顺序,或者修改或添加指令,都会使缓存失效。

构建的三步骤

· 编写Dockerfile文件
· Docker build命令构建镜像
· Docker run依镜像运行容器实例
在这里插入图片描述

Docker执行Dockerfile的大致流程

Docker按顺序运行指令。一个Dockerfile 必须 从指令开始FROM。
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成

看法:
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例
    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

在这里插入图片描述

DockerFile常用保留字指令

该指令不区分大小写。但是,惯例是让他们 为大写,以便更轻松地将它们与参数区分开来。

·    FROM        基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
·    MAINTAINER  镜像维护者的姓名和邮箱地址
·    RUN        RUN是在 docker build时运行    
·    EXPOSE     当前容器对外暴露出的端口
·    WORKDIR    指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
·    USER       指定该镜像以什么样的用户去执行,如果都不指定,默认是root
·    ENV        用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
也可以在其它指令中直接使用这些环境变量,
比如:WORKDIR $MY_PATH

·    ADD       将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包    
·    COPY      类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置    
·    COPY src dest  COPY ["src", "dest"]  <src源路径>:源文件或者源目录  <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。    
·    VOLUME    容器数据卷,用于数据保存和持久化工作
·    CMD       指定容器启动后的要干的事情

 注意
·    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
·    参考官网Tomcat的dockerfile演示讲解

参考tomcat8的dockerfile入门
· https://github.com/docker-library/tomcat

命令格式:
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

创建第一个Dockerfile

使用dockerfile构建ubuntu镜像(带有vim命令)

root@ubuntu:~#pwd 1
/mydocker
root@ubuntu:~# ls
Dockerfile 2
root@ubuntu:~# docker build -t  ubuntu:1.1 . 3
Sending build context to Docker daemon 32.26 kB 4
Step 1 : FROM ubuntu 5
---> 01f29b872827
Step 2/2 : RUN apt-get update && apt-get install -y vim 6
---> Running in 19c79c1861f7 7
......
Setting up vim (2:8.2.3995-1ubuntu2.11) ...
---> 964d76ff07b0 8
Removing intermediate container 19c79c1861f7 9
Successfully built 964d76ff07b0 10

root@ubuntu:~#
1 当前目录为 /root。
2 Dockerfile准备就绪。
3 运行docker build命令,-t将新镜像命名为ubuntu-with-vi-dockerfile,命令末尾的.指明build context为当前目录。Docker默认会从build context中查找Dockerfile文件,我们也可以通过-f参数指定Dockerfile的位置。
4 从这步开始就是镜像真正的构建过程。首先Docker将build context中的所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。
Dockerfile中的ADD、COPY等命令可以将build context中的文件添加到镜像。此例中,build context为当前目录 /root,该目录下的所有文件和子目录都会被发送给Docker daemon。
所以,使用build context就得小心了,不要将多余文件放到build context,特别不要把 /、/usr作为build context,否则构建过程会相当缓慢甚至失败。
5 Step 1:执行FROM,将Ubuntu作为base镜像。
Ubuntu镜像ID为01f29b872827。
6 Step 2:执行RUN,安装vim,具体步骤为 ⑦ ⑧ ⑨。
7 启动ID为19c79c1861f7的临时容器,在容器中通过apt-get安装vim。
8 安装成功后,将容器保存为镜像,其ID为964d76ff07b0。
这一步底层使用的是类似docker commit的命令。
9 删除临时容器19c79c1861f7。
10 镜像构建成功

通过docker images查看构建好的镜像信息,如图所示。
在这里插入图片描述
查看镜像的分层结构
docjer history centos:1.1
在这里插入图片描述
注:missing表示无法获取IMAGE ID 通常从Docker Hub下载的镜像会有这个问题

镜像的缓存特性

Docker会缓存已有镜像的镜像层,构建新镜像时,如果镜像层已经存在,就直接使用,无须重新创建。

· 优点
· 在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。
· 注意
· 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP竞赛管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 竞赛管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88244066 二、功能介绍 后…

【校招VIP】前端校招考点之页面转换算法

考点介绍&#xff1a; 在地址映射过程中&#xff0c;若在页面中发现所要访问的页面不在内存中&#xff0c;则产生缺页中断。当发生缺页中断时&#xff0c;如果操作系统内存中没有空闲页面&#xff0c;则操作系统必须在内存选择一个页面将其移出内存&#xff0c;以便为即将调入的…

C++信息学奥赛1147:最高分数的学生姓名

#include <iostream> #include <string> using namespace std; int main() {int n;// 输入一个整数ncin>>n;cin.ignore();string arr;string str;int max0;int fen;// 循环读取n个评分和对应的字符串for(int i0;i<n;i){cin>>fen>>arr;if(fen&…

分布式事务(7):SpringCloud2.0整合LCN

目前LCN版本已经升级为4.0了,但是官方没有SpringCloud2.0的demo案例。 因为LCN本身是开源的,有些大神对LCN框架源码做修改,可以支持SpringCloud2.0版本。 下载地址:https://download.csdn.net/download/u013938578/88251904 1 下载LCN服务端源码 https://download.csdn.…

ubuntu22.04.1-live的vm虚拟机扩展磁盘

1、虚拟机分配硬盘100G&#xff0c;进系统df -h根目录只有50G 2、查看所有块设备 lsblk 3、 查看卷信息vgdisplay 4、在原有基础上增加49G lvextend -L 49G /dev/ubuntu-vg/ubuntu-lv 5、调整大小 resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

深入理解线性回归模型的评估与优化方法

文章目录 &#x1f340;引言&#x1f340;模型评估方法&#x1f340;均方误差&#xff08;MSE&#xff09;&#x1f340;均方根误差&#xff08;RMSE&#xff09;&#x1f340;绝对平均误差&#xff08;MAE&#xff09;&#x1f340;模型优化策略&#x1f340;特征工程&#x1…

百度开源2019新型冠状病毒RNA预测算法

为应对2019年新型冠状病毒&#xff08;2019-nCoV&#xff09;爆发&#xff0c;中国科技巨头百度开源了其RNA&#xff08;核糖核酸&#xff09;预测算法LinearFold。该工具可以显著加快病毒RNA二级结构的预测时间&#xff0c;为一线研究人员提供在危机时期更好地了解病毒和开发靶…

多线程学习之多线程的三种实现方式及应用

一、继承Thread类 1.1方法 方法名说明void run()在线程开启后&#xff0c;此方法将被调用执行void start()使此线程开始执行&#xff0c;Java虚拟机会调用run方法() run()方法和start()方法的区别&#xff1a; run()&#xff1a;封装线程执行的代码&#xff0c;直接调用&am…

PDF如何转ppt?PDF转ppt的方法

PDF是一种广泛应用于文档传输和存储的格式&#xff0c;然而&#xff0c;在某些情况下&#xff0c;我们可能需要将PDF文件转换为PPT&#xff0c;以便更加灵活地编辑和展示内容。那么&#xff0c;PDF如何转ppt呢?在本文中&#xff0c;我们将介绍几种常用的方法和工具&#xff0c…

智慧编织非遗篇章,AI激活文化精髓的未来!

引言&#xff1a;非遗&#xff0c;指一系列与人类活动、传统技艺、知识体系和社会实践有关的非物质文化元素。它是一个民族难以估量的瑰宝&#xff0c;在中国悠久的历史中&#xff0c;古代先民在劳动生活中创造了大量非物质文化遗产&#xff0c;例如陶瓷的烧制、刺绣、织布技艺…

大隐隐于市,分享5个不为人知的小众软件

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。今天分享5个实用的软件&#xff0c;简单实用&#xff0c;效果拉满&#xff0c;堪称工作生活必备&#xff0…

Modbus通信协议详解

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议&#xff0c;控制器相互之间、控制器经由网络&#xff08;例如以太网&#xff09;和其它设备之间可以通信。它已经成为一通用工业标准。有了它&#xff0c;不同厂商生产的控制设备可以连成工业网络&#xff0c;进行集…

Google代码风格

下面的网站收录了Google的代码风格&#xff0c;有时间看看。 Google Style Guides 写代码要不断思考&#xff0c;多看多写呀&#xff01;

获取一个月有多少天

实现方式&#xff1a; 已知月份&#xff0c;得到这个月的第一天和最后一天作为查询条件查范围内的数据 new Date(year, month, date, hrs, min, sec)&#xff0c;new Date 可以接受这些参数创建一个时间对象 其中当我们把 date 设置为 0 的时候&#xff0c;可以直接通过 getD…

力扣:74. 搜索二维矩阵(Python3)

题目&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返…

瞬态电压抑制器(TVS)汽车级 SZESD9B5.0ST5G 工作原理、特性参数、封装形式

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

windows查看本机host地址

windows查看本机host地址 %windir%\system32\drivers\etc

SemrushBot蜘蛛爬虫屏蔽方式

查看访问日志时候发现有SemrushBot爬虫 屏蔽方法&#xff1a; 使用robots.txt文件是一种标准的协议,用于告诉搜索引擎哪些页面可以和不能被爬取,如想禁止Googlebot爬取整个网站的话,可以在该文件中添加以下内容: User-agent: Googlebot Disallow: / 对于遵循robots协议的蜘蛛…

人工智能项目集合推荐(数据集 模型训练 C++和Android部署)

人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …

搭建CFimagehost私人图床,实现公网远程访问的详细指南

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…