(九) DockerFile

news2024/11/15 9:00:42

DockerFile

  • 一、概述
  • 二、DockerFile构建过程
    • 2.1、Dockerfile内容基础知识
    • 2.2、Docker执行Dockerfile的大致流程
    • 2.3、小总结
  • 三、DockerFile常用保留字指令
  • 四、实操案例
    • 4.1、要求Centos7镜像具备vim+ifconfig+jdk8
    • 4.2、编写
    • 4.3、Build构建镜像
    • 4.4、虚悬镜像

一、概述

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本

官网: https://docs.docker.com/engine/reference/builder/
在这里插入图片描述

构造三步骤

  • 编写Dockerfile文件
  • docker build命令构建镜像
  • docker run依镜像运行容器实例

二、DockerFile构建过程

2.1、Dockerfile内容基础知识

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

2.2、Docker执行Dockerfile的大致流程

不断往上堆积新的镜像进行运行,分层的概念

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

2.3、小总结

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

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

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

1、 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2 、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

3 、Docker容器,容器是直接提供服务的。

三、DockerFile常用保留字指令

在这里插入图片描述

FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

MAINTAINER

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

RUN

  • 容器构建时需要运行的命令

  • 两种格式

    • shell格式

    在这里插入图片描述
    这个就是相当于在这个基础镜像的运行终端操作的命令,RUN yum -y install vim,比如这个命令就是新增 vim 功能的命令,只要run了,他就会在容器构建时运行这个命令,就是你在构建镜像的过程中可以对镜像进行一些终端的操作

    • exec格式
      在这里插入图片描述
  • RUN是在 docker build时运行

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点,就是容器运行后,实例终端登录进来的目录地址

USER

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

ENV

用来在构建镜像过程中设置环境变量,就是设置一些环境变量的目录,然后可以直接引用使用

ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,

比如官方Tomcat,如下

在这里插入图片描述

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包,就是COPY的功能加上解压,以及链接的东西也能弄过来

COPY

类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

  • COPY src dest

  • COPY ["src", "dest"]

    <src源路径>:源文件或者源目录
    <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

VOLUME

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

CMD

指定容器启动后的要干的事情

在这里插入图片描述

注意

  • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换,意思就是如果有多个CMD命令,只有最后一个有用,会进行覆盖(注意的是前面的也会运行,但是会被后面的覆盖,假设是打印命令也会显示出来,最后一个生效,理解为覆盖而不是不运行)
    ,而且假设我们用Docke run启动,后面设置了一些命令参数,也会将这个命令进行覆盖

参考官网Tomcat的dockerfile演示讲解,官网最后一行命令

在这里插入图片描述
假设我们使用Docker run 启动Tomcat加上参数

docker run -it -p 8080:8080 30ef4019761d /bin/bash

也就是最后一个参数/bin/bash这个参数就会覆盖原有的CMD,其实就相当于多了一行
CMD ["/bin/bash","run"],原有的就会失效

它和前面RUN命令的区别

  • CMD是在docker run 时运行
  • RUN是在 docker build时运行

ENTRYPOINT

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

命令格式和案例说明

在这里插入图片描述

ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成

在这里插入图片描述

也就是当这两个指令都在的时候,CMD就相当于传参的作用,ENTRYPOINT是老大
案例如下:假设已通过 Dockerfile 构建了 nginx:test 镜像:

在这里插入图片描述

在这里插入图片描述
为什么上面的 ENTRYPOINT 不会被Docke run 命令覆盖,为啥第三个传参运行还是覆盖了呢?因为CMD作为参数传递给ENTRYPOINT,由于CMD会被Docker run覆盖,所以这个run的参数会覆盖CMD,然后再传递给ENTRYPOINT,最终效果就是上面所示,如果不用CMD传参,直接写死ENTRYPOINT,那 docker run命令就会失效,不会被覆盖

优点

在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。

注意

如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效

四、实操案例

4.1、要求Centos7镜像具备vim+ifconfig+jdk8

首先准备一个 Centos 的镜像

docker pull centos

在这里插入图片描述
这个centos是没有 JDK,ifconfig以及vim的

在这里插入图片描述

我们需要的就是在这个基础的Centos镜像的基础上通过 Dockerfile对其进行增强,也就是 Centos7镜像具备vim+ifconfig+jdk8

下载 Linux 的 JDK(随便下一个8版本的就行)

地址:https://mirrors.yangxingzhen.com/jdk/

在这里插入图片描述

4.2、编写

