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
输出内容更加完整
相关文章:
Docker(三)、Dockerfile探究
Dockerfile探究 一、镜像层概念1、通过执行命令显化docker的机制 二、Dockerfile基础命令1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】2、LABEL & MAINTAINER -说明信息3、WORKDIR 设置工作目录4、ADD & COPY 复制文件5、ENV 设置环境常量…...
C++读取文件夹下多个文件,包括图片等等
话不多说,直接上代码: int main() {//读入图片路径下的所有文件,D:\APP\VS\vs_projects_repos\Isp\imagesstring imgdirpath"D:\\APP\\VS\\vs_projects_repos\\Isp\\proimages\\";// 只读取文件夹下的png的文件名,也可以改成“*.b…...
DirectX 12 学习笔记 -结构
上篇文章我们创建了一个窗口,看样子还不难,我们继续玩DX12 引用一些文件 头文件 #include <d3d12.h> #include <dxgi1_4.h> #include <wrl.h>还有一些库 #pragma comment(lib, "d3d12.lib") #pragma comment(lib, "…...
【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本
lua 菜鸟教程:https://www.runoob.com/lua/lua-tutorial.html 在 Redis 使用 lua 脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延及开销原子性操作。Redis会将整个脚本作为一个整体执行,中间不会…...
标准/扩展库中对象的导入与使用
博主:命运之光 专栏:Python程序设计 Python扩展库导入和使用 Python启动时,仅加载了很少一部分模块,其它模块需要由程序员显示加载。使用“sys.modules.items()”显示所有预加载的模块信息。 import 模块名[.对象名] [as 别名] …...
87、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->List相关命令
本次讲解要点: List相关命令:是指value中的数据类型 启动redis服务器: 打开小黑窗: C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redi…...
Celery结合flask完成异步任务与定时任务
Celery 常用于 web 异步任务、定时任务等。 使用 redis 作为 Celery的「消息代理 / 消息中间件」。 这里通过Flask-Mail使用qq邮箱延时发送邮件作为示例 pip install celery pip install redis pip install Flask-Mail1、使用flask发送邮件 使用 Flask-Mail 发送邮件需要进行…...
前端项目练习(练习-001-纯原生)
先创建一个空文件夹,名字为web-001,然后用idea开发工具打开,如图: 可以看到,这是个彻底的空项目,创建 index.html index.js index.css三个文件,如图: 其中,html文件内容如下&am…...
基于微信小程序的游戏账号交易买卖平台设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...
2023 年 Bitget Wallet 测评
对Bitget Wallet钱包的看法 Bitget Wallet在安全性、产品实力和使用体验方面可与Metamask媲美,甚至有所超越,唯一稍显不足的是知名度稍逊一筹。在众多钱包中,Bitget Wallet是拥有最全面的钱包之一,尤其适合那些希望一步到位&…...
医疗图像分割指标
医疗图像其中两种图像格式:MRI(Magnetic Resonance Imaging,磁共振成像)、CT(Computed Tomography,计算机断层),常存成 .nii.gz 格式。都是 3D 的 H W L H \times W \times L HWL…...
零代码编程:用ChatGPT批量修改文件夹名称中的大小写
一个文件夹下面有很多个子文件夹,要把文件夹中的大写数字全部重命名为小写数字,比如将二 三 四,改成: 2 34 在ChatGPT中输入提示词如下: 你是一个Python编程专家,要完成一个文件夹重命名的任务。具体步骤如…...
webpack:详解cache模块常用配置
背景 持久化缓存算得上是 Webpack 5 最令人振奋的特性之一,它能够将首次构建结果持久化到本地文件系统,在下次执行构建时跳过一系列解析、链接、编译等非常消耗性能的操作,直接复用 module、chunk 的构建结果。 cache 会在开发模式被设置成…...
云原生Kubernetes:Pod控制器
目录 一、理论 1.Pod控制器 2.Deployment 控制器 3.SatefulSet 控制器 4.DaemonSet 控制器 5.Job 控制器 6.CronJob 控制器 二、实验 1.Deployment 控制器 2.SatefulSet 控制器 3.DaemonSet 控制器 4.Job 控制器 5.CronJob 控制器 三、问题 1. showmount -e 报错…...
数据库基础与MySQL入门
在当今的数字化世界中,数据如同生命之水,它贯穿于各种应用和服务中。尤其在游戏行业,例如经典的《三国志》,数据库管理成了一个不可或缺的环节。这不仅涉及到用户信息的存储,还涉及到游戏状态、积分、交易等复杂的数据处理需求。 MySQL作为一个广受欢迎的数据库管理系统,…...
探索Java爬虫框架:解锁网络数据之门
引言: 随着互联网时代的发展,大量的数据被存储在各种网页中。对于开发者而言,如何高效地获取和处理这些网络数据成为了一个重要的问题。而Java作为一门强大的编程语言,也有许多优秀的爬虫框架供开发者选择和使用。本文将带您深入…...
智慧燃气平台的总体架构到底应怎样设计?
关键词:智慧燃气、智慧燃气平台、智能燃气、智能监控 智慧燃气平台功能设计的一些方向和思考: 1、资源统一,管理调度 城市燃气智慧调度运营管理平台收集并且整理出每个业务系统信息,并且根据所整理出的信息结果制定出标准规范&…...
MonkeyRunner测试步骤
首先把安卓SDK的 环境变量给配置好,这里就不再多解释,自己google 然后将自己的安卓设备打开调试模式,USB连接至电脑,运行CMD,输入命令adb devices 查看你的安卓设备的ID(ID后面写程序会调用),…...
Konva基本处理流程和相关架构设计
前言 canvas是使用JavaScript基于上下文对象进行2D图形的绘制的HTML元素,通常用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。基于Canvas之上,诞生了例如 PIXI、ZRender、Fabric、Konva等 Canvas渲染引擎,兼顾易用的同时…...
人工智能AI知多少?
摘要 人工智能(Artificial Intelligence,简称AI)是一项前沿技术,正在快速发展并渗透到各个领域。然而,对于大多数人来说,人工智能仍然是一个陌生而复杂的概念。本文旨在对人工智能进行扫盲,介绍其基本概念、应用领域以及当前热门的人工智能模型。通过具体的例子,读者将…...
leetcode1610. 可见点的最大数目(java)
可见点的最大数目 题目描述滑动窗口 题目描述 难度 - 困难 leetcode1610. 可见点的最大数目 给你一个点数组 points 和一个表示角度的整数 angle ,你的位置是 location ,其中 location [posx, posy] 且 points[i] [xi, yi] 都表示 X-Y 平面上的整数坐标…...
Apache Flume
Flume 1.9.0 Developer Guide【Flume 1.9.0开发人员指南】 Introduction【介绍】 摘自:Flume 1.9.0 Developer Guide — Apache Flume Overview【概述】 Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregati…...
【切片】基础不扎实引发的问题
本次文章主要是来聊聊关于切片传值需要注意的问题,如果不小心,则很容易引发线上问题,如果不够理解,可能会出现奇奇怪怪的现象 问题情况: 小 A 负责一个模块功能的实现,在调试代码的时候可能不仔细&#x…...
CVE-2023-5129 libwebp堆缓冲区溢出漏洞影响分析
漏洞简述 近日苹果、谷歌、Mozilla和微软等公司积极修复了libwebp组件中的缓冲区溢出漏洞,相关时间线如下: 9月7日,苹果发布紧急更新,修复了此前由多伦多大学公民实验室报告的iMessage 0-click 漏洞,漏洞被认为已经被…...
leetcode做题笔记155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…...
蓝海彤翔亮相2023新疆网络文化节重点项目“新疆动漫节”
9月22日上午,2023新疆网络文化节重点项目“新疆动漫节”(以下简称“2023新疆动漫节”)在克拉玛依科学技术馆隆重开幕,蓝海彤翔作为国内知名的文化科技产业集团应邀参与此次活动,并在美好新疆e起向未来动漫展映区设置展…...
【AI视野·今日NLP 自然语言处理论文速览 第四十四期】Fri, 29 Sep 2023
AI视野今日CS.NLP 自然语言处理论文速览 Fri, 29 Sep 2023 Totally 45 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MindShift: Leveraging Large Language Models for Mental-States-Based Problematic Smartphone Use Interve…...
【VsCode】vscode创建文件夹有小图标显示和配置
效果 步骤 刚安装软件后, 开始工作目录下是没有小图标显示的。 如下图操作,安装vscode-icons 插件,重新加载即可 创建文件夹,显示图标如下:...
celery分布式异步任务队列-4.4.7
文章目录 celery介绍兼容性简单使用安装使用方式 功能介绍常用案例获取任务的返回值任务中使用logging定义任务基类 任务回调函数No result will be storedResult will be stored任务的追踪、失败重试 python setup.py installln -s /run/shm /dev/shmOptional configuration, …...
解决M2苹果芯片Mac无法安装python=3.7的虚拟环境
问题描述 conda无法安装python3.7的虚拟环境: conda create -n py37 python3.7出现错误 (base) ➜ AzurLaneAutoScript git:(master) conda create -n alas python3.7.6 -y Collecting package metadata (current_repodata.json): done Solving environment: fa…...
烟台网站建设多少钱/刚刚传来最新消息
TAP主要安装于光纤网络中的两个或多个点之间提供实时网络信号监控报告功能。TAP一般有两种不同的类型,有源TAP和无源TAP。无源TAP是一种不需要电源的纯无源器件。它在企业数据中心中更为常见,用于创建网络可视性和增强网络安全性。无源TAP主要有两种技术…...
合肥做公司网站一般多少钱/抖音seo排名
2019独角兽企业重金招聘Python工程师标准>>> 随着公司近几年所开拓的业务领域不断增强,同时也需要相应的业务软件平台作为后台支持,因此,信息中心所设计开发的软件规模近几年增长速度也很快。随之而来的数据库的容量和复杂程度也成…...
网站内部数据搜索怎么做/站长工具seo排名查询
目录树 新建Maven项目及步骤修改方法启动测试新建Maven项目及步骤 我这里是从创建开始讲,使用的工具是Idea2017版本。如果是已经创建了Maven,想改为spring boot项目的请直接跳到【修改方法】 1.点击右上角的File,出来的列表选择New Object&am…...
wordpress评论可见内容/国内新闻最近新闻今天
IntelliJ IDEA简介 IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合…...
手机网站开发注意的问题/竞价是什么工作
项目在debug环境下运行没有问题,在混淆打包之后却发现了闪退,无奈只能打开Log日志打印毛病~ 程序打印空指针异常,定位到空指针异常的地方~ 问题直指javaBean,于是我检查了我参考网上关于fastjson混淆的方法如下图 感觉没毛病啊…...
温州市建设小学大南网站/南宁关键词排名公司
5 类型参数列表我们学习了模板函数和模板类的定义和使用。但是,看到的“类型形参表”都只有一个元素,那么,如果要定义多个类型,应该怎么样操作?在telplate<类型形参表>中,“类型形参表”可以定义多个…...