聊聊 Docker 和 Dockerfile

2023-11-10

目录

一、前言

二、了解Dockerfile

三、Dockerfile 指令

四、多阶段构建

五、Dockerfile 高级用法

六、小结

一、前言

对于开发人员来说,会Docker而不知道Dockerfile等于不会Docker,上一篇文章带大家学习了Docker的基本使用方法:《一文带你学会Docker》,今天带大家学习一下Dockerfile,帮助你快速上手并创建高效的 Docker 镜像。

二、了解Dockerfile

Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。它以指令的形式描述了如何构建镜像,从基础镜像开始逐步添加配置、文件和依赖,最终形成我们所需要的镜像。为我们提供了一种简单且可重复的方式来定义镜像构建过程。

三、Dockerfile 指令

  • FROM 指令: FROM 指令是 Dockerfile 的第一条指令,用于指定基础镜像。选择合适的基础镜像非常重要,因为它将直接影响镜像的大小和性能。我们还可以利用多阶段构建来减小镜像大小。
  • RUN 指令: RUN 指令用于在镜像构建过程中执行命令。通过 RUN,我们可以安装软件包、运行脚本以及配置环境。
  • COPY 和 ADD 指令: 这两个指令用于将本地文件复制到镜像中。区别在于 ADD 指令支持自动解压缩和远程 URL,但推荐使用 COPY 指令,因为它更明确和可预测。
  • CMD 和 ENTRYPOINT 指令: 这两个指令用于定义容器启动时要执行的命令。CMD 定义的命令可以被 docker run 命令行参数所覆盖,而 ENTRYPOINT 定义的命令会一直执行。

以下是一个简单的Dockerfile 示例:

# 使用 openjdk 镜像作为基础镜像
FROM openjdk:latest

# 设置工作目录
WORKDIR /app

# 复制 Java 项目的 JAR 文件到镜像中
COPY target/myapp.jar /app/

# 定义容器启动时执行的命令
CMD ["java", "-jar", "myapp.jar"]

在上面的示例中,我们使用 openjdk:latest 作为基础镜像,并将 Java 项目的 JAR 文件复制到镜像中。然后,通过 CMD 指令定义了容器启动时执行的命令,即运行 java -jar myapp.jar 启动 Java 应用程序。

四、多阶段构建

多阶段构建是一种优化 Docker 镜像大小的技巧,特别适用于构建 Java 项目等编译型语言的应用。在多阶段构建中,我们可以在一个 Dockerfile 中定义多个 FROM 指令,每个指令表示一个构建阶段。最终镜像只保留最后一个 FROM 指令所定义的阶段,其他中间产物都不会包含在最终镜像中,从而减小镜像的体积。

Dockerfile 示例:

# 第一阶段:构建 Java 项目
FROM maven:latest AS builder

WORKDIR /app

COPY pom.xml .
RUN mvn dependency:go-offline

COPY src/ /app/src/
RUN mvn package

# 第二阶段:运行 Java 项目
FROM openjdk:latest

WORKDIR /app

COPY --from=builder /app/target/myapp.jar /app/

CMD ["java", "-jar", "myapp.jar"]

在上面的示例中,我们使用了两个 FROM 指令:

FROM maven:latest AS builder 表示第一阶段构建 Java 项目,使用 Maven 镜像进行依赖安装和项目构建;

FROM openjdk:latest 表示第二阶段,使用 OpenJDK 镜像来运行 Java 项目。通过 COPY --from 指令,我们从第一阶段的镜像中复制构建好的 JAR 文件到第二阶段,从而减小了最终镜像的大小。

五、Dockerfile 高级用法

  • 使用 ARG 和 ENV: ARG 指令用于在构建过程中传递参数,而 ENV 指令用于设置环境变量。利用这些指令,我们可以更灵活地定制镜像的构建过程。
  • 使用 WORKDIR: WORKDIR 指令用于设置工作目录,即在容器内运行命令的默认目录。这样可以使 Dockerfile 更易读和维护。
  • 使用 VOLUME: VOLUME 指令用于在容器中创建挂载点,使得容器中的数据可以持久化保存在宿主机上。

Dockerfile 示例:

# 第一阶段:构建 Java 项目
FROM maven:latest AS builder

# 使用 ARG 指令传递构建参数
ARG APP_VERSION=1.0.0
ARG BUILD_ENV=production

