Docker高级篇之Dockerfile解析

news2024/11/26 18:53:11

文章目录

    • 1. DockerFile简介
    • 2. DockerFile的构建过程
    • 3. DockerFile的常用保留字
    • 4. 使用案例
    • 5. 虚悬镜像

1. DockerFile简介

DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像的指令和参数构成的脚本。
在这里插入图片描述·

2. DockerFile的构建过程

  • DockerFile内容的基础知识

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

  • Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似于docker commit的操作提交一个新的镜像层
(4)docker再基于提交的镜像运行一个新的容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成

从应用软件的角度来看,Dockerfile、Docker镜像和Docker容器分别代表软件的三个不同阶段:

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器可以任务是软件镜像的运行态,也即依照镜像运行的容器实例

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署和运维,三者缺一不可,合力充当Docker体系的基石。

在这里插入图片描述

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

3. DockerFile的常用保留字

  • FROM

基础镜像,表示当前要生成的新镜像是基于哪一个镜像,指定一个已经存在的镜像作为模版,DockerFile的第一条命令基本上都是第一条

  • MAINTAINER

镜像维护者的姓名和邮箱地址

  • RUN

表示容器构建时需要运行的命令。它有两种格式分别是SHEEL格式和EXEC。RUN时docker build的时候运行

  • EXPOSE

当前容器对外暴露的端口

  • WORKDIR

指定在容器创建后,终端默认登陆进来的工作目录,一个落脚点

  • USER

指定该镜像以什么样的用户取执行,如果都不指定,默认是root

  • ENV

用来在构建镜像过程中设置环境变量

  • VOLUME

容器数据卷,用于数据保存和持久化工作

  • ADD和COPY

ADD命令的作用是将宿主机下的文件拷贝进镜像且会自动处理URL和解压tar压缩包。COPY命令类似于ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源头>文件/目录复制到新的一层镜像中<目标路径>位置

  • CMD和ENTRYPOINT

首先CMD用于指定容器启动后要干的事情,它和RUN相似,也支持shell和exec两种格式。注意Dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run之后的参数替换。

RUN命令是在docker builder时运行
CMD是在docker run时运行

ENTRYPOINT也是用来指定一个容器启动要运行的命令,类似于CMD指令,但是ENTRYPOINT不会被Docker RUN后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。

ENTRYPOINT可以和CMD一起使用,一般是变参才会使用CMD,这里CMD等于是在给ENTRYPOINT传参。当指定ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行的命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令

FROM nginx

ENTRYPOINT["nginx","-c"]#定参
CMD ["/etc/nginx/nginc.conf"]

4. 使用案例

  • 案例需求分析

自定义一个镜像mycentosjava8,需求时Centos镜像具备vim+ifconfig以及jdk8的功能

  • 案例搭建过程

(1)首先我们需要下载centos的基础镜像和jdk

docker pull centos

在这里插入图片描述

(2)编写DockerFile

FROM centos

MAINTAINER zzyy(2012126846@qq.com)

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器

RUN yum -y install vim

#安装ifconfig

RUN yum -y install net-tools

#安装jdk8及lib库
RUM yum -y install glibc.i686
RUM mkdir /usr/local/java

#ADD是相对路径jar,把jdk的jar包添加到容器中,安装包必须和Dockerfile文件在同一个位置
ADD jdk-8u411-fcs-bin-b09-linux-aarch64.tar /usr/local/java/

#配置java环境变量

ENV JAVA_HOME /usr/local/java/jdk1.8.0_411
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "Success------ok"
CMD /bin/bash

(3)构建

构建的命令是docker build -t 新镜像的名字:TAG

docker build -t centosjava8:1.5 .

在这里插入图片描述
然后我们看看生成的镜像:

docker images

在这里插入图片描述
(4)最后运行构建的镜像

docker run -it b422f5178068 /bin/bash

在这里插入图片描述
查看vim命令
在这里插入图片描述
查看ifconfig命令
在这里插入图片描述
查看java版本
在这里插入图片描述

5. 虚悬镜像

所谓的虚悬镜像就是仓库名和标签都是<none>的镜像。

在这里插入图片描述
下面命令就是查看本地所有的虚悬镜像

docker image ls -f dangling=true

虚悬镜像是没有价值的,可以直接删除

docker image prune

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

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

相关文章

2.3 OpenCV随手简记(四)

阈值处理是很多高级算法底层处理的预方法之一。 自己求图像平均阈值&#xff1a; # -*- codingGBK -*- import cv2 as cv import numpy as np #求出图像均值作为阈值来二值化 def custom_image(image): gray cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("原来&qu…

精选网络安全书单:打造数字世界的钢铁长城!

目录 1.前言 2.书单推荐 2.1. 《内网渗透实战攻略》 2.2. 《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》 2.3. 《CTF那些事儿》 2.4. 《权限提升技术&#xff1a;攻防实战与技巧》 2.5. 《数字政府网络安全合规性建设指南&#xff1a;密码应用与数据安全…

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…

五个超实用的 ChatGPT-4o 提示词

