1.是什么?

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

构建三步骤

  1. 编写dockerfile文件
  2. docker build命令构建镜像
  3. docker run依镜像运行的容器实列

2.dockerfile构建过程解析

1)dockerfile内容的基础知识

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

2)Docker执行dockerfile的大致流程

docker从基础镜像运行一个容器

执行一条指令并对容器做出修改

执行类似docker commit的操作提交一个镜像

docker在基于刚提交的镜像运行一个新的容器

执行dockerfile中的一条指令直到所有指令都执行成功

3)总结

  1. Dockerfile,需要定义一个Dockerile,Dockerle定义了进程需要的一切东西。Dockerile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等:
  2. Docker镜像,在用Dockerfile定义-个文件之后,docker build时会产生个Docker镜像,当运行 Docker镜像时会真正开始提供服务
  3. Docker容器,容器是直接提供服务的。

3.dockerfile常用的保留字指令

参考tomcat8的dockerfile入门:GitHub - docker-library/tomcat: Docker Official Image packaging for Apache Tomcat

  1. 1)FROM——基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from。
  2. 2)MAINTAINER——镜像维护者的名字和邮箱地址(这个镜像是谁做的)
  3. 3)RUN——容器构建的时候需要运行的命令/两种形式(shell格式、exec格式)/RUN是在docker build的时候运行
  4. 4)EXPORT——当前容器对外暴露的接口
  5. 5)WORKDIR——指定在创建容器后,终端默认登录的进来的工作目录,落脚点
  6. 6)USER——指定该镜像以什么样的用户去执行,如果不指定,默认为root
  7. 7)ENV——设置配置过程中的环境变量,可以在后续的任何RUN指令使用,这就如同在命令前面指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量。
  8. 8)ADD——将宿主机目录下的文件拷贝进镜像且会自动处理url和解压tar压缩包
  9. 9)COPY——类似于ADD,拷贝文件和目录到镜像中。
  10. 10)VOLUME——相当于-v参数
  11. 11)CMD —
    1. 指定容器启动之后要干的事情
    2. 注意
      1. dockerfile中可以多个cmd指令,但是只有一个生效,cmd会被docker run之后的参数替换
    3. 它和RUN命令的区别

  1. ENTPYPOINT
    1. 类似于cmd指令,但是ENTPYPOINT不会被docker run后面的指令覆盖,而且这些指令行参数会被当做参数送给ENTPYPOINT指令指定的程序

实际操作1:

Centos7镜像具备vim+ifconfig+jdk24

下面是我运行的centos的容器,可以发现没有这些东西

编写

首先要去下载一个jdk24包

上传到我们的服务器上

1.编写

[root@iZgw05jp5bgqy10yqsb1heZ myfile]# cat dockerfile

FROM centos

MAINTAINER yyyy@123.com

ENV MYPATH /usr/local

WORKDIR $MYPATH

#安装vim编辑器

RUN yum -y install vim

#安装ifconfig命令查看

RUM yum -y install net-tools

#安装java及lib库

RUN yum -y install glibc.i686

RUN mkdir /usr/local/java

#ADD是相对路径jar,需要把jdk-24_linux-x64_bin.tar.gz添加到与dockerfile文件同一文件夹下

ADD jdk-24_linux-x64_bin.tar.gz /usr/local/java/

#配置java环境变量

ENV JAVA_HOME /usr/local/java/jdk-24_linux-x64_bin

ENV PATH $JAVA_HOME/bin:$PATH

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

EXPOSE 80

CMD echo $MYPATH

CMD echo "success---------------ok"

CMD /bin/bash

报错了,这里是因为指令错误

报错,这里是因为更新源的问题

这里我修改dockerfile文件,提前修改源的地址

#备份一下原来的源文件

RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

#换源

RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

清理缓存并重新生成

RUN yum clean all

RUN yum makecache

再次报错,原来是备份的地址出错了,查看一下正确的地址

原来

重新修改了一下

#备份一下原来的源文件

RUN mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Base.repo.backup

#换源

RUN curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

清理缓存并重新生成

RUN yum clean all

RUN yum makecache

再次报错