将JDK下载到服务器,以及创建 Dockerfile 文件(文件名注意大写 D)

在这里插入图片描述

准备编写Dockerfile文件

每一步都会构建新镜像,所以同一种命令尽量写在同一行

FROM centos:centos7
MAINTAINER guai<guailovecode@163.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar(这里都在当前一个文件夹里,不然要写绝对路径),把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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
#这个echo 就是打印的意思 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

在这里插入图片描述

4.3、Build构建镜像

# -t 参数就是可以设置名字以及版本
docker build -t 新镜像名字:TAG .

注意,上面TAG后面有个空格,有个点

开始构建

docker build -t centosjava8:1.5 .

在这里插入图片描述

这里又可以回忆一下联合文件系统,也就是分层镜像,这里每一步都会构建一个新的镜像,层层堆叠

运行新镜像,成功效果如下

在这里插入图片描述

4.4、虚悬镜像

概念

仓库名、标签都是的镜像,俗称dangling image,一般在构建或者删除的时候可能会产生

Dockerfile写一个

vim Dockerfile

from ubuntu
CMD echo 'action is success'

docker build . 在这里插入图片描述

查看镜像,发现这个镜像是没有仓库名以及tag的

在这里插入图片描述

查看虚悬镜像的命令

docker image ls -f dangling=true

在这里插入图片描述

一般对于虚悬镜像都是进行删除的,因为没有价值,命令如下

这个只会删除没有运行的镜像,如果容器启动过程中产生的虚悬镜像,需要将容器停止才能进行删除

docker image prune

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

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

相关文章

C++18 -- 虚析构函数构成多态、纯虚函数、抽象类、虚继承

多态的条件&#xff1a; 1&#xff09;覆盖 2&#xff09;基类的指针或者引用 虚表的运行原理&#xff1a; 一、多态的特例 – 虚析构函数构成多态 类有指针作为数据成员&#xff0c;必须要写析构函数&#xff0c;如果当前类被继承了&#xff0c;则析构函数写成virtual&#…

四旋翼无人机学习第19节--allgero的板框导入,网表导入

文章目录1 板框导入2 网表导入3 颜色修改4 修改快捷键1 板框导入 1、板框可以在小马哥课程中获取哦。 课程地址:使用Cadence17.2 OrCAD Allegro绘制小马哥DragonFly四轴飞行器 2、下载得到文件&#xff0c;然后用CAD软件查看DXF文件&#xff0c;出现弹框点击是即可(文件只读)。…

科研小白如何做好科研(内附一些科研实用工具)

目录 前言 一、了解自己的研究方向 1、知其然并知其所以然 2、那如何做到呢&#xff1f; 二、拥有良好的科研素养 1、多读文献 2、夯实基础&#xff0c;搞清原理 3、不断学习&#xff0c;擅于总结 4、团队协作&#xff0c;勤沟通&#xff0c;多交流 三、掌握一些…

RHCEansible静态主机清单

首先要做好免密登录 RHCEansible虚拟机初始化配置&#xff0c;ansible配置和安装_无所不知的神奇海螺的博客-CSDN博客 添加主机组 [rootserver ~]# vim /etc/ansible/hosts 或者 测试 [rootserver ~]# ansible node1 -m command -a hostname --- 引号里的是想要受控主机执行的…

Dell inspiron 5488加装硬盘SSD

机械盘真心便宜&#xff0c; 当数据盘很合适。 ———— 我是装双系统&#xff0c; 希望速度快&#xff01; 我就装了一个SSD&#xff0c; STAT接口的&#xff0c; 和机械盘盒一样尺寸&#xff0c; 接口都是SATA&#xff0c; 我买的三星860EVO&#xff0c; 500G&…

I06-python菜鸟教程查漏补缺

学习链接&#xff1a;Python3 教程 | 菜鸟教程 目录 1.基础知识 2.字符串 1.基础知识 多行语句&#xff1a;复数类型&#xff1a; 复数由实数部分和虚数部分构成&#xff0c;可以用 a bj&#xff0c;或者 complex(a,b) 表示&#xff0c; 复数的实部 a 和虚部 b 都是浮点型…

项目的生命周期

0、Preface/Foreword PLM:Product Lifecycle Management System,产品生命周期管理;可以在公司内部或者多个公司之间对于产品研发协同办公,集成与产品相关的人力资源,流程、应用系统和信息,用于支持产品全生命周期的信息创建、管理、分发和应用。 1、硬件产品开发流程 立…

2022年下半年信息系统项目管理师综合知识真题及答案21-40

