聊聊 Docker 和 Dockerfile

简介: 聊聊 Docker 和 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 在软件开发和部署中。

相关文章
|
2天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
121 75
|
1月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
763 12
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
25天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
48 9
|
1月前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
106 3
|
2月前
|
Docker 容器
docker中使用Dockerfile自动创建数据卷
【10月更文挑战第12天】
33 5
|
2月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
72 4
|
3月前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
558 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
3月前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
169 20
|
3月前
|
Docker 容器
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
|
4月前
|
Docker 容器
在Docker中,Dockerfile有哪些常见指令?
在Docker中,Dockerfile有哪些常见指令?