Docker(三):DockerFile

article/2025/8/11 12:51:05

一、DockerFile介绍

1、DockerFile 介绍

     DockerFile 是一种能够被Docker 程序解释的文件(一般为了方便理解称之为“剧本”)。

     DockerFile 由一条一条的指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器

     镜像中指定自己额外的需求时,只需要在 DockerFile 上添加或修改指令,然后通过

     docker build 生成我们自定义的镜像(imahe)。如下图所示:

             

2、DockerFile 文件基本构成

           1)基础镜像信息

           2)维护者信息

           3)镜像操作指令

           4)镜像容器启动时执行指令

二、DockerFile 指令介绍

1、DockerFile 指令分类

       DockerFile 的指令主要分为 构建类指令 和 设置类指令;

       构建类指令主要用来构建镜像image,其指令的操作不会在image的容器上执行,如:FROM

       、MAINTAINER、RUN、ENV、ADD、COPY 都是构建类指令。

       设置类指令主要用于设置镜像image的属性信息,其指令的操作将在image的容器上执行,

       如:CMD、ENTRYPOINT、USER、EXPOSE、VOLUME、WORKDIR、ONBUILD 都是

       设置类指令。

       

2、DockerFile 指令说明

2.1、指令说明

指令说明
FROM基础镜像,当前新镜像是基于哪个镜像的,有继承的意味
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露的端口
WORKDIR指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 COPY src dest COPY ["src","dest"]
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令 Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令 ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

     

2.2、指令详细介绍

         通过 man docker file 命令可以查看到DockerFile指令的详细说明,这里简单介绍下常用

         的指令。

2.2.1、FROM 

            FROM 指令 用于指定其后构建 新镜像 是所使用的基础镜像。

            FROM 指令 必须是 DockerFile 文件中的收条命令。

            FROM 指令 所指定的基础镜像image可以是远程官方仓库中的也可以是本地仓库中的(一

            般是Linux或CentOS),优先本地仓库中的镜像。

            FROM 指令使用格式:

                 FROM  <image镜像>:<tag版本标签>

                 如:FROM centos:latest

2.2.2、RUN

            RUN 指令用于设置在构建镜像过程中执行的命令,有以下2种格式:

            1)shell格式

                 命令格式:RUN <命令>

                 例如:RUN echo 'kubemsb' > /var/www/html/index.htm

            2)exec 格式

                 命令格式:RUN ["可执行文件","参数1","参数2"]

                 例如:RUN ["/bin/bash","-c","echo kubemsb > /var/www/html/index.htm"]

            注意:

                    按优化的角度来讲:当有多条需要执行的run命令时,不要使用多条RUN、尽量使用

                    ‘&&’ 或 ‘\’ 符号连接成一行。因为多条RUN命令会让镜像建立多层(镜像变臃肿了),

                    如下图所示:

                           

           

2.2.3、CMD

            CMD命令不同于 RUN 命令,CMD命令用于在容器启动时所要执行的命令,而RUN 用于

            指定镜像构建时所要执行的命令、

            CMD 命令格式有3种,如下所示:

                  CMD ["executable","param1","param2"]

                  CMD ["param1","param2"]

                  CMD command param1 param2

            注意:

                 1)每个DockerFile只能有一条CMD命令。如果指定了多条CMD命令,只有最后一条

                       CMD命令会被执行

                  2)如果容器启动时指定了运行命令,则会覆盖CMD指定的命令。

                  3)什么是容器启动时指定的运行命令?

                        启动容器时指定的运行命令,如:docker run -d 镜像名  运行命令

2.2.4、EXPOSE

            EXPOSE命令用于指定容器在运行时监听的端口,可以一次监听多个端口

            命令格式:EXPOSE <port> [<port>...]

            例如:EXPOSE 80 3306 8080

            注意:

                 EXPOSE 监听的端口,在容器启动时需要通过参数 -p 映射到宿主机上后外部才能访问

2.2.5、ADD 

            ADD 命令用于将宿主机上的文件拷贝到构建的自定义镜像image 中

           格式:ADD <src>  <dest>

           src:可以是一个本地文件或压缩文件,也可以是一个url,如果src是一个url,那么ADD 就

                    相当于wget 命令

           dest:dest 路径的填写可以是容器内的绝对路径,也可以是相对工作目录的相对路径

