Docker(三)、Dockerfile探究

Dockerfile探究

  • 一、镜像层概念
    • 1、通过执行命令显化docker的机制
  • 二、Dockerfile基础命令
    • 1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】
    • 2、LABEL & MAINTAINER -说明信息
    • 3、WORKDIR 设置工作目录
    • 4、ADD & COPY 复制文件
    • 5、ENV 设置环境常量
  • 三、Dockerfile 执行指令【RUN,ENTRYPOINT,CMD】
    • 1、RUN-构建时运行
    • 2、ENTRYPOINT-容器启动时执行
    • 3、CMD-容器启动后执行默认的命令或参数
    • 4、Dockerfile执行指令有两种运行格式
      • 1、 Shell命令格式:`Run yum install -y vim`
      • 2、 Exec命令格式:`RUN ["yum","install","-y","vim"]`
    • 5、命令执行差异 演示

适合想了解更多关于Dockerfile 的小伙伴

一、镜像层概念

镜像层由两部分组成:镜像层,容器层
镜像就是静态文件,和安装光盘类似,只有把镜像创建完容器以后,才能正常运行
镜像是只读的,容器创建完之后,所有的读写都是在容器内完成的,且每个容器内的读写都是独立且互不干扰
基于以上了解,展开关于dockerfile的构建过程:

  • #1、设置基准镜像:
    FROM tomcat:latest
  • #2、维护的人/机构:
    MAINTAINER 机构/人名
  • #3、切换工作目录:
    WORKDIR /webapps
  • #4、拷贝镜像到镜像指定目录下:
    ADD docker-web ./docker-web

以上四步,每步都会生成一个临时容器,临时容器相当于构建过程中的存档【且临时容器只能用于镜像的构建,不可做其他用途】,生成1个镜像存储,当更新dockerfile内容的时候,会发现已有的内容从缓存获取,新增的内容重新创建,然后旧有的内容 ,即临时的容器ID 会移除出去

体现docker特别重要的特点

  • 第一个机制:按层堆叠;
    最底层tomcat容器,后面每一步都会产生临时容器堆叠一起

  • 第二个机制:采用系统快照;
    以docker临时容器机制体现,每执行一步,都会产生一个临时容器,对当前状态有一个存档,在创建过程中是可以被重用的,比如前三步如果是一样的,则不需要重新处理,只需要将第四步重新构建,

  • 好处:极大加速镜像构建速度,同时也为系统节约资源,如下:

1、通过执行命令显化docker的机制

1、在image里创建新的目录 mkdir docker_layer

cd docker_layer

编辑文件Dockerfile并保存:
vim Dockerfile
#以下文件内容: centos是docker官方提供的基准镜像,会在镜像内创建标准的centos容器

FROM centos
RUN["echo",'aaa']
RUN["echo",'bbb']
RUN["echo",'ccc']
RUN["echo",'ddd']

容器分层,如果没有变化,都是用的已有的,执行构建指令:

docker build -t wq.com/docker_layer:1.0

构建过程输出的内容,可以看出每个命令都生成一个临时容器,在本地就可以看到刚才构建的镜像,docker images

2、再次编辑并保存,vim Dockerfile

RUN["echo",'aaa']
RUN["echo",'bbb']
RUN["echo",'eee']
RUN["echo",'ffff']

构建:

docker build -t wq.com/docker_layer:1.0

发现前面三步,使用之前的临时镜像作为缓存,从缓存拿来用后面2步是新建的临时容器,然后移除之前的容器ID

镜像内部执行分层的镜像和原理:容器分层的时候,如果命令没有发生变化的步骤,都会使用已有的镜像,只会对发生变化的语句重新处理

二、Dockerfile基础命令

1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】

FROM centos # 制作基准镜像(基于centos:latest)
FROM scratch # 不依赖任何基准镜像base image
FROM tomcat:9.0.22-jdk8-openjdkps:尽量使用官方提供的Base Image

2、LABEL & MAINTAINER -说明信息

MAINTAINER wq.com
LABEL version="1.0"
LABEL description ="testpro"

3、WORKDIR 设置工作目录

WORKDIR /usr/local
WORKDIR /usr/local/newdir #自动创建

ps:尽量使用绝对路径

4、ADD & COPY 复制文件

ADD absd / #复制到根路径
ADD xxx.tar.gz / # 添加根目录并解压
ADD 除了复制,还具备添加远程文件功能

5、ENV 设置环境常量

ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar

ps :尽量使用环境常量,可提高程序维护性

三、Dockerfile 执行指令【RUN,ENTRYPOINT,CMD】

在这里插入图片描述

1、RUN-构建时运行

在build构建镜像时执行命令,一旦镜像构建完成,不允许被修改

