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

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

文章目录

  • 一、Dockerfile基本介绍
    • 1.1 什么是Dockerfile
    • 1.2 Dockerfile的作用
    • 1.3 Dockerfile的构建步骤
  • 二、Dockerfile编写规则
    • 2.1 单一职责
    • 2.2 编写注释信息
    • 2.3 保持容器最小化
    • 2.4 合理选择基础镜像
    • 2.5 使用 .dockerignore 文件
    • 2.6 尽量使用构建缓存
    • 2.7 正确设置时区
      • 2.7.1 Ubuntu 和Debian 系统
      • 2.7.2 CentOS系统
    • 2.8 使用国内软件源加快镜像构建速度
    • 2.9 尽量减少层数
    • 2.10 对多行参数进行排序
    • 2.11 使用多阶段构建
  • 三、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的指令。出发执行

四、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图形化红队行动辅助平台Viper使用记录

图形化红队行动辅助平台Viper使用记录 简介 Viper(炫彩蛇)是一款图形化内网渗透工具,将内网渗透过程中常用的战术及技术进行模块化及武器化. Viper(炫彩蛇)集成杀软绕过,内网隧道,文件管理,命令行等基础功能. Viper(炫彩蛇)当前已集成70个模块,覆盖初始访问/持久化/权限提升/…

Python 中的字符串、列表、元组和字典数据类型的特点和使用场景

字符串(str)是一种不可变的序列类型,由字符组成。它的特点是: 可以使用单引号或双引号来定义字符串。字符串中的字符是按照索引进行访问的,索引从0开始。字符串可以进行切片操作,获取部分子串。字符串可以…

【数据结构】初识数据结构之复杂度与链表

【数据结构】初识数据结构之复杂度与链表 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【数据结构】初识数据结构之复杂度与链表前言一.数据结构和算法1.1数据结构1.2算法1.3数据结构和算法的重要性 二.时间与空间…

【FPGA】arm数据总线和axi数据总线有什么异同点?

ARM数据总线和AXI数据总线在概念和应用上有一些异同点: 相同点 功能目的:两者都是用于处理器与外部设备或内存之间传输数据的通道。设计原则:它们都遵循一些设计原则,以确保数据传输的可靠性和效率。 异同点 架构级别&#xff…

Elasticsearch 认证模拟题 - 13

一、题目 集群中有索引 task3,用 oa、OA、Oa、oA 查询结构是 4 条,使用 dingding 的查询结果是 1 条。通过 reindex 索引 task3 为 task3_new,能够使 task3_new 满足以下查询条件。 使用 oa、OA、Oa、oA、0A、dingding 查询都能够返回 6 条…

【纯血鸿蒙】——自适应布局如何实现?

界面级一多能力有 2 类: 自适应布局: 略微调整界面结构 响应式布局:比较大的界面调整 本文章先主要讲解自适应布局,响应式布局再后面文章再细讲。话不多说,开始了。 自适应布局 针对常见的开发场景,方舟开发框架提…

React Native 快速Demo(1)

为了快速实现一个项目雏型(prototype)demo并提交给他们确认,可以按照以下步骤进行: 1. 环境设置 1.1 安装开发工具 安装Node.js和npm:用于管理项目依赖。 sudo apt install nodejs sudo apt install npm安装React Na…

QT系列教程(10) QTextEdit学习

简介 QTextEdit是文本编辑器,支持富文本功能。接下来我们创建一个Qt Application 应用,然后在ui中添加一个QTextEdit插件。 运行程序后,可以在QTextEdit中输入任何文字也包括富文本。 文本块 我们在MainWindow的ui文件中添加了textedit插件…

24年江苏省教资认定报名照片要求

24年江苏省教资认定报名照片要求,速速查收!

Python代码——压缩整个文件夹

使用 Python 的 zipfile 模块来创建一个压缩文件夹。 下面是一个示例代码,展示了如何将一个文件夹中的所有文件和子文件夹压缩成一个 ZIP 文件: import os import zipfiledef zip_folder(folder_path, output_path):# 创建一个 ZipFile 对象&#xff0…

蓝屏绿屏黑屏?别急,有它们仨【送源码】

使用Windows系统的电脑时,可能会碰到各种问题,导致系统无法正常使用。 这些问题都有一个统一的专业叫法就是bug! 系统一旦出现bug,最明显的特点就是, ①电脑蓝屏 电脑蓝屏是最经典的,从XP时代一直延续到…

STM32项目分享:智能台灯系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

Anaconda软件:安装、管理python相关包

Anaconda的作用 一个python环境中需要有一个解释器, 和一个包集合. 解释器: 根据python的版本大概分为2和3. python2和3之间无法互相兼容, 也就是说用python2语法写出来的脚本不一定能在python3的解释器中运行. 包集合:包含了自带的包和第三方包, 第三…

泛微开发修炼之旅--12ecology工作流常用实用性查询语句源码汇总(二)

文章链接:泛微开发修炼之旅--12ecology工作流常用实用性查询语句源码汇总(二)

搭建mysql主从服务

搭建mysql主从服务 [!TIP] 基于docker和mysql 8搭建主从服务,一主二从的结构,并且把数据文件放置在master_slave_mysql 文件夹下 首先规划端口,master:3306,slave_one:3307,slave_two&#xff1…

Elasticsearch 认证模拟题 - 11

一、题目 编写一个名为 a_data_stream 数据流满足以下请求: 数据流索引主分片数为 1,副本为 2数据流索引指定相应的 mapping ,二个字段为 keyword 类型,一个字段为 text 类型并指定分词器为 standard。 按照上述要求建立数据流…

【Android面试八股文】说一说synchronized在JDK1.6之后做了哪些优化?

文章目录 说一说synchronized在JDK1.6之后做了哪些优化?一、为什么加上`synchronized`关键字就能实现锁,它的原理是怎么回事呢?1.1 字节码查看synchronized的实现1.2 为什么Java6之前的synchronized效率很低?1.3 Java6对synchronized的优化二、Java对象头2.1 Java对象头简介…

图文详解Windows系统下搭建mysql开发环境——mysql Community 8 和 navicat Premium 17 的安装和使用

在正式开始学习使用MySQL之前,我们有必要先搭建一个良好的开发环境,让我们的学习和工作效率事半功倍。 本文涉及到的软件百度云盘:链接:https://pan.baidu.com/s/1jj_YajEv8adeEjMrXLhOTQ?pwd1023 提取码:1023 目录 …

Java Web学习笔记22——前端工程化

实际的前端开发: 前端工程化:是指在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。 环境准备: vue-cli: 介绍:vue-cli是Vue官方提供的一个脚手架,用于…

[汇总] CentOS中查询端口终止进程的指令

👉原文阅读 💡章前导言 由于搭建服务器过程中,经常需要查询端口占用进程,并将进程终止以释放端口,所以将CentOS中相关的操作在这里进行一下汇总,方便以后查询使用,下文端口有关的操作皆以8080为…