学习docker第五弹-----高级篇start-Dockerfile

docker目录

  • [1 Dockerfile是什么](#1 Dockerfile是什么)
  • [2 Dockerfile能干嘛](#2 Dockerfile能干嘛)
  • [3 如何书写Dockerfile](#3 如何书写Dockerfile)
    • [3.1 Dockerfile构建过程解析](#3.1 Dockerfile构建过程解析)
    • [3.2 小总结](#3.2 小总结)
    • [3.3 Dockerfile的基本知识](#3.3 Dockerfile的基本知识)
    • [3.5 保留字](#3.5 保留字)
  • [4 后记](#4 后记)

1 Dockerfile是什么

Dockerfile顾名思义就是跟docker有关的文件,官方一点就是用于构建docker镜像的文本文件,是由指令和参数组成的脚本。

tips:Dockerfile的第一个字母要大写,不要问我为什么?比如张三就是叫张三。

Dockerfile官网链接给到大家啦,自行按需查看捏~
https://docs.docker.com/reference/dockerfile/

2 Dockerfile能干嘛

我们之前了解过,相对于传统的虚拟机来说,docker的速度能够达到秒级,是因为docker的镜像都是十分基础的,里面的内核都是必须的 ,不必要的东西都需要后天的去增加功能。比如基础的ubuntu是没有vim、ifconfig的,这就需要我们手动操作,那不难理解,随着我们需求的增加,可能不断需要新的增加内容,因为我们需求的不断变化,使得我们重复安装内容的操作逐渐麻烦,所以Dockerfile应运而生

我的理解是Dockerfile能够批量进行操作,运行命令和参数,便于我们创建所需的镜像。

3 如何书写Dockerfile

构建三部曲:编写Dockerfile------> docker build构建镜像--------> docker run

3.1 Dockerfile构建过程解析

Docker执行Dockerfile的大致流程

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

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

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

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

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

3.2 小总结

应用软件 的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,Dockerfile是软件的原材料,Docker镜像是软件的交付产品,Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例。

3.3 Dockerfile的基本知识

1 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数;

2 指令按照从上到下,顺序执行;

3 #表示注释;

4 每条指令都会创建一个新的镜像层并对镜像进行提交。

是不是看到这里就想,啥是保留字啊,我刚学的时候也一头雾水了。

3.5 保留字

注意,上文提到过,保留字都是大写字母且至少跟随一个参数

FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM,类似与基类或者说父类

MAINTAINER

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

RUN 有两种方式

RUN yum -y install vim --------相当于shell命令

RUN ["可执行文件", "参数1", ...] -------------exec格式

我们用shell命令多一点,可以发现它就是RUN加上我们的Linux命令,更加适合中国宝宝的学习方式,更好地迁移学习。
RUN是在 docker build 时运行的

EXPOSE

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

bash 复制代码
#暴露80端口
EXPOSE 80 

WORKDIR

指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

ENV

用来在构建镜像过程中设置环境变量

USER

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

VOLUME

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

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

CMD

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

CMD指令的格式和 RUN 类似,也是两种格式:

1 shell 格式: CMD <命令>

2 exec格式: CMD["可执行文件","参数1","参数2"...]

3 参数列表格式:CMD["参数1","参数2"...],在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数

注意:

1 Dockerfile中可以有多个 CMD 指令,但只有最后一个生效,CMD会被 docker run 之后的参数替换

2 CMDRUN的区别:CMD是在docker run时运行;RUN是在docker build时运行

ENTRYPOINT

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

ENTRYPOINT 可以和 CMD一起使用,一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。
就是说,当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令,他们的组合会变成<ENTRYPOINT> "<CMD>"
优点:

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

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

4 后记

下一篇讲一下Dockerfile的案例,记得来看啊~

BB啊 ,如果本文档对您有一点点用的话,记得给美丽好学的我点个大大的赞,谢谢BB~

今天带了大圈的耳环尊嘟很好看,很开心,素颜也好看,嘻嘻!愿我们都有一个好心情

相关推荐
知识分享小能手2 分钟前
Vue3 学习教程,从入门到精通,Vue 3 表单控件绑定详解与案例(7)
前端·javascript·vue.js·学习·前端框架·vue3·anti-design-vue
西京刀客9 分钟前
构建 Go 可执行文件镜像 | 探索轻量级 Docker 基础镜像(我应该选择哪个 Docker 镜像?)
开发语言·docker·golang
0XIX019 分钟前
omniparser v2 本地部署及制作docker镜像(20250715)
运维·docker·容器·omniparser-v2
amazinging23 分钟前
北京-4年功能测试2年空窗-报培训班学测开-第五十天
python·学习·面试
没有羊的王K36 分钟前
SSM框架学习DI入门——day2
java·spring boot·学习
公子绝37 分钟前
JAVA学习笔记 使用notepad++开发JAVA-003
java·学习·notepad++·java开发环境
本杰明1521 小时前
2025/7/14——java学习总结
java·开发语言·学习
LGGGGGQ4 小时前
嵌入式学习-PyTorch(4)-day21
学习
潘yi.4 小时前
Kubernetes高级调度1
云原生·容器·kubernetes
艾莉丝努力练剑5 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表