利用Dockerfile开发定制镜像实战.

news2024/12/23 9:05:28

Dockerfile的原理

dockerfile是一种文本格式的文件,用于描述如何构建Docker镜像。在Dockerfile中,我们可以定义基础镜像、安装依赖、添加文件等操作,最终生成一个可以直接运行的容器镜像。
Dockerfile的原理可以分为以下几个步骤:

  1. 选择基础镜像:Dockerfile中的第一条指令就是选择基础镜像,该镜像作为构建的基础。它可能是官方提供的基础镜像,也可以是其他第三方提供的。
  2. 执行指令:Dockerfile中包含一系列指令,用于在基础镜像上安装软件、配置环境变量、添加文件等操作。这些指令会被依次执行,每个指令都会生成一个新的镜像层。
  3. 创建镜像:在Dockerfile中所有指令执行完毕后,Docker引擎会自动将多个镜像层合并为单个镜像,并命名为名称和版本。
    由于镜像层是只读的,每次对镜像的修改都会生成新的镜像层,不会对原有镜像造成任何影响。因此,Dockerfile提供了一种非常方便和可移植的方式,用于构建和分享Docker镜像。

Docker指令语法详细解释和示例

  1. FROM
    FROM 是 Dockerfile 中的第一个指令,用于指定基础镜像名称以及其版本信息。一切都是从一个基础镜像开始构建的。FROM 接收一个参数,表示所使用的基础镜像名称。
    示例:
    FROM ubuntu:18.04
    #意思是以一个 Ubuntu 18.04 作为当前镜像的基础镜像构建。
  2. MAINTAINER
    MAINTAINER 指令用于指定镜像的维护者信息。这是一个可选项,一般也是我们不加的,因为这个用处不大。
    示例:
    MAINTAINER someone@example.com
  3. RUN
    RUN 指令用于在 Docker 容器中运行指定的命令。可以使用 RUN 运行各种命令,比如 apt-get 安装、pip 安装等等。最好将 apt-get 和 pip 安装命令放在同一行中,以免出现多个镜像层。
    示例:
    RUN apt-get update && apt-get install -y
    nginx
    php-fpm
    php-mysql
  4. USER
    USER 指令用于设置在容器中运行命令时的用户身份(用户名或用户 ID)。
    示例:
    USER someone
    #切换为某个用户
  5. ADD / COPY
    ADD 和 COPY 指令用于将 中的文件或目录复制到容器中的 。两者的细微区别在于,ADD 指令支持更多的功能,例如获取网络资源并自动解压缩压缩包,由此可见copy添加文件的体积会更小,所以日常使用会更多。
    示例:
    COPY ./app /app
    ADD ./app.tar.gz /
    日常工作常常以下指令组合在这里插入图片描述
  6. CMD
    CMD 指令用于在启动容器时执行指定的命令。一个 Dockerfile 文件只能包含一个 CMD 指令,该指令可以被覆盖(强制替换),只运行最后一条,或者docker run运行时候的参数覆盖,和run的区别是run是docker build 构建镜像阶段执行操作的一条指令,cmd是启动容器后调用,用于docker run阶段运行。
    示例:
    CMD [“nginx”, “-g”, “daemon off;”]
    #这里运行了一个 nginx 服务器
  7. ENTRYPOINT
    ENTRYPOINT 指令与 CMD 极为相似,但是它不会被覆盖,而是始终会运行。ENTRYPOINT 与 CMD 指令的一个重要区别是,每次运行容器时,都会将 CMD 参数附加到 ENTRYPOINT 参数上,比如如下图,如果需要更改nginx配置文件路径,在docker run时候指定路径即可。
    在这里插入图片描述
    示例:
    ENTRYPOINT [“ping”]
    CMD [“-c”, “5”, “localhost”]
    #运行时默认运行 ping localhost 命令,该命令会ping 5次localhost。
  8. ENV
    ENV 指令用于设置环境变量。它可以设置一个或多个键值对,这些键值对可以在容器运行时被使用。可以用 $key 格式来使用值。
    示例:
    ENV MY_NAME=“Alice”
    MY_EMAIL=“alice@example.com”
  9. EXPOSE
    EXPOSE 指令用于指定容器应该监听哪些网络端口。它不会创建端口映射,只是声明容器应该监听哪些端口。
    示例:
    EXPOSE 80/tcp
  10. WORKDIR
    WORKDIR 指令用于设置工作目录,相当于切换到该目录。一旦指定了一个工作目录,后续的指令都将在该目录下执行。
    示例:
    WORKDIR /app
  11. VOLUME
    VOLUME 指令用于在运行时创建挂载点(也称为数据卷)。数据卷可以是主机文件系统中的目录,也可以是其他容器中的目录,可以把docker中的数据实时挂载到本地的目录中,避免误删目录造成数据丢失。可以通过docker inspect [image] 查看容器的详细信息,找到mounts节点,可以找到本地的数据的挂在的目录。
    示例:
    VOLUME /app/logs

