Docker(三)、Dockerfile探究

news2024/11/24 19:13:59

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.coloradmin.cn/o/1043262.html

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

相关文章

Java面向对象高级

文章目录 面向对象高级Object类的常用方法常用方法一(面向对象阶段)** 和 equals 的区别** 关键字native**单例设计模式(Singleton)**前情回顾(学习基础)静态修饰符Static设计模式概念开发步骤**两种实现方…

标准化、逻辑回归、随机梯度参数估计

机器学习入门 数据预处理: 将?替换为缺失值 data data.replace(to_replace"?",valuenp.nan)丢掉缺失值 data.dropna(how"any) #howall删除全是缺失值的行和列 #haowany删除有缺失值的行和列将数据集划分成测试集和训练集 data[colu…

自动混剪多段视频、合并音频、添加文案的技巧分享

在如今的社交媒体时代,视频的重要性越来越被人们所重视。许多人喜欢记录生活中的美好瞬间,并将其制作成视频分享给朋友和家人。然而,对于那些拍摄了大量视频的人来说,一个一个地进行剪辑和合并可能是一项令人头痛的任务。但是&…

Vue3最佳实践 第五章 Vue 组件应用 4 ( provide 和 inject )

5.5 provide 和 inject 前面的知识告诉我们vue中组件之间传递值需要使用props来完成,但是props也有一定局限性。这个时候在vue3中还有另外的解决方法。那就是使用 provide 和 inject 允许父组件将数据传递给所有后代组件,而不管组件层次结构有多深。你要…

CSS之伪类和伪元素 | :before和::before

例子: & 表示嵌套的上一级。如 &:hover 相当于 上一级元素:hover :hover 伪类 :before 伪元素,在元素之前加入某内容(一定要写 content ) display:none; 隐藏对象。display隐藏元素后,不占原先位置…

如何开发物联网 APP?

如何开发物联网 APP? 这个问题本身是不严谨的,APP只是手机端的一个控制或者用于显示的人机交互页面,物联网是通过传感器,物联网卡等模块把物体接入网络以方便远程监控或者控制等。 你问的应该是怎么开发出来一个远程控制物体的APP吧&#x…

每日一练 | 网络工程师软考真题Day37

1、TCP协议在建立连接的过程中可能处于不同的状态,用netstat命令显示出TCP连接的状态为SYN_SEND,那么这个连接正处于 。 A.监听对方的建立连接请求 B.已主动发出连接建立请求 C.等待对方的连接释放请求 D&#xff…

cocoapods引擎插件所管理的开源库内新增声明文件 对外公开

cocoapods引擎插件所管理的开源库内新增声明文件,供外部业务层直接/间接访问 DemoDemo-Prefix.pch 备注:业务层项目(比如:BaseFramesDemo) target Build settings搜索Search Paths,然后点击它,看到Always Search User Paths&a…

【lesson7】yum的介绍及使用

文章目录 预备工作yum的基本过程yum的操作**yum源问题:****yum三板斧:**yum listyum searchyum list | grepyum installyum install -yyum removeyum remove -y 预备工作 首先有三个问题: 问题解答: 这里我们联想到了手机 问题…

一文搞懂UART通信协议

目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信…

组合数3 - lucas a、b较大的组合数

复杂度,约等于plogp #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double ld;ll a, b, mod;ll qmi(ll a, ll k) {l…

Vue 的动态菜单表格数据展示以及分页查询实现

前言&#xff1a; 在上一篇博客中实现了左侧菜单栏&#xff0c;今天我就来实现与后台的交互即动态的展示数据库的数据&#xff0c;还有数据表格的实现以及分页。 一&#xff0c;导航菜单交互后台 要确定静态树形菜单的排版 再通过后台获取树形节点的数据 通过拿到的数据&#…

异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程

异地恋的甜蜜解药&#xff1a;李哥的群晖Videostation电影分享教程 文章目录 异地恋的甜蜜解药&#xff1a;李哥的群晖Videostation电影分享教程1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣&#xff0c;但不幸的是&#xff…

CleanMyMac X版本4.14.2中文版新功能介绍

CleanMyMac X版本4.14.2中文版是一款专业的Mac清理工具&#xff0c;只需要一键智能清理&#xff0c;便能让Mac恢复原始的性能&#xff0c;是MAC系统非常好用的工具。CleanMyMac X自身拥有一个安全数据库&#xff0c;它是一个项目列表&#xff0c;拥有一定的规格&#xff0c;可以…

C++之mutex、operator()、lambda应用总结(二百三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

服务器端应用的安装

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

CSS滚动条详解(::-webkit-scrollbar )

滚动条出现的事件&#xff1a; 当设置定宽或者定高的元素添加overflow:scroll属性&#xff0c;会出现滚动条&#xff0c;但是原生样式的会比较丑影响美观。 <div class"content"><div class"contain"></div> </div>.content {wid…

从C语言到C++:C++入门知识(1)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关C语言的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

【数据结构--排序】冒泡排序,选择排序,插入排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Unity可视化Shader工具ASE介绍——1、ASE的介绍、安装和简单使用

大家好&#xff0c;我是阿赵&#xff0c;接下来我打算介绍一下Unity引擎的一个好用的可视化Shader编辑插件。这个插件叫做Amplify Shader Editor&#xff0c;下面都会简称为ASE。这一篇主要是讲一下这个插件的获取、安装&#xff0c;和一些简单的界面用法介绍。之后有机会&…