首页 > 其他分享 >Docker大学生看了都会系列(7、Dokcerfile详解)

Docker大学生看了都会系列(7、Dokcerfile详解)

时间:2024-06-08 10:29:04浏览次数:8  
标签:RUN Dokcerfile 详解 构建 指令 镜像 Docker Dockerfile

系列文章目录
第一章 Docker介绍
第二章 2.1 Mac通过Homebrew安装Docker
第二章 2.2 CentOS安装Docker
第三章 Docker常用命令
第四章 常用命令实战
第五章 Docker镜像详解
第六章 Docker容器数据卷
第七章 Dockerfile详解

文章目录


一、Dockerfile基本介绍

1.1 什么是Dockerfile

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。

1.2 Dockerfile的作用

在DockerHub中官方提供很多镜像已经能满足我们的大部分服务了,但是实际开发自己的应用服务,需要用到的服务各不相同,自定义自己的镜像,可以满足实际商业化需求。

1.3 Dockerfile的构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库等)

二、Dockerfile编写规则

2.1 单一职责

一个容器就是一个进程,不同应用场景应拆分成多个容器,每个容器负责单一业务进程。

2.2 编写注释信息

以#开头编写注释信息,简明扼要说明作用,方便后续阅读,扩展

2.3 保持容器最小化

避免安装无用的软件包,比如一个CentOS镜像并不需要vim软件

2.4 合理选择基础镜像

容器的核心是应用,因此只要基础镜像能够满足应用的运行环境即可

2.5 使用 .dockerignore 文件

使用.dockerignore文件允许我们在构建时,忽略一些不需要参与构建的文件,从而提升构建效率。更多,请参阅 .dockerignore 文件

2.6 尽量使用构建缓存

Docker 构建过程中,每一条 Dockerfile 指令都会提交为一个镜像层,下一条指令都是基于上一条指令构建的。如果构建时发现要构建的镜像层的父镜像层已经存在,并且下一条命令使用了相同的指令,即可命中构建缓存。
简单的来说就是把可服用的命令放在最前面加载,经常变动的放在最后。

2.7 正确设置时区

DockerHub 拉取的官方操作系统镜像大多数都是 UTC 时间(世界标准时间)
想要在容器中使用中国区标准时间(东八区)使用如下:

2.7.1 Ubuntu 和Debian 系统

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" >> /etc/timezone

2.7.2 CentOS系统

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2.8 使用国内软件源加快镜像构建速度

在容器构建目录创建文件 *.repo,加速软件源下载
这部分可参考国内阿里云、腾讯云、网易云等
参考:阿里云RepoForge镜像下载页
然后在Dockerfile 中添加如下指令:

COPY CentOS-7.repo /etc/yum.repos.d/CentOS-7.repo

2.9 尽量减少层数

在构建镜像时尽可能地减少 Dockerfile 指令行数。比如在CentOS中安装git应该这么写

RUN apt-get update && apt-get install -y git

而不应该这么写

RUN apt-get update
RUN apt-get install -y git

2.10 对多行参数进行排序

只要有可能,通过按字母数字排序多行参数来简化以后的更改。这有助于避免重复包并使列表更容易更新。这也使 PR 更容易阅读和审查。在反斜杠\ 前添加一个空格也有帮助。示例如下:

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

2.11 使用多阶段构建

多阶段构建是一种构建Docker镜像的高效方式,可以减少镜像大小并提高构建速度。

三、Dockerfile的常用指令

指令备注
FROM指定基础镜像
LABEL附加到Image之上的元数据,键值格式
RUN镜像构建的时候需要执行的命令
CMD类似于 RUN 指令,指定默认命令,用于运行程序(只有最后一个会生效,可被替代)
EXPOSE对外开放的端口
ENV设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
ADD添加本地或远程文件和目录,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源
COPY复制指令,将文件拷贝到镜像中,COPY指令更加透明,仅支持本地文件向容器拷贝
VOLUME设置卷,挂载的主机目录
USER用于指定执行后续命令的用户和用户组
WORKDIR工作目录,为RUN、CMD、ENTRYPOINT、COPY、ADD等指令设定工作目录
ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,会追加命令
ONBUILD当构建一个被继承Dokcerfile,就会运行ONBUILD的指令。出发执行