21、关于项目论证、项目评估目的和作用的描述&#xff0c;不正确的是&#xff1a;&#xff08;&#xff09;。 A&#xff0e;项目论证应围绕市场需求、开发技术、财务经济三个方面开展 B&#xff0e;项目论证的作用是审查可行性研究的可靠性、真实性和客观性 C&#xff0e;项目…

Java8 - Streams map()

文章目录概述Case 1 : A List of Strings to UppercaseCase 2 : List of objects -> List of StringCase 3 : List of objects -> List of other objectsTest概述 Stream.map()是Stream最常用的一个转换方法&#xff0c;它把一个Stream转换为另一个Stream map()方法用于…

网络安全人才市场需求调研

声明 本文是学习2022网络安全人才市场状况研究报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 网络安全人才市场需求调研 为了更好地了解网络安全人才市场能力需求情况&#xff0c;我们通过调研问卷对网络安全人才就业市场不同方向的十…

Jetson nano 入手系列之1—如何SSH远程登录

Jetson nano 入手系列之1— 如何SSH远程登录方法1.windows与jetson nano使用同一个网络方法2.windows与jetson nano使用网线连接参考文献本文使用的windows平台来ssh远程登录jetson nano&#xff0c;这里提供两种方法。方法1.windows与jetson nano使用同一个网络 使用同一个网络…

二氧化碳捕获和电化学转化(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

12---实现注册、异常处理,统一封装结果集

1、写统一返回结果包装类 在实际开发中&#xff0c;为了降低开发人员之间的沟通成本&#xff0c;一般返回结果会定义成一个统一格式&#xff0c;具体的格式根据实际开发业务不同有所区别&#xff0c;但至少包括三要素&#xff1a; code状态码&#xff1a;由后端统一定义各种返…

3)Django模板

目录 Django模板 Django 模板标签 变量 ​编辑 列表 字典 过滤器 default length filesizeformat date truncatechars safe if/else 标签 for 标签 {% empty %} ifequal/ifnotequal 标签 注释标签 include 标签 csrf_token 配置静态文件 模板继承 父模板…

Elasticsearch搜索引擎(一)——基础使用

Elasticsearch搜索引擎 关键词是中文的建议使用&#xff0c;英文和数字不要&#xff0c;模糊就行 如果普通数据库查询&#xff0c;无法解决如下问题 如果表记录上千万上亿了这个性能问题&#xff0c;另外一个如果有一个本文字段要在里面模糊配置&#xff0c;这个就会出现严重…

【408篇】C语言笔记-第二十章(数据的机器级表示)

文章目录第一节&#xff1a;补码讲解及内存实战演练1. 补码讲解2. 反码第二节&#xff1a;整型不同类型解析-溢出解析1. 整型不同类型解析2. 溢出解析第三节&#xff1a;IEEE754标准解析第四节&#xff1a;浮点型精度丢失第一节&#xff1a;补码讲解及内存实战演练 1. 补码讲解…

使用华为云服务器跟做尚硅谷电商数仓遇到的问题汇总(持续更新中.......)

文章目录使用xsync时提示xsync:command not found执行lg.sh时显示lg.sh:command not found云服务器网页无法访问hadoop使用xsync时提示xsync:command not found 1.使用xsync时提示xsync:command not found 首先查看是否安装rsync:&#xff08;反正我的里面没有。。。&#xff…

实验十、差分放大电路参数对静态和动态的影响

一、题目 利用Multism研究图1所示差分放大电路在下列情况下对电路静态和动态的影响 &#xff08;1&#xff09;两个 RcR_cRc​ 阻值相差 5%&#xff1b; &#xff08;2&#xff09;RwR_wRw​ 不在中点&#xff1b; &#xff08;3&#xff09;两个差分管的电流放大倍数不相等。…

sql行转列

我们以MySQL数据库为例&#xff0c;来说明行转列的实现方式。 首先&#xff0c;假设我们有一张分数表&#xff08;tb_score&#xff09;&#xff0c;表中的数据如下图&#xff1a; 然后&#xff0c;我们再来看一下转换之后需要得到的结果&#xff0c;如下图&#xff1a; 可以看…

SpringBoot(一)【学习笔记】

1.SpringBoot是什么&#xff1f; Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的&#xff0c;使用它可以做到专注于Spring应用的开发&#xff0c;而无需过多关注XML的配置。 2.SpringBoot的特点 为基于Spring的开发提供更快的入门体验 开箱即用&#xf…