2、ENTRYPOINT-容器启动时执行

ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
推荐使用EXEC形式:ENTRYPOINT["ps"]

3、CMD-容器启动后执行默认的命令或参数

CMD默认命令:
CMD用于设置默认执行的命令
如Dockerfile中出现多个CMD,则只有最后一个被执行,如容器启动时附加指令,则CMD被忽略
推荐使用EXEC格式:CMD["ps","ef"]

4、Dockerfile执行指令有两种运行格式

linux底层有2种运行方式,所以Dockerfile有两种执行方式:

1、 Shell命令格式:Run yum install -y vim

Shell运行方式:实用Shell执行时,当前shell是父进程,生成一个子shell进程在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。

2、 Exec命令格式:RUN ["yum","install","-y","vim"]

Exec运行方式:使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变执行完毕直接退出,并不会退回之前的进程环境

综合应用,官方推荐使用Exec执行命令格式 。

5、命令执行差异 演示

进入到image文件夹,

mkdir docker_run
cd docker_run
vim Dockerfile

编辑并保存内容:

FROM centos
RUN ["echo","image building !!!"]
CMD ["echo","containner starting!!!"]

进行构建:

docker build -t wq.com/docker_run .

启动容器:

docker run wq.com/docker_run

执行构建和启动容器命令后,可以看出来,cmd命令是默认启动容器会执行
启动容器:

docker run wq.com/docker_run ls

修改dockerfile内容:

FROM centos
RUN ["echo","image building !!!"]
ENTRYPOINT ["echo","containner starting!!!"]

保存后,重新构建:

docker build -t wq.com/docker_run .

重启:docker run wq.com/docker_run 与上面输出内容无差异

修改dockerfile内容:

FROM centos
RUN ["echo","image building !!!"]
ENTRYPOINT ["ps"]
CMD ["-ef"]

保存后,重新构建:

docker build -t wq.com/docker_run .

重启:docker run wq.com/docker_run 与上面输出内容无差异
这样写的好处是cmd可以从外部传参:
重启:docker run wq.com/docker_run -aux
输出内容更加完整

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

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

相关文章

P1496 火烧赤壁【区间排序合并】

P1496 火烧赤壁【区间排序合并】 题目背景 曹操平定北方以后,公元 208 年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。 孙权任命周…

crypto:Alice与Bob

题目 根据题目描述,将98554799767分解成两个素数 得到两个素数101999和966233。根据题目提示把它们拼接起来进行md5的32位小写哈希

提升您的Mac文件拖拽体验——Dropzone 4 for mac

大家都知道,在Mac上进行文件拖拽是一件非常方便的事情。然而,随着我们在工作和生活中越来越多地使用电脑,我们对于这个简单操作的需求也越来越高。为了让您的文件拖拽体验更加高效和便捷,今天我们向大家介绍一款强大的工具——Dro…

[plugin:vite:css] [sass] Undefined mixin.

