Docker file解析

文章目录

      • 简介
      • 构建的三步骤
      • 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.mzph.cn/news/55964.shtml

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

相关文章

单片机IO模拟串口协议

一、前言 嵌入式硬件平台调试中常用的debug方法是看串口打印定位问题&#xff0c;但有时候会遇到单片机没有串口外设或者串口引脚被占用的情况&#xff0c;这时候也可以在代码里操作空闲的IO输出不同个数的脉冲来达到调试的效果&#xff0c;但是要用逻辑分析仪抓线逐个看波形比…

在渗透测试中,探测到6379端口,你打算怎么利用

在渗透测试中&#xff0c;探测到6379端口&#xff0c;你打算怎么利用&#xff1f; 6379端口是Redis数据库的默认端口号。Redis是一种基于键值对的内存数据库&#xff0c;具有高性能和灵活的数据存储和检索功能。6379端口是Redis数据库的默认通信端口&#xff0c;用于连接到Red…

Redis数据结构:Set类型全面解析

Set 类型是一个无序并唯一的键值集合&#xff0c;它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的&#xff0c;所以添加&#xff0c;删除&#xff0c;查找的复杂度都是 O(1)。相对于列表&#xff0c;集合也有两个特点&#xff1a;无序、不可重复 …

从零开始学习 Java:简单易懂的入门指南之包装类(十九)

包装类 包装类5.1 概述5.2 Integer类5.3 装箱与拆箱5.4 自动装箱与自动拆箱5.5 基本类型与字符串之间的转换基本类型转换为StringString转换成基本类型 5.6 底层原理 算法小题练习一&#xff1a;练习二&#xff1a;练习三&#xff1a;练习四&#xff1a;练习五&#xff1a; 包装…

Java代码优化案例2:使用HashMap代替List进行数据查找

在开发过程中&#xff0c;我们经常需要在一个集合中查找某个元素。一种常见的做法是使用List来存储数据&#xff0c;然后通过循环遍历List来查找目标元素。然而&#xff0c;当数据量较大时&#xff0c;这种做法效率较低。我们可以通过使用HashMap来优这个过程。 1. 原始代码实…

vue3 单一状态管理

目录 1&#xff0c;问题2&#xff0c;单一状态管理 1&#xff0c;问题 有一个全局错误弹窗&#xff0c;当项目中有接口报错时&#xff0c;会显示错误信息。 思路&#xff1a;在 axios 的响应拦截器中&#xff0c;满足条件后打开错误弹窗。 问题&#xff1a;如何在 js 文件&a…

数据库——redis介绍

文章目录 redis是什么&#xff1f;分布式缓存常见的技术选型方案有哪些&#xff1f;说一下 Redis 和 Memcached 的区别和共同点&#xff1f; redis是什么&#xff1f; 简单来说 Redis 就是一个使用 C 语言开发的数据库&#xff0c;不过与传统数据库不同的是 Redis 的数据是存在…

浅析三维模型OBJ格式轻量化压缩文件大小的技术方法

浅析三维模型OBJ格式轻量化压缩文件大小的技术方法 在减小三维模型OBJ格式轻量化文件大小方面&#xff0c;有许多技术和方法可以使用。下面我将介绍一些常用的方法来减小OBJ文件的大小。 1、优化顶点数量&#xff1a;减少OBJ文件中的顶点数量是减小文件大小的一种有效方法。可…

同一个服务器发布两个前端(网站)

一开始怎么设置都是505&#xff0c;后来把网站文件的位置换到原已经发布成功的网站位置&#xff0c;就成功了。考虑应该是权限问题 server {listen 80;server_name localhost;# https配置参考 start#listen 443 ssl;# 证书直接存放 /docker/nginx/cert/ 目录下即…

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter

目录 一. &#x1f981; 前言二. &#x1f981; Spring-boot starter 原理实现分析2.1 自动配置原理 三. &#x1f981; 操作实践3.1 项目场景3.2 搭建项目3.3 添加相关依赖3.4 删除一些不需要的东西3.5 发邮件工具类逻辑编写3.6 创建相关配置类3.7 创建 Spring.factories 文件…

保障Web安全:构建可靠的网络防御体系

在当今数字化时代&#xff0c;Web安全已成为互联网世界中至关重要的议题。随着网络攻击手段的不断演进和网络犯罪的增加&#xff0c;保护用户数据和确保系统安全性已成为任何Web应用程序的首要任务。本文将深入探讨Web安全的重要性以及构建可靠的网络防御体系的关键要素。我们将…

LLMs之dataset:大语言模型LLMs相关开源数据集的简介、下载、使用方法之详细攻略

LLMs之dataset:大语言模型LLMs相关开源数据集的简介、下载、使用方法之详细攻略 目录 LLMs相关开源数据集的简介 1、SFT→RM+PPO三阶段关系梳理、数据集格式对比

Dart PowerTCP Emulation for .NET Crack

Dart PowerTCP Emulation for .NET Crack .NET CF上的PowerTCP Emulation为手持设备提供了高级的Internet通信组件。这些功能允许同步操作&#xff0c;这样可以消耗更少的资源&#xff0c;提供更大的灵活性&#xff0c;并生成易于维护的软件。带有.NET的PowerTCP仿真包括VT52、…

服务器Linux系统配置mysql数据库主从自动备份

服务器Linux系统配置mysql数据库主从自动备份 当数据内容越来越多的时候&#xff0c;数据库也变得越来越大了。如果不小心误删了&#xff0c;或者被黑主机了&#xff0c;那就什么都没有了。所以数据库的数据怎么能让它不丢失做到万无一失变得尤为重要&#xff01; 我是艾西&a…

《机器学习核心技术》分类算法 - 决策树

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 决策树 1、决策树API2、决策时实际应用2.1、获取数据集2.2、划分数据集2.3、决策…

微服务(rpc)

微服务&#xff08;rpc&#xff09; 微服务必备的模块生产者消费者管理平台流量控制集群情况下如何做到流量监控 负载均衡服务发现和治理序列化传输序列化和反序列化 微服务是一种架构风格&#xff0c;将一个应用程序拆分为一组小型、独立的服务&#xff0c;每个服务都可以独立…

iOS 页面布局兼容放大模式

背景 有用户反馈&#xff0c;在iPhone SE 2代 存在遮挡UI界面问题&#xff0c;经过分析&#xff0c;发现用户开启了放大模式&#xff08;Display Zoom -> Larger Font&#xff09;导致实际显示时屏幕大小与正常模式不同&#xff0c;所以导致部分UI遮挡。 各手机屏幕在正常…

Vue3 中自定义hook函数

自定义hook函数 使用Vue3的组合API封装的可复用的功能函数&#xff1b;自定义hook的作用类似于vue2中的mixin技术&#xff1b;自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂&#xff1b; 什么是vue2中的mixin混入&#xff1f; 混入 (mixin) 提供了一种非常灵活的…

Mybatis映射.动态sql.分页

介绍&#xff1a; 动态SQL是MyBatis提供的一种动态生成SQL语句的方式&#xff0c;可以根据不同的条件生成不同的SQL语句&#xff0c;从而实现更加灵活的查询和操作。 在MyBatis的映射文件中&#xff0c;可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL…

深入理解Reactor模型的原理与应用

1、什么是Reactor模型 Reactor意思是“反应堆”&#xff0c;是一种事件驱动机制。 和普通函数调用的不同之处在于&#xff1a;应用程序不是主动的调用某个 API 完成处理&#xff0c;而是恰恰相反&#xff0c;Reactor逆置了事件处理流程&#xff0c;应用程序需要提供相应的接口并…