Dockerfile build 命令的用法

Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile 构建一个镜像。
Docker build常用的指令包括两个参数:
◆ -t 指定镜像的名字,
◆ -f 显示指定构建镜像的 Dockerfile 文件

构建镜像的原理

Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。当我们运行 docker build 命令时,Docker 会依据 Dockerfile 中的指令来构建镜像。
构建 Docker 镜像的主要步骤如下:

  1. 读取 Dockerfile 文件,解析其中的指令;
  2. 根据指令和 Dockerfile 中的内容创建一个新的容器;
  3. 在新的容器中执行指令,如安装软件等;
  4. 执行完所有指令后,将容器制作成镜像,保存到本地或远程仓库中。
    在整个构建过程中,每个指令都会生成一个新的临时容器,执行指令,然后把结果保存下来,作为下一步构建镜像的基础。这种机制使得 Dockerfile 可以精准、灵活地定义镜像的构建流程,而且可以高效地利用 Docker 中的资源,极大提升构建的速度和效率。
    在这里插入图片描述

编写Dockerfile的几条建议

  1. 单一职责
  2. 提供注释信息
  3. 保持容器最小化
  4. 合理选择基础镜像
  5. 最小化镜像层数

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

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

相关文章

如何快速为子公司创建SAP财务账套的操作步骤

相对来说在SAP上配置一家子公司比从0开始创建创建一家公司可以节省很多步骤,因为子公司的很多配置(如科目表,科目,折旧表,折旧代码等)可以沿用母公司的。本文就简单介绍一下创建子公司财务账套的配置步骤.只…

中国省市选择插件

快速使用 1.引用 ChineseCities.min.js 2.拷贝以下布局结构 <select id"province"><option value"请选择城市">请选择省份</option> </select> <select id"city"><option value"请选择城市">请…

无监督对比学习(CL)最新必读经典论文整理分享

对比自监督学习技术是一种很有前途的方法&#xff0c;它通过学习对使两种事物相似或不同的东西进行编码来构建表示。Contrastive learning有很多文章介绍&#xff0c;区别于生成式的自监督方法&#xff0c;如AutoEncoder通过重建输入信号获取中间表示&#xff0c;Contrastive M…

设备树下的LED灯

一、什么是设备树设备树&#xff0c;将这个词分开就是设备和树&#xff0c;描述设备树的文件叫DTS(Device Tree Source)&#xff0c;这个DTS文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如CPU数量、内存基地址、IIC接口上接了哪些设备、SP…

进度计划:什么是关键路径管理 1/2

目录 引言 什么是关键路径法&#xff1f; 为什么 CPM 调度对项目管理很重要&#xff1f; CPM 计划元素 关键路径方如何工作&#xff1f; 引言 关键路径&#xff0c;也称为最长路径&#xff0c;是直接影响项目完成日期的一系列任务。关键路径上的每项任务都称为关键活动。…

蓝桥杯C/C++VIP试题每日一练之芯片测试

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

【C++学习】【STL】deque容器

dequeDouble Ended Queues(双向队列)deque和vector很相似&#xff0c;但是它允许在容器头部快速插入和删除&#xff08;就像在尾部一样&#xff09;。所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是&#xff0c;deque 容器中存储元素并不能保证所有元素都存储到连续的内…

kubernetes实战与源码学习

1.1 关于Kubernetes的介绍与核心对象概念 关于Kubernetes的介绍与核心对象概念-阿里云开发者社区 k8s架构 核心对象 使用kubeadm10分钟部署k8集群 使用 KuboardSpray 安装kubernetes_v1.23.1 | Kuboard k8s-上部署第一个应用程序 Deployment基本概念 给应用添加service&a…