前言: vite vue3 TypeScript环境 scss报错: [plugin:vite:css] [sass] Undefined mixin. 解决方案: 在vite.config.ts文件添加配置 css: {preprocessorOptions: {// 导入scss预编译程序scss: {additionalData: use "/resources/_ha…

Confidential Compute Architecture - Arm构架的TEE新模式

1 简介 如今,云计算在分布式计算资源按需使用方面起着重要的作用。许多公司,如亚马逊、谷歌或微软都提供云服务,但使用这些服务需要信任服务提供商。这意味着一方面依赖提供商对抗攻击者,但另一方面也要信任提供商本身。恶意的提供商可能最终滥用其客户的敏感数据。使用可…

8章:scrapy框架

文章目录 scrapy框架如何学习框架?什么是scarpy?scrapy的使用步骤1.先转到想创建工程的目录下:cd ...2.创建一个工程3.创建之后要转到工程目录下4.在spiders子目录中创建一个爬虫文件5.执行工程setting文件中的参数 scrapy数据解析scrapy持久…

计算机视觉与深度学习-循环神经网络与注意力机制-RNN(Recurrent Neural Network)、LSTM-【北邮鲁鹏】

目录 举例应用槽填充(Slot Filling)解决思路方案使用前馈神经网络输入1-of-N encoding(One-hot)(独热编码) 输出 问题 循环神经网络(Recurrent Neural Network,RNN)定义如何工作学习目标深度Elm…

Hadoop分布式文件系统

目录 一、Hadoop 1、Hadoop发展简史 2、HDFS存储模型 3、HDFS架构设计 3.1、角色功能 3.2、元数据持久化 3.3、安全模式 3.4、HDFS中的SNN 3.5、Block的副本放置策略 4、HDFS写流程 5、HDFS读流程 一、Hadoop Hadoop之父Doug Cutting Hadoop的发音[hdu:p] &#x…

uniapp ssr发行后一直Hydration completed but contains mismatches Cannot find module

最开始我用前端网页托管的地址访问一直是 Hydration completed but contains mismatches 解决方案 要从云函数的地址访问项目。 先绑定域名,否则用uniapp自带地址访问一直是下载文件 设置路径 最后效果 uniapp ssr 云函数访问 MODULE_NOT_FOUND:Cannot fin…

【科研】--计算机领域顶会

计算机领域顶会 网络安全领域顶会 S&P IEEE Symposium on Security and Privacy (S&P) dblp链接:https://dblp.uni-trier.de/db/conf/sp/index.html 官网链接: http://www.ieee-security.org/TC/SP2021/program-papers.html CCS Conference…

2023 年 Bitget Wallet 测评

对Bitget Wallet钱包的看法 Bitget Wallet在安全性、产品实力和使用体验方面可与Metamask媲美,甚至有所超越,唯一稍显不足的是知名度稍逊一筹。在众多钱包中,Bitget Wallet是拥有最全面的钱包之一,尤其适合那些希望一步到位&…

面试理论篇一

关于面向对象 注:自用 1,什么是面向对象编程? 面向对象编程是⼀种程序设计思想,通过将问题抽象成对象,通过对象之间的交互和数据封装来实现程序逻辑。 2,Java中的类和对象有什么区别? 类是描述…

最小生成树 | 市政道路拓宽预算的优化 (Minimum Spanning Tree)

任务描述: 市政投资拓宽市区道路,本着执政为民,节省纳税人钱的目的,论证是否有必要对每一条路都施工拓宽? 这是一个连问带答的好问题。项目制学习可以上下半场,上半场头脑风暴节省投资的所有可行的思路&a…

web:[极客大挑战 2019]Upload

题目 页面显示为一个上传&#xff0c;猜测上传一句话木马文件 先查看源代码看一下有没有有用的信息&#xff0c;说明要先上传图片&#xff0c;先尝试上传含有一句话木马的图片 构造payload <?php eval($_POST[123]);?> 上传后页面显示为&#xff0c;不能包含<&…

《三国志》游戏的数据表设计与优化

在前两篇文章中,我们已经介绍了数据库的基础概念和《三国志》游戏的数据管理。这篇文章将专注于《三国志》游戏的数据表设计与优化。我们将探讨如何为游戏中的每个实体(例如,武将、城市、装备等)创建数据表,以及如何选择合适的主键和字段类型,最后还将讨论如何定义约束条…

nmap 扫描内网IP, 系统, 端口

nmap 扫描内网IP, 系统, 端口 扫描内网ip 对内网进行ARP扫描 .\nmap.exe -sn 192.168.110.0/24 # 全网段 .\nmap.exe -sn 192.168.110.100-200 # 100-200范围 扫描端口 .\nmap.exe -sT 192.168.110.130 # 三次握手连接 较慢, 但更有效 .\nmap.exe -sS 192.168.110.130 # 发…

k8s--架构基础--云控制器管理器

具体来说&#xff0c;云控制器管理器允许用户将集群与云服务提供商的 API 进行连接&#xff0c;以获取与云平台相关的信息和资源。通过这种连接&#xff0c;Kubernetes 可以利用云服务提供商的功能和特性&#xff0c;例如虚拟机、负载均衡器、对象存储等。与此同时&#xff0c;…

“益路同行”栏目专访第11期——柳州市雨花敬老服务中心陈勇梅

中国善网在本届&#xff08;第十届&#xff09;慈展会上特别推出了《益路同行》采访栏目&#xff0c;《益路同行》栏目旨在寻觅公益之路上同行者的故事&#xff0c;挖掘公益更深层次的内涵&#xff0c;探索新时代公益发展道路。希望公益企业、人物、故事被更多人看到&#xff0…

2.物联网射频识别,RFID通信原理,RFID读写器与标签无线交互方式、数据反馈方式,RFID调制与解调、编码方式,不同RFID标签与读写器

一。RFID无线识别的原理 1.RFID系统无线通信基本原理 如下图所示&#xff0c;左边是读写器&#xff08;刷卡器&#xff09;&#xff0c;右边是标签&#xff08;卡&#xff09;&#xff0c;中间通过无线通信方式。 标签&#xff1a;&#xff08;卡&#xff09; 读写器&#xff…

实战项目:VB实现小鸟快跑小游戏

文章目录&#xff1a; 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 form1 效果图 代码 form2 效果图 代码 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ 代码下载 二&#xff1a;实现思路 窗口1 就是实现窗口的跳转和关闭窗口2 1.先添加背…