2.2.6、ENV

            ENV 命令用于指定一个环境变量

            格式:ENV <key> <value> 或者

                       ENV <key>=<value>

            例如:ENV JAVA_HOME /usr/local/jdk/jdk-XX

2.2.7、COPY

            COPY命令与 ADD 命令功能一样,都是将宿主机上的文件拷贝到构建的自定义镜像

            image 中,不同的是COPY的源文件src只能是本地文件

            格式:COPY <src>  <dest>

2.2.8、ENTRYPOINT

            ENTRYPOINT 与 CMD 非常相似,都是用于指定在容器启动时需要实行的命令。

            ENTRYPOINT 与 CMD 相同点:

                 I)一个DockerFile 只能写一条,如果写了多条,那么只有最后一条才生效;

                 II)都是在容器启动时执行;

            ENTRYPOINT 与 CMD 不同点:

                 I)如果用户启动容器时指定了运行命令,ENTRYPOINT不会被运行命令覆盖,而 CMD

                     会被运行命令覆盖

            格式有2种:

                 I)ENTRYPOINT ["executable","param1","param2"]

                 II)ENTRYPOINT command param1 param2

2.2.9、VOLUME

            VOLUME 命令用于把宿主机的目录与容器中的目录映射。

            使用时只指定挂载点,docker容器中的目录为自动生成的。

             格式:VOLUME ["<mountpoint>"]

2.2.10、USER

              USER 命令用于设置启动容器的用户(如:Oracle需要Oracle用户操作),可以是

              用户名或UID。

              例如:USER daemon  或 USER 1001

              注意:

                      如果容器设置了以 daemon 用户去运行,那么 RUN,CMD 和 ENTRYPOINT都会

                     以这个用户去运行;镜像构建完成后,通过docker run 运行容器时,可以通过参数

                     -u 来覆盖锁指定的用户

2.2.11、WORKDIR

             WORKDIR 命令用于设置工作目录,类似于cd 命令。

             不建议使用RUN cd /root,建议使用 WORKDIR,如:WORKDIR /root

三、DockerFile 执行流程及生成镜像的一般步骤

3.1、DockerFile 生成镜像的基本步骤

         使用 DockerFile 生成对应镜像一般需要以下步骤:

         1)在指令目录创建一个文件夹(目标)

         2)在该文件夹中编写 DockerFile 文件

         3)使用 “docker build” 命令构建镜像

         4)docker run 使用构建的镜像启动容器

         如下图所示:

                

3.2、DockerFile文件中的指令需要满足以下规则

         

3.3、DockerFile 执行流程

         docker 执行一个 DockerFile 脚本的流程大致如下:

         1)docker从基础镜像运行一个容器

         2)执行一条指令并对容器作出修改

         3)执行类似docker commit的操作提交一个新的镜像层

         4)docker再基于刚提交的镜像运行一个新的容器

         5)执行dockerfile中的下一条指令直到所有指令都执行完成

3.4、DockerFile、Docker镜像和Docker容器之间的关系

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

        同阶段,即:

               I)Dockerfile是软件的原材料

               II)Docker镜像是软件的交付品

               III)Docker容器则可以认为是软件的运行态

       Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺

       一不可,合力充当Docker体系的基石,如下图所示:

              

      1)Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。

            Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、

            动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务

            和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等

      2)Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,

           当运行 Docker镜像时,会真正开始提供服务

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

四、Dockerfile 使用案例

1、以构建Tomcat 为例来看下 DockerFile 的使用步骤

1.1、在指定目录下创建一个目录,如:tomcatdir

1.2、在目录 tomcatdir 中上传 jdk 和 tomcat 的安装包,

1.3、在目录 tomcatdir 中创建DockerFile 文件,DockerFile内容如下:

         

         

FROM         centos:centos7
MAINTAINER    bobo<dengpbs@163.com>
#把宿主机当前上下文的hello.txt拷贝到容器/usr/local/路径下
COPY hello.txt /usr/local/hello.txt
#把java与tomcat添加到容器中
ADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.71.tar.gz /usr/local/
#安装vim编辑器
#RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.71
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.71
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-8.0.47/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-8.0.47/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.5.71/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.47/bin/logs/catalina.out

1.4、构建tomcat 镜像

        执行命令 docker build -f Dockerfile -t image-tomcat . 来构建镜像,

        其中 image-tomcat 是镜像名称,-f 指定DockerFile 文件

        

        

