百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

IT工程师都需要掌握的容器技术之Dockerfile

wptr33 2025-01-09 16:33 15 浏览

阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。

今天我们继续来学习Docker技术,本篇文章主要介绍Dockerfile,Dockerffile是一个文本文件,Docker通过读取Dockerfile文件来自动构建镜像。

下面就由成哥来介绍Dockerfile的语法及使用方法吧!

01 Dockerfile概述

Dockerfile相当于一个文档,用户可以基于dockerfile生产新的容器。Dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指令进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像层是多层叠加的,镜像层数越多,效率越低。所以创建镜像时尽量通过越少的指令完成需要的动作。Docker通过dockerfile进行build及build后的镜像运行流程逻辑如下图所示。

02 Dockerfile的编写

(1) 上下文

上下文就是指我们build Docker镜像时Dockerfile文件所在的目录,构建镜像是由Docker守护程序而不是CLI运行的,该过程的第一件事是将 Dockerfile 文件所在目录下的所有内容递归的发送到守护进程。所以在大多数情况下,最好是创建一个新的目录,在其中保存 Dockerfile,并在其中添加构建 Dockerfile 所需的文件。

现在我们就在系统中创建一个空目录以便下面Dockerfile文件的创建及后面的镜像构建

(2) Dockerfile格式

Dockerfile的语法格式如下所示:

1. # 格式为语法+参数  
2. INSTRUCTION arguments  

该指令不区分大小写。但是,约定将它们大写,以便更轻松地将它们与参数区分开。Dockerfile按顺序运行指令。

(3) Dockerfile常用指令

1)FROM

一个Dockerfile 必须以开始FROM的指令。使用FROM指令指定一个基础镜像,后续指令将在此镜像的基础上运行,在一个Dockerfile文件中FROM可以出现多次,下面我们来看看FROM的语法格式

1. FROM [--platform=<platform>] <image> [AS <name>]  

我们创建一个Dockerfile文件,其中FROM指定以centos为基础镜像

1. # 指定以centos为基础镜像进行build  
2. FROM centos  

2)WORKDIR

WORKDIR用于指定工作目录,所有执行的shell语句都会在该指定的目录中运行,我们后面讲的 RUN,CMD,COPY,ADD 等指令将会在指定的工作目录中去执行。该指令也可以在一个Dockerfile文件中出现多次,最后一次出现的目录依次是上个目录的子目录。如下所示:

1. WORKDIR /a  
2. WORKDIR b  
3. WORKDIR c  
4. RUN pwd  

最后这个pwd的命令执行的目录为/a/b/c。我们继续基于上面的指令来指定WORKDIR目录为'/'

3)RUN

RUN 指令用于执行命令,该指令有两种形式:

a. RUN <command>,使用 shell 去执行指定的命令 command,一般默认的 shell 为 /bin/sh -c

b. RUN ["executable", "param1", "param2"],使用可执行的文件或程序后面并可以跟上相关参数

下面我们通过这两种形式来创建执行命令

1. # 第一种RUN指令方式  
2. RUN yum update  
3.   
4. # 第二种RUN指令方式  
5. RUN ["/bin/bash", "-c", "echo hello"] 

4)CMD

CMD 的使用方式跟 RUN 类似,其跟RUN的区别是RUN是在构建镜像是运行执行而CMD是容器运行后执行的指令。在一个 Dockerfile 文件中只能有一个 CMD 指令,如果有多个 CMD 指令,则只有最后一个会生效。CMD也有三种命令格式具体如下

1. # 第一种执行命令推荐用法  
2. CMD ["executable","param1","param2"]  
3.   
4. # 第二种该格式主要配合ENTRYPOINT使用,CMD 指令的值会作为 ENTRYPOINT 指令的参数  
5. CMD ["param1","param2"]  
6.   
7. # 第三种执行shell form,该方法与第一种的执行效果一致  
8. CMD command param1 param2   

我们通过第一种方式来创建来执行wc的帮助指定具体如下

1. CMD ["/usr/bin/wc","--help"]  

第二种方法需要在Dockerfile中使用ENTRYPOINT指令,ENTRYPOINT 指令会覆盖 CMD 指令作为容器运行时的默认指令,并且不会在 docker run 时被覆盖,如下示例

1. FROM centos  
2. ENTRYPOINT ["ls", "-a"]  
3. CMD ["-l"]  

上述构建的镜像,在我们使用 docker run <image> 时等同于 docker run <image> ls -a l 命令。CMD 指令的值会被当作 ENTRYPOINT 指令的参数附加到 ENTRYPOINT 指令的后面,并且如果 docker run 中指定了参数,会覆盖 CMD 中给出的参数。