自组织(Self-organization),自组织临界性(Self-organized criticality)

文章目录1. 自组织1.1 概述1.2 原则1.3 历史1.4 按领域1.4.1 物理1.4.2 化学1.4.3 生物学1.4.4 宇宙学1.4.5 计算机科学1.4.6 控制论1.4.7 社会学1.4.8 经济学1.4.9 运输1.4.10 语言学1.4.11 研究1.5 自发秩序&#xff08;Spontaneous order&#xff09;1.5.1 历史2. 自组织临界…

【LeetCode每日一题】——671.二叉树中第二小的节点

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 深度优先搜索 二【题目难度】 简单 三【题目编号】 671.二叉树中第二小的节点 四【题目描述】…

PMP项目管理项目进度管理

目录1 项目进度管理概述2 规划进度管理3 定义活动4 排列活动顺序5 估算活动持续时间1 项目进度管理概述 项目进度管理包括为管理项目按时完成所需的各个过程。在工作分解结构的基础上&#xff0c;针对交付工作包的需要&#xff0c;列出为完成项目而必须进行的活动工作&#xf…

java -- stream流

写在前面: stream流一直在使用&#xff0c;但是感觉还不够精通&#xff0c;现在深入研究一下。 stream这个章节中&#xff0c;会用到 函数式接口–lambda表达式–方法引用的相关知识 介绍 是jdk8引进的新特性。 stream流是类似一条流水线一样的操作&#xff0c;每次对数据进…

初识HTML、W3C标准、如何利用IDEA创建HTML项目、HTML基本结构、网页基本信息

一、什么是HTML&#xff1f; HTML——Hyper Text Markup Languagr&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画等 目前网页中常用——HTML5 HTML5提供了一些新的元素和一些有趣的新特性&#xff0c;同时也建立了一些新的规则…

LeetCode-1049. 最后一块石头的重量 II

目录思路回溯法动态规划动态规划(压缩)题目来源 1049. 最后一块石头的重量 II 思路 最后一块石头的重量&#xff0c;两个近似的石头值相近&#xff0c;那么最后一块石头的重量最小 举例:stones [2,7,4,1,8,1] 总和sum23&#xff0c;我们取目标值targetsum/211&#xff0c;我…

常用的密码算法有哪些?

我们将密码算法分为两大类。 对称密码&#xff08;密钥密码&#xff09;——算法只有一个密钥。如果多个参与者都知道该密钥&#xff0c;该密钥 也称为共享密钥。非对称密码&#xff08;公钥密码&#xff09;——参与者对密钥的可见性是非对称的。例如&#xff0c;一些参与者仅…

[牛客]链表中倒数第k个结点

使用快慢指针法:两种思路:1.fast先向后走k-1次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点时,slow刚好在倒数第k个位置上;2.fast先向后走k次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点的后面时(此时为NULL),slow刚好在倒数第k个…

AfxMessageBox 自定义封装

一般情况下AfxMessageBox是系统提供的一个对话框&#xff0c;若要做这种效果的&#xff0c;必须重写。 实例1&#xff1a; void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…

如何正确努力?7 分钟重新认识冰山模型。

我明明很努力&#xff0c;但好像没什么卵用&#xff1f;”这是很多职场人士或者即将进入职场的人容易产生的困惑。美国著名社会心理学家麦克利兰在 1973 年所提出的素质冰山模型大概能解释这种情况。不过&#xff0c;让我们先从【冰山一角】这个词开始。当你听到它&#xff0c;…

Linux基础命令-sed流编辑器

Linux三剑客-grep命令 Sed 一. 命令介绍 先到帮助文档中查看命令的描述信息 NAME sed - stream editor for filtering and transforming text sed命令是操作、过滤和转换文本内容的强大工具&#xff0c;常用功能包括结合正则表达式对文件实现快速增删改查&#xff0c;其中查询…

ChIP-seq 分析:GO 功能测试与 Motifs 分析(12)

动动发财的小手&#xff0c;点个赞吧&#xff01; 1. 包加载 我们可以使用 rGREAT 包中提供的 GREAT Bioconductor 接口。 library(rGREAT) 2. GO和功能测试 要提交作业&#xff0c;我们可以使用 Myc 峰的 GRanges 并使用 submitGreatJob 函数指定基因组。 此函数返回一个 Grea…