这里还是因为源的原因,所以我这里直接删除所有旧的源

这里我用的centos8,与以往的centos7还源不同,

mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo CentOS-Linux-BaseOS.repo.bak

mv /etc/yum.repos.d/CentOS-Linux-AppStream.repo CentOS-Linux-AppStream.repo.bak

mv /etc/yum.repos.d/CentOS-Linux-Extras.repo CentOS-Linux-Extras.repo.bak

后面实在没找到问题,我重新搞了一个容器,实操换源

尝试yum -y install vim

成功了

总结命令

#备份

mkdir /etc/yum.repos.d/repo.backup

mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo.backup

下载阿里云的源

curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-8.repo

上面那个错误是我忘记把中文注释了

下面是成功建立新镜像

docker images

可以看到构建成功

进去看有没有java环境,发现没有,我检查发现,因为环境变量的路径配错了,修改为正确的环境变量就有了

什么是虚悬镜像?

就是在构建或者删除镜像的时候出现一些错误,导致仓库和标签都是none

单独查看虚悬镜像

docker image ls -f dangling=true

删除虚悬镜像

docker image prune

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

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

相关文章

C# 接口(interface 定义接口的关键字)

目录 使用接口案例 接口继承 练习 定义一个接口,在语法中与定义一个抽象类是没有区别的,但是不允许提供接口中任意成员的实现方式,一般接口只会包含方法 、索引器和事件的声明, 不允许声明成员的修饰符, public都不…

5190 - 提高:DFS序和欧拉序:树上操作(区域修改1)

题目传送门 时间限制 : 2 秒 内存限制 : 256 MB 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中…

【Oracle】数据泵

ORACLE数据库 数据泵 核心参数全解析 ORACLE expdp 命令使用详解 1.ATTACH[schema_name.]job_name Schema_name 用于指定方案名,job_name 用于指定导出作业名.注意,如果使用 ATTACH 选项,在命令行除了连接字符串和 ATTACH 选项外,不能指定任何其他选项,示例如下: expdp hr/hr A…

机器学习的算法有哪些?

🌟 欢迎来到AI奇妙世界! 🌟 亲爱的开发者朋友们,大家好!👋 我是人工智能领域的探索者与分享者,很高兴在CSDN与你们相遇!🎉 在这里,我将持续输出AI前沿技术、实…

【计算机网络】OSI七层模型

