深入理解Dockerfile

news2024/9/28 13:21:22

一、是什么

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。把镜像比喻成一个软件那么DockerFile就相当于是软件的配置文件。具体的内容可参考[官方网站](Dockerfile reference | Docker Documentation。

二、能做什么

通过使用Dockerfile,开发人员可以通过简单的文本文件定义和管理镜像的构建过程,实现自动化、可重复和可管理的镜像构建。Dockerfile提供了一种便捷且可扩展的方式来创建、配置和部署Docker镜像。

  • 自动化构建:通过编写Dockerfile,可以自动构建Docker镜像,而无需手动逐步执行构建步骤。Docker根据Dockerfile中的指令顺序执行构建步骤,从而实现自动化构建过程。

  • 可重复性:Dockerfile的存在可以确保镜像的构建过程是可重复的。通过编写一致的Dockerfile,可以确保不同环境下构建的镜像具有相同的配置和依赖关系,从而提高应用程序在不同环境中的可移植性和一致性。

  • 配置管理:Dockerfile中的指令可以用于配置镜像的环境、安装所需的软件包和依赖项,以及设置运行时的参数。通过在Dockerfile中定义这些配置和依赖关系,可以更好地管理和跟踪镜像的配置,确保每次构建的镜像都具有相同的配置和依赖项。

  • 版本控制:Dockerfile本身是一个文本文件,可以使用版本控制系统(如Git)对其进行管理和跟踪。通过对Dockerfile进行版本控制,可以轻松管理和回溯镜像构建过程中的变更,同时也方便团队协作和分享Docker镜像构建配置。

三、基础

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

四、执行大致流程

  • docker从基础镜像运行一个容器。
  • 顺序执行一条指令对容器做出修改。
  • 执行类似docker commit的操作提交一个新的镜像层。
  • docker基于刚才提交的镜像运行一个新的容器。
  • 执行DockerFile中下一条指令直到文件中的所有指令都执行完成。

五、指令详解

FROM

该指令初始化新的构建阶段,并为后续指令设置基础镜像。因此,一个 有效必须以指令开头。

RUN

构建镜像时运行的指令,有两种格式。

  • RUN <命令行> eg:RUN yum -y install vim
  • RUN [”可执行文件“,“参数1”,”参数2“]

CMD

指定容器启动后要干的事情,有三种格式。

  • CMD [“可执行文件”,“参数1”,“参数2”]
  • CMD [“参数1”,“参数2”]
  • CMD <命令>

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖

注意如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。类似于RUN指令,用于运行程序,但是运行的时间点不同。CMD 在docker run 时运行,RUN 是在 docker build。

MAINTAINER

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

EXPOSE

当前容器对外暴露出的端口。格式为。

  • EXPOSE <端口1> [<端口2>…]

作用:帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。格式为。

  • ENV <键> = <值> …
  • ENV <键> <值>

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包。ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

COPY

类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径> 的文件/目录复制到新的一层镜像内的<目标路径>位置,有两种格式。

  • COPY <源文件> <目标文件>
  • COPY [“源文件”,“目标文件”]

目标路径不用事先建好,会自动创建。

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。有两种格式。

  • VOLUME [“<路径1>”, “<路径2>”…]
  • VOLUME <路径>

作用:避免重要的数据,因容器重启而丢失,这是非常致命的。避免容器不断变大。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。格式有两种。

  • ENTRYPOINT [“executable”, “param1”, “param2”]
  • ENTRYPOINT command param1 param2

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

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

下面我将用一个案列来说明ENTRYPOINT搭配CMD的用法

假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx

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

1.不传参运行

$ docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

所以说执行docker run命令指定了参数它就会用指定的参数,如果没有指定参数它就会使用DockerFile中指定的参数。

六、案例

需求:构建一个自己的centos镜像,使其具备vim+ifconfig+jdk8,登录后进入路径为/usr/local,运行生成容器时并暴露80端口。

实现步骤:
1.编写Dockerfile文件

在这里插入图片描述
需要准备一个jdk8的安装包,配置环境变量的时候以及把安装包添加到容器的时候要注意自己下载的jdk8的版本号,否则可能导致报错或者是环境变量配置失败。

Dockerfile的内容

FROM centos:7
MAINTAINER wenh<bertwenh@qq.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-8u371-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_371
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
 

在这里插入图片描述
2.构建
build 命令来构建自己的 centos 镜像

  • docker build -f /path/DataFile -t 镜像名 [:TAG] .
    在这里插入图片描述

使用centos8会报这个错误,所以要用centos7来制做这个镜像。
在这里插入图片描述

注意:docker build -t centos:1.1 .这条命令后面是有一个空格和一个.的。

3.运行
run 命令来启动运行这个镜像生成的实例容器

  • docker run -it 镜像名[:TAG]
    在这里插入图片描述
    可以看到我们成功在centos中安装了jdk而且也成功的配置好了环境变量。

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

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

相关文章

密码学中的SM2

目录 概述 功能 密钥生成 基点G的生成 模数p 密钥生成过程 加解密 加密过程&#xff1a; 解密过程&#xff1a; 数字签名 概述 对第5步r的计算方式分析 对第6步s的计算方式分析 加密模式 优缺点 论文和研究方向推荐 论文 研究方向 概述 SM2是中国密码学算法…

qt 时间编程之时钟

这里写目录标题 开启time格式自动 QTIM打点 qtime qt的时间类 qtimer qt的定时类 头文件包含以及定义 #include<QTime> #include<QTimer>QTime * time; QTimer * timer;开启 右键槽 timer start&#xff08;50&#xff09; 到达50毫米的时候会触发 time out信号…

Unreal 5 实现场景环境控制组件

我在场景中发现了一个环境控制器&#xff0c;这个场景实现了雨天天气和晴天风沙天气&#xff0c;接下来我分析一下这个天气控制器是如何实现。 实现流程&#xff1a; 将环境控制器拖入场景&#xff0c;在配置项上面设置相应的雾&#xff0c;主光源&#xff0c;天空光。在环境控…

Spring Cloud Alibaba-全链路灰度设计

文章目录 灰度发布概念灰度发布架构Spring Cloud Alibaba技术架构下的灰度发布实现基础设计HttpHeader设计 Spring Cloud Gateway改造Spring Cloud Gateway实现灰度发布过滤器 自定义Loadbalancer微服务注册元信息修改自定义LoadBalancer使用 测试代码放到了github上[地址]() 灰…

STM32F4_CAN详解

目录 1. CAN简介 2. CAN协议的物理层 2.1 CAN协议中的差分信号 3. CAN协议的协议层 3.1 CAN的报文种类及结构 4. STM32的CAN外设 4.1 CAN框图 5. CAN相关结构体 6. CAN相关寄存器 7. 硬件设计 7.1 TJA1050芯片 8. 库函数配置CAN初始化 9. 实验代码 9.1 main.c 9…

SpringBoot问题-----------可以同时处理多少个请求

SpringBoot之可以同时处理多少个请求 SpringBoot的运行方式springBoot中tomcat的位置最小、最多工作线程数最大连接数等待数 SpringBoot的运行方式 SpringBoot项目中内嵌了tomcat 程序的运行就是通过tomcat来实现的&#xff1b;springBoot可以同时处理多少个请求其实就是在说 …

图像生成—使用GANs给出代码示例

文章目录 图像生成简单介绍—使用GANs给出代码示例1. 什么是生成对抗网络&#xff08;GANs&#xff09;2. 准备数据集3. 构建生成器和判别器4. 训练GAN模型5. 生成新图像6. 总结 图像生成简单介绍—使用GANs给出代码示例 图像生成是指使用计算机算法生成图像的过程。这些图像可…

C++ | 多线程使用vector

多线程使用vector 文章目录 多线程使用vector场景描述原因分析解决代码测试不扩容和提前扩容 size 与 capacity 变化欢迎关注公众号【三戒纪元】 场景描述 最近在看代码优化&#xff0c;看到有这样的代码&#xff1a; std::vector<int> valid_indices;void SimbaSegmen…

APP测试面试题快问快答(五)

21. App自动化你用的什么工具&#xff1f; 框架&#xff1a;Appium 编译环境和工具&#xff1a;python3.7和PyCharm 环境&#xff1a;Android sdk 第三方模拟器&#xff1a;夜神、蓝叠等模拟器 定位工具&#xff1a;uiautomatorviewer 实时日志查看&#xff1a;ddms 22.…

Tapdata 重磅更新已就绪!全托管云服务上线,应用场景再扩展

继 5 月举办的 「连接 1 次孤岛&#xff0c;服务 N 个场景」主题产品发布会后&#xff0c;Tapdata Live Data Platform 现已实现功能特性的全面升级&#xff0c;并基于自身产品能力积极探索在应用场景层面的落地实践及无限可能。 在去年 6 月的 Tapdata 2.0 发布会上&#xff…

Threejs实现数字人3D粽子

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。喜欢的话请三连&#xff0c;有问题请私信或者加微…

美国访问学者的父母如何申请探亲签证?

对于美国访问学者的父母来说&#xff0c;申请探亲签证是能够让他们在美国与子女团聚的重要途径。下面是知识人网小编整理的一些关于如何申请探亲签证的基本步骤和要点&#xff0c;希望对您有所帮助。 第一步&#xff1a;了解签证类型 在开始申请探亲签证之前&#xff0c;父母需…

【增值税发票识别 OCR】如何实现自动化发票管理

导言 在现代商业环境中&#xff0c;管理和处理大量的增值税发票数据是一项繁琐而重要的任务。传统的手动处理方法既费时又容易出错&#xff0c;而使用增值税发票识别OCR API可以实现自动化的发票管理&#xff0c;大大减少人工处理的工作量。本文将介绍如何利用增值税发票识别O…

Hadoop --- HDFS介绍

HDFS 全称是Hadoop Distributed File System hadoop分布式&#xff08;cluser&#xff09;文件存储系统。适合一次写入&#xff0c;多次读出的场景。 HDFS不需要单独安装&#xff0c;安装Hadoop的时候带了HDFS系统。 Hadoop安装可以参考&#xff1a; 有基础的&#xff0c;已…

轻松了解OPC:实时数据通信领域的必备神器!

OPC简介 OPC&#xff08;OLE for Process Control&#xff0c;进程控制对象连接&#xff09;是一种在工业自动化领域中被广泛使用的技术&#xff0c;它允许不同厂商的自动化设备之间进行通信和数据交换。 OPC技术最早是由美国的软件公司OPC Foundation推出的&#xff0c;它通…

【jsDelivr】jsDelivr - 一个免费、快速、可靠的为JS和开源项目服务的CDN

文章目录 jsDelivr 简介jsDelivr 工作原理 jsDelivr加速域名如下cdn.jsdelivr.net 2023/06/21 域名解析结果fastly.jsdelivr.net 2023/06/21 域名解析结果gcore.jsdelivr.net 2023/06/21 域名解析结果test1.jsdelivr.net 2023/06/21 域名解析结果 仓库拓展 - 其他CDNnpmESMGitH…

nginx nginx-module-vts 监控模块

nginx nginx-module-vts 监控模块 大纲 nginx-module-vts 安装nginx-module-vts 配置监控字段总结配置参数总结vhost_traffic_status_filter_by_host 使用vhost_traffic_status_filter_by_set_key 使用 nginx-module-vts 安装 nginx-module-vts 可以实现对nginx 各个虚拟主…

接口测试是什么?如何测试?

扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f; 8.接口测试都要掌…

在Linux系统实现服务器端和客户端的多线程并发通信

先导知识&#xff1a; 在Linux系统实现服务器端和客户端的套接字通信_小梁今天敲代码了吗的博客-CSDN博客 线程同步&#xff08;一&#xff09;_小梁今天敲代码了吗的博客-CSDN博客 线程同步&#xff08;二&#xff09;_小梁今天敲代码了吗的博客-CSDN博客 线程同步&#x…

通付盾入围《2023年度中国数字安全能力图谱(行业版)》

近日&#xff0c;数世咨询发布《2023年度中国数字安全能力图谱&#xff08;行业版&#xff09;》。通付盾作为以分布式数字身份和大数据决策智能技术为核心的数字化高端软件与服务提供商&#xff0c;凭借在数字安全领域的实力和影响力&#xff0c;入选政府、互联网两大行业细分…