1.5、启动容器

        1)执行下面命令来启动容器:

               docker run -it -p 9080:8080 --name docker-tomcat -v /root/DockerFile/tomcatdir/test:/usr/local/apache-tomcat-8.5.71/webapps/test -v /root/DockerFile/tomcatdir/tomcatlogs/:/usr/local/apache-tomcat-8.5.71/logs -d image-tomcat

              

         2)测试

              在浏览器中输入 Apache Tomcat/8.5.71 访问tomcat ,看容器是否运行成功,

               如下图所示:

               

      

     


http://www.hkcw.cn/article/qKNdpTCjKW.shtml

相关文章

【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…

Ubuntu24安装Docker详细教程

目录 Ubuntu 安装 Docker 详细教程 一、安装环境说明 二、卸载旧版 Docker&#xff08;若存在&#xff09; 三、安装必要的依赖 四、添加 Docker 的 GPG 密钥 五、配置 Docker 的软件源 六、安装 Docker docker-compose离线安装 七、验证 Docker 是否安装成功 八、配置…

2024第八届御网杯信息安全网络大赛线上WP详解(misc+cryoto)(详解-思路-脚本)

芜湖~ 首届御网杯线上和ISCC分开进行 但还是用的ISCC的页面差评 嘻嘻 又是玄乎的一天 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 目录 附件 # Misc ##Notice ##编码转换 Brainfuck编码 jsfuck编码 Ook! 编码 ##bluetooth 导出压缩包 第一…

在Linux中安装、配置和挂载NFS的完整指南

一、NFS简介 NFS&#xff08;Network File System&#xff09; 是一种分布式文件系统协议&#xff0c;允许用户通过网络在不同主机间共享文件和目录。它适用于局域网环境&#xff0c;常用于服务器集群、数据共享等场景。本文详细介绍NFS服务端与客户端的安装、配置及挂载流程。…

Linux-Ubuntu下的git安装与配置

一、安装git 1.打开终端&#xff0c;运行以下命令&#xff08;需要联网&#xff09; sudo apt-get update sudo apt-get install git 2.验证安装 安装完成之后&#xff0c;通过运行以下命令验证git是否已经正确安装&#xff1a; git --version 二、配置git 2.1.配置用户名…

亲测可用:wsl2安装ubuntu22.04的GNOME桌面

本文主要介绍wsl安装的ubuntu如何配置图形化桌面&#xff0c;主要使用与windows操作系统环境&#xff0c;方便搭建Linux环境下的可视化开发环境&#xff0c;网上流传的很多教程都不能正确安装&#xff0c;以下是本人亲自验证可用的操作方法。 1、开始安装 1.1 配置源 sudo v…

个人健康中枢的多元化AI网络革新与精准健康路径探析

引言 随着数字化转型的深入推进,个人健康中枢作为集成化健康管理系统,正在从传统的单一功能向多元化的AI驱动方向快速发展。在这一背景下,新兴网络硬件技术,特别是DPU(数据处理单元)和全光网络的出现,为个人健康中枢的革新提供了前所未有的机遇。本研究将深入探讨这些技…

Linux《进程控制》

在之前的Linux《进程概念》当中我们已经了解了进程基本的概念&#xff0c;那么接下来在本篇当中我们将开始进程控制的学习&#xff1b;在本篇当中我们先会对之前的学习的创建子进程的系统调用fork再进行补充了解&#xff0c;并且再之后会重点的学习进程的终止、进程等待以及进程…

Java应用中 慢SQL导致内存无法回收,然后导致线程阻塞,CPU被撑爆

问题分析 慢SQL的直接危害 数据库连接池长时间被占用&#xff0c;导致线程堆积&#xff0c;请求阻塞。 未释放的 ResultSet、Statement 或 Connection 可能导致内存泄漏&#xff08;例如未正确关闭资源&#xff09;。 大结果集&#xff08;如一次性加载百万条数据到内存&…

高质量AI歌曲生成器ACE-Step一键启动整合包,AI自动谱曲自动演唱

本次分享一款AI歌曲创作利器&#xff1a;ACE-Step&#xff0c;ACE-Step是刚发布不久的AI自动谱曲AI自动演唱软件&#xff0c;软件在歌曲生成速度、音乐连贯性和可控性上相对同类软件有了较大提升。ACE-Step在3小时前刚发布了新版本&#xff0c;我基于当前最新版本制作了免安装一…