四、总结

今天周五(写完这篇的时候是五晚上),又是元气满满的一天 ヾ(◍°∇°◍)ノ゙

标签:RUN,Dokcerfile,详解,构建,指令,镜像,Docker,Dockerfile
From: https://blog.csdn.net/donkor_/article/details/139519448

相关文章

  • 基于cloudflare workers自建docker镜像
    缘由因为近期国内镜像站点的变动,自建docker镜像也提上了日程。顺便发现了Hammal这个优秀的项目。Hammal是运行于cloudflareworkers上的Docker镜像加速工具,用于解决获取Docker官方镜像速度缓慢以及完全无法获取k8s.gcr.io上镜像的问题。在这里感谢如下两个项目tomwei......
  • 【产品经理修炼之道】-详解资金路由系统设计
    将路由概念引入信贷领域,实现端到端不同路径的资金分发策略,其中有效的设计能够对互联网金融带来帮助。本文详细介绍了资金路由的概念与详细的系统设计思路,从业务流程的基本图解到前端展示实例,为资金路由系统设计提供了有效参考,适合关注互联网金融产品的小伙伴阅读。高端的系统......
  • C语言详解(动态内存管理)1
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • const详解
    关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。但是,可以通过取地址进行修改。 将const在指针前进行修饰,那么就修饰指针所指向的变量。但是指针变量可以被修改。  将const在指针后进行修饰,那么就修饰指针变量本身。但是指针指向的......
  • 网络原理-计算机网络详解-网线传递数字信号的原理
    网络原理-计算机网络详解-网线传递数字信号的原理家用的网线:传递的数字信号,原理是:(1)和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电器规则。(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。(3)网......
  • 覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 详解
    2000年一篇论文CoverageofKnownSpaces:TheBoustrophedonCellularDecomposition横空出世,解决了很多计算机和机器人领域的覆盖路径问题,今天我来详细解读这个算法。TheBoustrophedonCellularDecomposition算法详解这篇论文标题为"CoveragePathPlanning:TheB......
  • 解决Docker遇到error NU1301: Unable to load the service index for source https://
    解决Docker容器内无法通过HTTPS访问外部网络的问题在使用Docker构建.NET项目时,有时会遇到无法通过HTTPS访问外部网络的问题,导致dotnetrestore命令无法从NuGet源下载依赖项。本文将介绍一种通过修改Docker配置文件config.json来解决该问题的方法。问题描述在......
  • atcoder ABC 353-A题详解
    atcoderABC353-A题详解ProblemStatementThereareNbuildingsalignedinarow.Thei-thbuildingfromthelefthasaheightofHi.Determineifthereisabuildingtallerthanthefirstonefromtheleft.Ifsuchabuildingexists,findtheposition......
  • 下一代AI PC旗舰平台!英特尔全新架构Lunar Lake详解
    在正在召开的2024 ComputeX上,英特尔发布了全新的处理器架构Lunar Lake,这是继去年9月正式公布Meteor Lake架构后,不到9个月的时间里再一次公布的全新架构。本次的Lunar Lake依旧是主要面向移动端,号称为“下一代AIPC的旗舰平台”,CPU、GPU与NPU都有不同幅度的性能提升,并且在能效......
  • 【Git】Git 的基本操作 -- 详解
    一、创建Git本地仓库要提前说的是,仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制,就必须先创建一个仓库出来。创建⼀个Git本地仓库对应的命令为gitinit,注意命令要在文件目录下执行,例如:我们发现,当前目录下多了一个.git的隐藏文件,.git目录是Git来......