当前位置: 首页 > news >正文

利用Dockerfile开发定制镜像实战.

Dockerfile的原理

dockerfile是一种文本格式的文件,用于描述如何构建Docker镜像。在Dockerfile中,我们可以定义基础镜像、安装依赖、添加文件等操作,最终生成一个可以直接运行的容器镜像。
Dockerfile的原理可以分为以下几个步骤:

  1. 选择基础镜像:Dockerfile中的第一条指令就是选择基础镜像,该镜像作为构建的基础。它可能是官方提供的基础镜像,也可以是其他第三方提供的。
  2. 执行指令:Dockerfile中包含一系列指令,用于在基础镜像上安装软件、配置环境变量、添加文件等操作。这些指令会被依次执行,每个指令都会生成一个新的镜像层。
  3. 创建镜像:在Dockerfile中所有指令执行完毕后,Docker引擎会自动将多个镜像层合并为单个镜像,并命名为名称和版本。
    由于镜像层是只读的,每次对镜像的修改都会生成新的镜像层,不会对原有镜像造成任何影响。因此,Dockerfile提供了一种非常方便和可移植的方式,用于构建和分享Docker镜像。

Docker指令语法详细解释和示例

  1. FROM
    FROM 是 Dockerfile 中的第一个指令,用于指定基础镜像名称以及其版本信息。一切都是从一个基础镜像开始构建的。FROM 接收一个参数,表示所使用的基础镜像名称。
    示例:
    FROM ubuntu:18.04
    #意思是以一个 Ubuntu 18.04 作为当前镜像的基础镜像构建。
  2. MAINTAINER
    MAINTAINER 指令用于指定镜像的维护者信息。这是一个可选项,一般也是我们不加的,因为这个用处不大。
    示例:
    MAINTAINER someone@example.com
  3. RUN
    RUN 指令用于在 Docker 容器中运行指定的命令。可以使用 RUN 运行各种命令,比如 apt-get 安装、pip 安装等等。最好将 apt-get 和 pip 安装命令放在同一行中,以免出现多个镜像层。
    示例:
    RUN apt-get update && apt-get install -y
    nginx
    php-fpm
    php-mysql
  4. USER
    USER 指令用于设置在容器中运行命令时的用户身份(用户名或用户 ID)。
    示例:
    USER someone
    #切换为某个用户
  5. ADD / COPY
    ADD 和 COPY 指令用于将 中的文件或目录复制到容器中的 。两者的细微区别在于,ADD 指令支持更多的功能,例如获取网络资源并自动解压缩压缩包,由此可见copy添加文件的体积会更小,所以日常使用会更多。
    示例:
    COPY ./app /app
    ADD ./app.tar.gz /
    日常工作常常以下指令组合在这里插入图片描述
  6. CMD
    CMD 指令用于在启动容器时执行指定的命令。一个 Dockerfile 文件只能包含一个 CMD 指令,该指令可以被覆盖(强制替换),只运行最后一条,或者docker run运行时候的参数覆盖,和run的区别是run是docker build 构建镜像阶段执行操作的一条指令,cmd是启动容器后调用,用于docker run阶段运行。
    示例:
    CMD [“nginx”, “-g”, “daemon off;”]
    #这里运行了一个 nginx 服务器
  7. ENTRYPOINT
    ENTRYPOINT 指令与 CMD 极为相似,但是它不会被覆盖,而是始终会运行。ENTRYPOINT 与 CMD 指令的一个重要区别是,每次运行容器时,都会将 CMD 参数附加到 ENTRYPOINT 参数上,比如如下图,如果需要更改nginx配置文件路径,在docker run时候指定路径即可。
    在这里插入图片描述
    示例:
    ENTRYPOINT [“ping”]
    CMD [“-c”, “5”, “localhost”]
    #运行时默认运行 ping localhost 命令,该命令会ping 5次localhost。
  8. ENV
    ENV 指令用于设置环境变量。它可以设置一个或多个键值对,这些键值对可以在容器运行时被使用。可以用 $key 格式来使用值。
    示例:
    ENV MY_NAME=“Alice”
    MY_EMAIL=“alice@example.com”
  9. EXPOSE
    EXPOSE 指令用于指定容器应该监听哪些网络端口。它不会创建端口映射,只是声明容器应该监听哪些端口。
    示例:
    EXPOSE 80/tcp
  10. WORKDIR
    WORKDIR 指令用于设置工作目录,相当于切换到该目录。一旦指定了一个工作目录,后续的指令都将在该目录下执行。
    示例:
    WORKDIR /app
  11. VOLUME
    VOLUME 指令用于在运行时创建挂载点(也称为数据卷)。数据卷可以是主机文件系统中的目录,也可以是其他容器中的目录,可以把docker中的数据实时挂载到本地的目录中,避免误删目录造成数据丢失。可以通过docker inspect [image] 查看容器的详细信息,找到mounts节点,可以找到本地的数据的挂在的目录。
    示例:
    VOLUME /app/logs

