IT工程师都需要掌握的容器技术之Dockerfile
wptr33 2025-01-09 16:33 30 浏览
阅读本文约需要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管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。
相关文章推荐:
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
