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

系列文章目录
第一章 Docker介绍
第二章 2.1 Mac通过Homebrew安装Docker
第二章 2.2 CentOS安装Docker
第三章 Docker常用命令
第四章 常用命令实战
第五章 Docker镜像详解
第六章 Docker容器数据卷
第七章 Dockerfile详解
第八章 Dokcerfile部署go项目
第九章 Docker使用Buildx构建不同CPU架构镜像
第十章 Docker网络
第十一章 Docker-Compose用法



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

四、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值