Facebook 的隐私保护措施是否足够?技术观点

在数字时代&#xff0c;隐私保护成为了公众关注的焦点&#xff0c;尤其是对于拥有数十亿用户的社交媒体巨头 Facebook 来说&#xff0c;其隐私保护措施的有效性更是备受瞩目。本文将从技术角度探讨 Facebook 的隐私保护措施是否足够。 数据收集与使用 Facebook 收集用户数据的…

多语种OCR识别系统,引领文字识别新时代

在全球化与数字化深度融合的今天&#xff0c;语言障碍成为企业跨国协作、信息管理的一大挑战。无论是跨国合同签署、多语言档案管理&#xff0c;还是跨境商务沟通&#xff0c;高效精准的文字识别技术已成为刚需。中安智能OCR多语种识别系统应运而生&#xff0c;凭借其强大的光学…

强化学习实战:训练AI玩转OpenAI Gym

强化学习实战&#xff1a;训练AI玩转OpenAI Gym 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 强化学习实战&#xff1a;训练AI玩转OpenAI Gym摘要引言强化学习基础与算法分类1. 核心概念与数学表示2. 算法分类与…

前端实现导出element-plus表格和从后端获取数据导出,支持勾选导出

1. 纯前端实现导出 安装file-saver和xlsx file-saver&#xff1a; 用于在浏览器中触发文件的保存下载&#xff08;保存为本地文件&#xff09;。 使用场景&#xff1a; 当已经在 JavaScript 中生成了文件&#xff08;如 Blob 对象&#xff09;&#xff0c;并想让用户保存它时使…

Stable Diffusion学习指南【ControlNet上篇】- 功能介绍、安装和使用

&#xff08;注&#xff1a;文末扫码获取AI工具安装包和AI学习资料&#xff09; 自 SD 系列教程发布这几个月&#xff0c;已被大家多次催更 ControlNet 的教程&#xff0c;相信很多朋友也都听说过这款神奇的控图工具。ControlNet 到底是什么&#xff1f;为什么作为一款插件它可…

论文阅读 | CVPR | MambaOut:视觉任务真的需要 Mamba 吗?

文章目录 论文阅读 | CVPR | MambaOut&#xff1a;视觉任务真的需要 Mamba 吗&#xff1f;摘要引言创新点概念讨论Mamba到底适合处理什么样的任务&#xff1f;视觉任务具有很长的序列吗&#xff1f;如何计算Transformer 模块的浮点运算次数&#xff08;FLOPs&#xff09;?定义…

基于 Q-learning 的城市场景无人机三维路径规划算法研究,可以自定义地图,提供完整MATLAB代码

一、引言 随着无人机技术的不断发展&#xff0c;其在城市环境中的应用越来越广泛&#xff0c;如物流配送、航拍测绘、交通监控等。然而&#xff0c;城市场景具有复杂的建筑布局、密集的障碍物以及多变的飞行环境&#xff0c;给无人机的路径规划带来了巨大的挑战。传统的路径规…

Vivado IP核之定点数累加Accumulator使用说明

Vivado Accumulator IP核的使用说明 配置步骤 目录 前言 一、Accumulator IP配置步骤 二、仿真 三、仿真分析 总结 前言 在现代数字信号处理和通信系统中&#xff0c;对数据进行快速而精确的累加操作是至关重要的。Vivado Accumulator IP核提供了一种灵活、可配置的硬件累…

中科院自动化所万字长文最新综述!当无人机遇上大模型:低空机动性智能体的综述与展望

作者&#xff1a;Yonglin Tian, Fei Lin, Yiduo Li, Tengchao Zhang, Qiyao Zhang, Xuan Fu, Jun Huang, Xingyuan Dai, Yutong Wang, Chunwei Tian, Bai Li, Yisheng Lv, Levente Kovacs, Fei-Yue Wang 单位&#xff1a;中科院自动化所多模态人工智能系统国家重点实验室&…

(35)远程识别(又称无人机识别)(一)

文章目录 前言 1 更改 2 可用的设备 3 开放式无人机ID 4 ArduRemoteID 5 终端用户数据的设置和使用 6 测试 7 为OEMs添加远程ID到ArduPilot系统的视频教程 前言 在一些国家,远程 ID 正在成为一项法律要求。以下是与 ArduPilot 兼容的设备列表。这里(here)有一个关于远…