# 设置工作目录
WORKDIR /app

# 复制 pom.xml 并安装项目依赖
COPY pom.xml .
RUN mvn dependency:go-offline

# 复制源代码并构建项目
COPY src/ /app/src/
RUN mvn package -DskipTests

# 第二阶段:运行 Java 项目
FROM openjdk:latest

# 使用 ENV 指令设置环境变量
ENV APP_PORT=8080
ENV BUILD_ENV=${BUILD_ENV}

# 使用 VOLUME 指令创建挂载点
VOLUME /app/logs

# 设置工作目录
WORKDIR /app

# 复制构建好的 JAR 文件到镜像中
COPY --from=builder /app/target/myapp-${APP_VERSION}.jar /app/

# 定义容器启动时执行的命令
CMD ["java", "-jar", "myapp-${APP_VERSION}.jar", "--port=${APP_PORT}", "--env=${BUILD_ENV}"]

在上面的示例中,我们首先使用 ARG 指令来定义构建参数 APP_VERSION 和 BUILD_ENV,并在 FROM maven:latest AS builder 阶段中使用 ARG 指令传递构建参数。

这样,在构建时可以通过 --build-arg 参数来传递具体的值,例如:

cssCopy code
docker build --build-arg APP_VERSION=2.0.0 --build-arg BUILD_ENV=staging -t my-java-app .

这样可以构建不同版本和不同环境的镜像。

同时,我们使用 VOLUME 指令创建了挂载点 /app/logs,使得容器中的日志文件可以持久化保存在宿主机上。

六、Docker 部署的低代码

JNPF快速开发平台是一款基于SpringBoot+Vue3的全栈开发平台,满足微服务、前后端分离架构,基于可视化流程建模、表单建模、报表建模工具,快速构建业务应用。平台可以本地化部署,也支持K8S部署。 免费体验地址:https://www.jnpfsoft.com/?csdn

除了上述功能,还配置了图表引擎、接口引擎、门户引擎、组织用户引擎等可视化功能引擎,基本实现页面UI的可视化搭建。内置有百种功能控件及使用模板,使得在拖拉拽的简单操作下,也能大限度满足用户个性化需求。

通过可视化拖拽的方式,传统模式下需要 2 周完成开发的应用,用JNPF只要2小时。用JNPF搭建应用,你只需要关注业务本身,数据存储、运行环境、服务器、网络安全等,平台为你全部搞定。

七、小结

Dockerfile 是构建 Docker 镜像的核心工具,它使得镜像构建过程变得简单、可重复和高效。通过本文的介绍,你已经了解了 Dockerfile 的基本语法和常用指令,以及一些最佳实践。随着你的实践和深入学习,相信你将能够创建出更加优秀的 Docker 镜像,并更好地应用 Docker 在软件开发和部署中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聊聊 Docker 和 Dockerfile 的相关文章

