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.xdnf.cn/news/142655.html

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

相关文章

外包干了3个月,技术退步明显。。。。。

先说一下自己的情况,大专生,17年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【乳腺超声、乳腺钼靶、宫颈癌】等项目数据调研,及相关参考内容整理汇总

一、乳腺超声内容整理 1.1、数据集 Breast Ultrasound Images Dataset;下载地址2STU-Hospital处理和训练参考文档:https://blog.csdn.net/weixin_51511389/article/details/127594654 1.2、可以参考的论文 AAU-net: An Adaptive Attention U-net for Breast Lesions Segmen…

Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中国文化博大精深,太极八卦,阴阳交合,变化无穷。在程序的开发中也是这样,数字0和1也是同样的道理。就本节来说&am…

vue实现移动端悬浮可拖拽按钮

需求: 按钮在页面侧边悬浮显示;点击按钮可展开多个快捷方式按钮,从下向上展开。长按按钮,则允许拖拽来改变按钮位置,按钮为非展开状态;按钮移动结束,手指松开,计算距离左右两侧距离…

python回文素数

这能有1和本身整除的整数叫素数;如一个素数从左向右和从右向左是相同的数,则该素数为回文素数。编程求出2-1000内的所有回文素数。 源代码: def sushu(n): for i in range(2,n//21): if n%i 0: return False r…

1.算法——数据结构学习

算法是解决特定问题求解步骤的描述。 从1加到100的结果 # include <stdio.h> int main(){ int i, sum 0, n 100; // 执行1次for(i 1; i < n; i){ // 执行n 1次sum sum i; // 执行n次} printf("%d", sum); // 执行1次return 0; }高斯求和…

复杂SQL解析

文章目录 背景表SQL关键字分析具体Sql注意点补充&#xff1a;select的字段&#xff0c;也可以带有计算逻辑 背景表 1、sale_log as result: 主表&#xff0c;大部分字段都是取自这个表 2、sale_num as sale&#xff1a;需要从这个表获取真实销量sale_num字段 3、schedule as…

京东获得JD商品详情 API 返回值说明

京东商品详情API接口可以获得JD商品详情原数据。 这个API接口有两种参数&#xff0c;公共参数和请求参数。 公共参数有以下几个&#xff1a; apikey&#xff1a;这是您自己的API密钥&#xff0c;可以在京东开发者中心获取。 请求参数有以下几个&#xff1a; num_iid&#…

怎样设置每个月的10号提醒?可每月触发提醒的软件是哪个

在每个月当中总是会有一些需要按时提醒的事情&#xff0c;如每月10号提醒换房贷、每月10号提醒还信用卡、每月10号提醒续交车贷等&#xff0c;当然每月像这样的事情是比较多的&#xff0c;怎样设置每个月的10号提醒自己呢&#xff1f; 可以用来设定定时提醒的工具是比较多的&a…

缓冲区溢出漏洞分析

一、实验目的 熟悉软件安全需求分析方法&#xff0c;掌握软件安全分析技术。 二、实验软硬件要求 1、操作系统&#xff1a;windows 7/8/10等 2、开发环境&#xff1a;VS 6.0&#xff08;C&#xff09;、OllyDbg 三、实验预习 《软件安全技术》教材第3章 四、实验内容&#…

paddle2.3-基于联邦学习实现FedAVg算法

目录 1. 联邦学习介绍 2. 实验流程 3. 数据加载 4. 模型构建 5. 数据采样函数 6. 模型训练 1. 联邦学习介绍 联邦学习是一种分布式机器学习方法&#xff0c;中心节点为server&#xff08;服务器&#xff09;&#xff0c;各分支节点为本地的client&#xff08;设备&#…

【操作系统笔记四】高速缓存

CPU 高速缓存 存储器的分层结构&#xff1a; 问题&#xff1a;为什么这种存储器层次结构行之有效呢&#xff1f; 衡量 CPU 性能的两个指标&#xff1a; 响应时间&#xff08;或执行时间&#xff09;&#xff1a;执行一条指令平均时间 吞吐量&#xff0c;就是 1 秒内 CPU 可以…

Kafka的消息存储机制

前面咱们简单讲了K啊开发入门相关的概念、架构、特点以及安装启动。 今天咱们来说一下它的消息存储机制。 前言&#xff1a; Kafka通过将消息持久化到磁盘上的日志文件来实现高吞吐量的消息传递。 这种存储机制使得Kafka能够处理大量的消息&#xff0c;并保证消息的可靠性。 1…

Vue+ElementUI实现动态树和表格数据的查询

目录 前言 一、动态树的实现 1.数据表 2.编写后端controller层 3.定义前端发送请求路径 4.前端左侧动态树的编写 4.1.发送请求获取数据 4.2.遍历左侧菜单 5.实现左侧菜单点击展示右边内容 5.1.定义组件 5.2.定义组件与路由的对应关系 5.3.渲染组件内容 5.4.通过动态…

OpenAI 更新 ChatGPT:支持图片和语音输入【附点评】

一、消息正文 9月25日消息,近日OpenAI宣布其对话AI系统ChatGPT进行升级,添加了语音输入和图像处理两个新功能。据OpenAI透露,这些新功能将在未来两周内面向ChatGPT Plus付费用户推出,免费用户也将很快可以使用这些新功能。这标志着ChatGPT继续朝着多模态交互的方向发展,为用户提…

Cpp/Qt-day040920Qt

目录 时钟 头文件&#xff1a;Widget.h: 源文件:Widget.c: 效果图&#xff1a; 思维导图 时钟 头文件&#xff1a;Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QPainter> #include <QTime>…

无需求文档,保障测试质量的可行性做法

001 没有需求文档3种可能情况 &#xff1a; 1、公司都没产品经理&#xff0c;开发人员的意识不足&#xff0c;收到的客户需求&#xff0c;直接开干&#xff08;写需求文档 &#xff1f;不可能的&#xff09; 。 2、项目进度紧张&#xff0c;需求变动大&#xff0c;一直在变&…

如何在.NET电子表格应用程序中创建流程图

前言 流程图是一种常用的图形化工具&#xff0c;用于展示过程中事件、决策和操作的顺序和关系。它通过使用不同形状的图标和箭头线条&#xff0c;将任务和步骤按照特定的顺序连接起来&#xff0c;以便清晰地表示一个过程的执行流程。 在企业环境中&#xff0c;高管和经理利用…

【C语言】模拟实现内存函数

本篇文章目录 相关文章1. 模拟 memcpy 内存拷贝2. 模拟 memmove 内存移动 相关文章 【C语言】数据在内存中是以什么顺序存储的&#xff1f;【C语言】整数在内存中如何存储&#xff1f;又是如何进行计算使用的&#xff1f;【C语言】利用void*进行泛型编程【C语言】4.指针类型部…

关于MATLAB R2022b中MATLAB function没有edit data选项的解决办法

问题描述 在MATLAB 2022b的simulink中双击MATLAB function&#xff0c;出来的是这个界面&#xff0c;而不是跳转到MATLAB的编辑窗口。因此就找不到edit data选项&#xff0c;没法完成新建data store memory 全局变量。 解决办法&#xff1a; 点击 编辑数据 按钮 在弹出的窗…