5)COPY&ADD

COPY 和 ADD 都用于将文件,目录等复制到镜像中。两者的区别在于ADD可以使用远程URL路径作为复制源,如果只复制本地文件建议使用COPY,两个指令的语法格式如下:

1. # ADD命令格式  
2. ADD [--chown=<user>:<group>] <src>... <dest>  
3. ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]  
4.   
5. # COPY命令格式  
6. COPY [--chown=<user>:<group>] <src>... <dest>  
7. COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]  

--chown用于指定文件目录用户与权限,<src> 可以指定多个,但是其路径不能超出上下文的路径,即必须在跟 Dockerfile 同级或子目录中。<dest> 不需要预先存在,不存在路径时会自动创建,如果没有使用绝对路径,则 <dest> 为WORKDIR指定目录的相对路径。

6)ENV

ENV用于定义Dockerfile的环境变量,变量设置的值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。其命令格式如下:

1. ENV <key>=<value> ...  

使用示例如下

1. # $MYDIR将被替换成"/mydir"  
2. ENV MYDIR="/mydir"  
3. RUN mkdir $MYDIR  

7)VOLUME

VOLUME用于在Dockerfile文件中指定挂载目录,在容器运行时,将自动创建相应的匿名卷,其命令格式如下

1. VOLUME ["/data"]  

该条命令会在容器运行时创建一个匿名卷,同时将容器中/data目录挂载到该卷上。

8)EXPOSE

EXPOSE指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。EXPOSE指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档类型,有关打算发布哪些端口的信息。如果要将容器端口暴露出来,需要在 dcoker run 命令中使用 -p。

EXPOSE指令格式与用法示例如下:

1. # EXPOSE命令格式  
2. EXPOSE <port> [<port>/<protocol>...]  
3.   
4. # 使容器同时监听TCP与UDP的80端口  
5. EXPOSE 80/tcp  
6. EXPOSE 80/udp  

03 Dockerfile镜像构建

我们现在通过Dockerfile来构建一个nginx服务器,Dockerfile具体配置如下:

1. # 指定基础镜像  
2. FROM centos  
3.   
4. # 设置环境目录  
5. WORKDIR /  
6.   
7. # 安装nginx  
8. RUN yum install nginx -y  
9.   
10. # 容器对外暴露80端口  
11. EXPOSE 80  
12.   
13. # 启动nginx  
14. CMD ["/usr/sbin/nginx", "-g", "daemon off;"]  

接着通过该Dockerfile文件进行镜像构建,具体如下

最后我们启动容器,同时查看nginx服务是否能够访问,具体操作如下

至此我们Dockerfile的知识点就全部讲完了,大家有什么问题可以在下方留言讨论,最后如果喜欢不要忘了点赞、关注与转发哦!

--END--

@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。

相关文章推荐:

相关推荐

Python自动化脚本应用与示例(python办公自动化脚本)

Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作...

Python文件操作常用库高级应用教程

本文是在前面《Python文件操作常用库使用教程》的基础上,进一步学习Python文件操作库的高级应用。一、高级文件系统监控1.1watchdog库-实时文件系统监控安装与基本使用:...

Python办公自动化系列篇之六:文件系统与操作系统任务

作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...

14《Python 办公自动化教程》os 模块操作文件与文件夹

在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹/文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候Pyt...

python中os模块详解(python os.path模块)

os模块是Python标准库中的一个模块,它提供了与操作系统交互的方法。使用os模块可以方便地执行许多常见的系统任务,如文件和目录操作、进程管理、环境变量管理等。下面是os模块中一些常用的函数和方法:...

21-Python-文件操作(python文件的操作步骤)

在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件...

轻松玩转Python文件操作:移动、删除

哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。...

Python 初学者练习:删除文件和文件夹

在本教程中,你将学习如何在Python中删除文件和文件夹。使用os.remove()函数删除文件...

引人遐想,用 Python 获取你想要的“某个人”摄像头照片

仅用来学习,希望给你们有提供到学习上的作用。1.安装库需要安装python3.5以上版本,在官网下载即可。然后安装库opencv-python,安装方式为打开终端输入命令行。...

Python如何使用临时文件和目录(python目录下文件)

在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。使用标...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

Python 开发工程师必会的 5 个系统命令操作库

当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...

Python常用文件操作库使用详解(python文件操作选项)

Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...

11. 文件与IO操作(文件io和网络io)

本章深入探讨Go语言文件处理与IO操作的核心技术,结合高性能实践与安全规范,提供企业级解决方案。11.1文件读写11.1.1基础操作...

Python os模块的20个应用实例(python中 import os模块用法)

在Python中,...