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

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


一、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的指令。出发执行

四、总结

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

相关推荐

  1. Docker大学生系列Dokcerfile详解

    2024-06-08 17:14:04       11 阅读
  2. dockerDockerfile 指令详解

    2024-06-08 17:14:04       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 17:14:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 17:14:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 17:14:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 17:14:04       20 阅读

热门阅读

  1. Windows系统中配置 Redis 监听特定的 IP 地址

    2024-06-08 17:14:04       10 阅读
  2. Android adb pull base.apk 方法介绍

    2024-06-08 17:14:04       8 阅读
  3. 【VVC】类和编码树了解

    2024-06-08 17:14:04       6 阅读
  4. golang优雅代码【lock实现】

    2024-06-08 17:14:04       7 阅读
  5. 堆排序---C语言

    2024-06-08 17:14:04       10 阅读
  6. [AIGC] 自定义Spring Boot中BigDecimal的序列化方式

    2024-06-08 17:14:04       8 阅读
  7. Pinia的定义及使用

    2024-06-08 17:14:04       6 阅读
  8. 信奥之路(五)——顺序结构

    2024-06-08 17:14:04       6 阅读
  9. 【HarmonyOS】代码规范参考

    2024-06-08 17:14:04       8 阅读
  10. 力扣每日一题 6/5

    2024-06-08 17:14:04       9 阅读
  11. Ansible——setup模块

    2024-06-08 17:14:04       7 阅读