OSI七层模型为什么需要OSI七层模型?OSI七层模型具体是什么?Layer7:应用层(Application Layer)Layer6:表示层(Presentation Layer)Layer5:会话层(Session Laye…

RS485转Profinet网关配置指南:高效启动JRT激光测距传感器测量模式

RS485转Profinet网关配置指南:高效启动JRT激光测距传感器测量模式RS485转Profinet网关:让JRT激光测距传感器高效开启测量模式在工业自动化场景中,设备间的高效通信是实现精准控制的关键。RS485转Profinet网关作为连接传统RS485设备与现代Prof…

「日拱一码」040 机器学习-不同模型可解释方法

目录 K最近邻(KNN) - 基于距离的模型 决策边界可视化 查看特定样本的最近邻 ​随机森林(RF) - 树模型 feature_importances_ SHAP值分析 可视化单棵树 多层感知器(MLP) - 神经网络 部分依赖图 LIME解释器 权重可视化 支持向量回归(SVR) - 核方法 支持向量可视化 部…

编程与数学 03-002 计算机网络 09_传输层功能

编程与数学 03-002 计算机网络 09_传输层功能一、传输层的作用(一)进程间通信(二)提供可靠传输(三)复用与分用二、TCP协议(一)TCP的连接建立与释放(二)TCP的可…

14. Web服务器-Nginx-工作原理

文章目录前言一、简介二、工作原理1. 多进程架构2. 事件驱动模型3. 模块化设计三、工作流程1. 启动阶段2. 等待连接3. 请求处理阶段4. 响应构造与输出5. 连接关闭前言 Nginx‌ Nginx(发音为“Engine-X”)是一款高性能的开源Web服务器软件,同…

AP-0316:集 USB 即插即用、智能降噪于一体的多功能 AI 声卡,重新定义清晰语音交互

AP-0316突发噪音和抗风噪测试还在为语音设备的噪音刺耳、连接复杂、功放适配麻烦而头疼?AP-0316 多功能 AI 降噪消回音 USB 声卡来了 —— 以 “USB 即插即用 自带功放 智能降噪 场景适配” 四大核心优势,将专业级语音处理技术变得简单易用&#xff0…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现卫星图像识别(C#代码,UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现卫星图像识别(C#代码,UI界面版)工业相机使用YoloV8模型实现水下鱼类识别工业相机通过YoloV8模型实现卫星图像识别的技术背景在相机SDK中获取图像转换图像的代码分析工业相机图像转换…

某d的评论爬虫学习

本教程仅用于技术研究,请确保遵守目标网站的服务条款。实际使用前应获得官方授权,避免高频请求影响服务器,否则可能承担法律责任。此脚本仅拦截公开评论接口,不涉及用户私密数据。请勿修改代码监听其他请求。分享一下爬某抖评论的…

SQLite 注入:理解与防御

SQLite 注入:理解与防御 引言 随着互联网技术的飞速发展,数据库已成为各类应用程序的核心组成部分。SQLite 作为一款轻量级的关系型数据库,广泛应用于移动应用、桌面应用及嵌入式系统。然而,SQLite 数据库也面临着安全挑战&#x…

Java中List集合对象去重及按属性去重

请直接移步原文Java中List集合对象去重及按属性去重的8种方法 只记录自己喜欢的几种方法 对象元素整体去重的2种方法按照对象属性去重的4种方法 预备数据 public class ListRmDuplicate {private List<String> list;private List<Player> playerList;BeforeEac…

ADAS测试:如何用自动化手段提升VV效率

当前&#xff0c;ADAS 技术正在快速发展&#xff0c;从智能巡航控制到自动紧急制动等功能已逐渐成为汽车的标配。在不断提升驾驶辅助能力的同时&#xff0c;系统的可靠性也受到前所未有的重视。为了确保这些关键系统在各种工况下都能正常运行&#xff0c;验证与确认&#xff08…

互信息:理论框架、跨学科应用与前沿进展

1. 起源与核心定义 互信息&#xff08;Mutual Information, MI&#xff09;由克劳德香农&#xff08;Claude Shannon&#xff09; 在1948年开创性论文《A Mathematical Theory of Communication》中首次提出&#xff0c;该论文奠定了现代信息论的基础。互信息用于量化两个随机…

C++模板元编程从入门到精通

之前面试被问到什么是模板元编程&#xff0c;给我问懵了…… 一、什么是模板元编程&#xff08;TMP&#xff09; 模板元编程&#xff08;Template Metaprogramming, TMP&#xff09;是一种利用C模板在编译期执行计算和代码生成的编程范式。它本质上是“编写程序的程序”&#…

探秘CommonJS:Node.js模块化核心解析

CommonJS 是 JavaScript 的模块化规范&#xff0c;主要应用于 服务器端环境&#xff08;尤其是 Node.js&#xff09;&#xff0c;其核心目标是解决代码组织、依赖管理和作用域隔离问题 。以下是其核心要点&#xff1a;&#x1f527; 一、核心特性同步加载 模块通过 require() 同…

Windows 10 远程桌面(RDP)防暴力破解BAT脚本

0x01 设置5次失败后锁定账户30分钟 secpol.msc # 导航到: 安全设置 > 账户策略 > 账户锁定策略 0x02 复制保存到 BlockFailedRDP.ps1 <# .DESCRIPTION 此脚本分析Windows安全日志中的RDP登录失败事件(ID 4625)&#xff0c; 统计每个IP的失败次数&#xff0…

Chukonu 阅读笔记

Chukonu&#xff1a;一个将原生计算引擎集成到 Spark 中的全功能高性能大数据框架 摘要 Apache Spark 是一种广泛部署的大数据分析框架&#xff0c;它提供了诸如弹性、负载均衡和丰富的生态系统等吸引人的特性。然而&#xff0c;其性能仍有很大的改进空间。尽管用原生编程语言编…