随机推荐

  • 下载、安装与使用 pysot

    本篇文章简要介绍了如何在windows环境下 使用anaconda进行pysot运行环境的部署以及使用 目录 1 下载仓库 2 设置环境 3 下载模型 4 运行 demo py 4 1 PYTHONPATH 4 2 Demo运行参数 pys
  • 岛屿类-网格类问题-DFS

    本文讲解200 岛屿数量问题 属于常见的岛屿类 网格类问题 本题使用DFS的思想 1 题目 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地
  • EXCEL-VBA:调用打开文件夹对话框,选择路径

    With Application FileDialog msoFileDialogFolderPicker InitialFileName ActiveSheet TextBox1 Value Title 请选择目录 If Show The
  • maven项目手动添加一个jar包

    对于一些工程需要一些手动添加的jar包 不只是有maven管理的 1 按规范来说 首先把jar包放入webapp web inf lib下 2 右击项目 build path configure build path add jars 3
  • 【Qt】错误:'connect' was not declared in this scope 解决方法

    这种错误主要出现在在非继承QObject的类中或者一般函数中使用connect导致 原因是connect是QObject的一个static方法 将connet替换为QObject connect即可
  • PyTorch同时读取两个数据集实现半监督学习

    PyTorch同时读取两个数据集实现半监督学习 文章目录 PyTorch同时读取两个数据集实现半监督学习 写在开头 修改记录 数据路径 TODO 方法一 通过对 getitem 的索引进行计算 按照比例关系选择对应数据集的数据 方法二 直接
  • VScode终止运行代码/程序/停止死循环

    我有时候在VScode运行代码进入死循环或者像下图爬虫遭到了反爬 但是又找不到像pycharm中的终止运行代码键 无奈之下只能将VScode关闭 反复的开关VScode非常浪费时间 且有可能偷偷占用CPU 非常不好 查阅后得知在终端中按Ct
  • kubernetes集群部署 详细操作步骤

    kubernetes集群部署 详细操作步骤 选择使用kubeadm这一工具来部署kubernetes集群 1 安装要求 本次预计部署具有一个master 两个node的k8s集群 在开始之前 部署Kubernetes集群机器需要满足以下几个
  • DVWA 之 XSS(DOM)

    目录 1 级别 Low 2 级别 Medium 3 级别 High 4 级别 Impossible XSS 简介 XSS Cross Site Script 全称跨站脚本攻击 为了与 CSS Cascading Style Sheet 有所
  • 开发一个具有分页功能的web表格组件

    效果图 代码 index html table thead tr th ID th tr thead table
  • Web经典BS快速开发框架,强大后台+简洁UI一体化开发工具

    本框架旨在为 NET开发人员提供一个Web后台快速开发框架 采用本框架 能够极大的提高项目开发效率 整个框架包括三个版本 net net core java 开发中 以上三个版本中 NET为初始版本 开发时间最长 是目前老客户使用的主要产品
  • Hudi数据湖-基于Flink、Spark湖仓一体、实时入湖保姆级教学

    目录 Hudi源码编译 Hudi扫盲 基于Spark shell集成Hudi 基于Spark Hive集成Hudi手动创建HIVE表 基于SparkSQL集成Hudi自动创建HIVE表 基于FlinkSQL集成Hudi 基于FlinkSQL
  • 八大排序比较(时间复杂度,空间复杂度,稳定性的比较)

    排序算法的稳定性 含义 假定在待排序的记录序列中 存在多个具有相同的关键字的记录 若经过排序 这些记录的相对次序保持不变 即在原序列中 r i r j 且r i 在r j 之前 而在排序后的序列中 r i 仍在r j 之前 则称这种排序算法
  • python 使用前馈神经网络处理IrIs数据集(BP)

    本文章包含以下内容 数据 lris数据集 模型 前馈神经网络 激活函数 Logistic 损失函数 交叉嫡损失 优化器 梯度下降法 评价指标 准确率 输出层使用了Softmax分类 通过使用前馈神经网络实现BP学习算法 进一步理解前馈神经网
  • Java基础 --- 注解 Annotation

    Java基础 注解 Annotation Java注解 Java自带的标准注解 自定义注解 Java注解 Java注解它提供了一种安全的类似注释的机制 用来将任何的信息或元数据 metadata 与程序元素 类 方法 成员变量等 进行关联
  • Pytest-UnitTest

    2023暑期学习 Pytest Pytest pytest是python的一种单元测试框架 与python自带的unittest测试框架类似 但是比unittest框架使用起来更简洁 效率更高 pip install pytest pyte
  • JavaScript的三大组成部分(收藏)

    JavaScript是一种属于网络的脚本语言 已经被广泛用于Web应用开发 常用来为网页添加各式各样的动态功能 为用户提供更流畅美观的浏览效果 通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的 各位小伙伴在进阶的时候总会
  • 放个手机在单位自动打卡_几步神奇操作让你的钉钉自动打卡

    这款叫做 FreeDing 的 Android 应用 是一个钉钉自动打卡工具 只需要把手机放在办公室 就能实现每天自动定时打卡了 Appinn 这是一个程序员一不爽就造轮子的故事 diy0504 同学所在公司打卡要求越来越严格 忘记打卡不准
  • 实用mysql命令

    1 显示表中所有列的详细信息 show full columns table name 2 查看服务器版本 show version 3 查看当前登录用户 select current user 4 显示表的详细信息 show table
  • 聊聊 Docker 和 Dockerfile

    目录 一 前言 二 了解Dockerfile 三 Dockerfile 指令 四 多阶段构建 五 Dockerfile 高级用法 六 小结 一 前言 对于开发人员来说 会Docker而不知道Dockerfile等于不会Docker 上一篇文