Dockerfile build 命令的用法

Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile 构建一个镜像。
Docker build常用的指令包括两个参数:
◆ -t 指定镜像的名字,
◆ -f 显示指定构建镜像的 Dockerfile 文件

构建镜像的原理

Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。当我们运行 docker build 命令时,Docker 会依据 Dockerfile 中的指令来构建镜像。
构建 Docker 镜像的主要步骤如下:

  1. 读取 Dockerfile 文件,解析其中的指令;
  2. 根据指令和 Dockerfile 中的内容创建一个新的容器;
  3. 在新的容器中执行指令,如安装软件等;
  4. 执行完所有指令后,将容器制作成镜像,保存到本地或远程仓库中。
    在整个构建过程中,每个指令都会生成一个新的临时容器,执行指令,然后把结果保存下来,作为下一步构建镜像的基础。这种机制使得 Dockerfile 可以精准、灵活地定义镜像的构建流程,而且可以高效地利用 Docker 中的资源,极大提升构建的速度和效率。
    在这里插入图片描述

编写Dockerfile的几条建议

  1. 单一职责
  2. 提供注释信息
  3. 保持容器最小化
  4. 合理选择基础镜像
  5. 最小化镜像层数
http://www.lryc.cn/news/38690.html

相关文章:

  • PyInstaller 将DLL文件打包进exe
  • 【JVM篇2】垃圾回收机制
  • LeetCode598. 范围求和 II(python)
  • 观察者模式与发布订阅模式
  • 磨金石教育摄影技能干货分享|烟花三月下扬州,是时候安排了!
  • Kafka 消费组位移
  • Python|数学|贪心|数组|动态规划|单选记录:实现保留3位有效数字(四舍六入五成双规则)|用Python来创造一个提示用户输入数字的乘法表|最小路径和
  • 【MySQL】MySQL的索引
  • 弱监督实例分割 Box-supervised Instance Segmentation with Level Set Evolution 论文笔记
  • Springboot是什么
  • LeetCode 134. 加油站(函数图像法 / 贪心)
  • 王道计算机组成原理课代表 - 考研计算机 第三章 存储系统 究极精华总结笔记
  • Flask-mock接口数据流程
  • springboot项目配置序列化,反序列化器
  • c++11 标准模板(STL)(std::unordered_map)(九)
  • Seay代码审计工具
  • 界面开发(4)--- PyQt5实现打开图像及视频播放功能
  • 核心系统国产平台迁移验证
  • 【数据结构之二叉树】——二叉树的概念及结构,特殊的二叉树和二叉树性质
  • Android学习之帧动画和视图动画
  • vue2和vue3的区别
  • 【你不知道的事】JavaScript 中用一种更先进的方式进行深拷贝:structuredClone
  • XE开发Linux应用(二)-Webservice
  • kubernetes实战与源码学习
  • CNCF x Alibaba云原生技术公开课 第八章 应用配置管理
  • YUV实践记录
  • 【题解】百度2020校招Web前端工程师笔试卷(第一批):单选题、多选题
  • 探索云原生技术之容器编排引擎-kubeadm安装kubernetes1.21.10(新版:针对高版本内核)
  • 2023广西自治区职业技能大赛“网络安全” 项目比赛任务书
  • Reactor模式