GPT-4o 是 OpenAI 最近推出的最新人工智能模型&#xff0c;不仅具备大语言模型的能力&#xff0c;而且拥有多模态模型的看、读、说等能力&#xff0c;而且速度比 GPT-4 更快。下面我们就来介绍几个超实用的 GPT-4o 提示词&#xff0c;帮助大家更好地了解 GPT-4o 的功能和应用场…

Vuforia AR篇(五)— 地平面检测

目录 前言一、什么是地平面识别&#xff1f;二、使用步骤三、示例代码四、效果五、总结 前言 在增强现实&#xff08;AR&#xff09;应用程序的开发中&#xff0c;地平面识别是一项关键技术&#xff0c;它允许虚拟对象与现实世界的地面进行互动。Vuforia 是一个功能强大的 AR …

SpringBoot引入WebSocket依赖报ServerContainer no avaliable

1、WebSocketConfig 文件报错 Configuration EnableWebSocket public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}2、报错内容 Exception encountered during context initialization - canc…

UFS协议—新手快速入门(二)【5-6】

目录 五、UFS协议栈 六、UFS技术演进与详解 1、UFS应用层 设备管理器 任务管理器 2、UFS传输层 3、UFS互联层 UFS协议—新手快速入门&#xff08;一&#xff09;【1-4】 五、UFS协议栈 UFS&#xff08;Universal Flash Storage&#xff09;协议是针对固态存储设备&…

德国西门子论未来质量管理 - 如何与明天相遇?

未来制造业的质量 -- 如何用软件方案满足质量要求 作者&#xff1a;Bill Butcher 翻译&编辑&#xff1a;数字化营销工兵 【前言】在Frost&Sullivan最近发表的一份白皮书中&#xff0c;他们讨论了制造业的质量投资。质量是制造过程的关键要素&#xff0c;但似乎比其他…

Ubuntu部署开源网关Apache APISIX

说明 系统&#xff1a;Ubuntu 24.04 LTSDocker版本&#xff1a;v26.1.3Docker Compose版本&#xff1a;v2.26.1 下载和配置 Ubuntu需要安装Docker和Docker Compose 下载apisix-docker仓库 git clone https://github.com/apache/apisix-docker.git修改docker-compose 配置e…

嵌入式学习记录6.6(拷贝构造/友元函数/常成员函数)

一.拷贝构造函数和拷贝赋值函数 1.1拷贝构造函数功能,格式 拷贝构造函数是一种特殊的构造函数&#xff0c;用来将一个类对象给另一个类对象初始化使用的。 1> 用一个类对象给另一个类对象初始化时&#xff0c;会自动调用拷贝构造函数。 2> 当一个类对作为函数的实参&…

【Linux】Linux环境基础开发工具_5

文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条&#xff0c;不过那仅仅是测试&#xff0c;接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…

前端面试项目细节重难点(已工作|做分享)想(八)

面试官&#xff1a;请你讲讲你在该项目中遇到的印象深刻的问题是什么&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路进行阐述】 第一层面…

Docker 基础使用(2) 镜像与容器

文章目录 镜像的含义镜像的构成镜像的作用镜像的指令容器的含义容器的状态容器的指令 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用&#xff08;3&#xff09; 存…

达梦8 并行查询

达梦数据库可以通过在查询语句加/* parallel */ HINT并行执行。下面以一个排序语句为例 我们通过一条监控语句查询排序区的使用情况。 最初没有查询结果&#xff08;no rows&#xff09; 伴随着语句insert /* parallel(4) */ into d select * from a order by 2执行&#xff…

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略&#xff1f;Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略&#xff1f; 由于Redis内存是有大小的&#xff0c;当内存快满的时候&#xff0c;又没有…

解决CSDN 导入Markdown图片失效不显示问题

每次将MarkDown文件导入CSDN的时候&#xff0c;有些图片总是由于防盗链的问题导致图片加载不出来&#xff0c;还得手动再导一遍&#xff0c;极其不方便。所以我们能不能建立一个属于自己的图片服务器或者说在线图库呢&#xff0c;而且每次使用Typora插入图片的时候都会自动的上…

【ARFoundation自学05】人脸追踪(AR Face manager)实现

1. 修改摄像机朝向渲染方式-选中user 这个方式就会调用前置摄像头 2 创建 AR Session、XR Origin&#xff0c;然后在XR Origin上面添加组件 注意&#xff1a;XR Origin 老版本仍然叫 AR Session Origin 接下来在XR Origin上面添加AR Face Manager组件&#xff0c;如下图&am…

差分原理+练习

差分的原理和前缀和相似&#xff0c;我们先联想一下前缀和。 前缀和计算下标从0到n的和&#xff0c;记为sum[n1];如果想要求出[l,r]区间的和&#xff0c;可以快速的通过sum[r1]-sum[l]来得到 。 前缀和适用于需要多次获取指定连续区间和的情景 而差分即计算相邻两个元素的差…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文&#xff1a;How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

Mybatis编写SQL

文章目录 一、用注解编写1.1 增普通增加获取自增ID 1.2 删和改1.3 查单表查询多表查询 二、用xml编写2.1 使用xml的流程2.2 增普通增加获取自增ID 2.3 删 和 改2.4 查 三、#{} 和 ${}3.1 #{} 、${}3.1 预编译 SQL 、即时编译SQL 两种写法是可以同时存在的 一、用注解编写 1.1 …