面向开发人员的 Dockerfile 最佳实践
2022 年 Docker 最佳实践。本文将详细介绍 Docker,以及如何编写最佳 Docker 文件来构建和部署应用程序
多年来,软件开发不断发展变化,这背后有其深刻的原因。无论规模大小,众多组织都发现了现代软件开发实践的价值,而云原生工具也为数字化转型创造了新的规范。这种发展也包括容器的出现,它为采用微服务架构的组织提供了一种打包软件的手段。
在容器成为现代应用程序堆栈的主要组件之前,开发人员找到了不同的方法来抽象和隔离代码。这些方法最初是简单的脚本,后来演变成更强大的解决方案。现在,容器已成为大多数开发人员工具包的基础组件。Docker 目前是大规模打包和部署容器化应用程序的事实标准。
本文将详细介绍 Docker,以及如何编写最佳 Dockerfile 来构建和部署应用程序。
Docker
由于深入研究需要循序渐进,我们将花一些时间来描述 Docker。随着虚拟化和容器技术的普及,软件开发人员开始寻找加快软件开发流程的方法。而这正是Docker大放异彩的地方。
Docker 是一种轻量级虚拟化技术,允许您使用容器构建、发布和运行应用程序。每个应用程序都被打包为一个单独的容器,这意味着它拥有自己的内核,并且可以独立于其他容器运行。因此,Docker 可以帮助开发人员打包应用程序并简化软件开发流程。
本文将解释 Docker 是什么、它对软件开发者有何用处、如何为应用程序创建 Dockerfile,以及如何在不同环境中有效地使用它。现在,开发者可以创建自己的自定义环境,而无需过多操心,也不会破坏任何功能。这种自由意味着我们可以以任何适合项目的方式编写代码、打包并发布。
Dockerfile
使用容器部署应用程序时,最重要的事情之一就是正确处理 Dockerfile。Dockerfile 负责告诉 Docker 如何构建和部署容器。如果 Dockerfile 编写不当或未根据您的需求进行优化,则会严重影响您启动和运行新版本应用程序的速度和效率。
在本文中,我们将探讨一些编写高效 Dockerfile 的最佳实践。这些技巧将帮助您简化Docker 的部署流程,并确保未来的维护工作尽可能简单。由于 Docker(以及其他类似工具)的使用方法多种多样,我们不会详细介绍在何种情况下应使用哪些命令。相反,请将这些要点视为有助于优化 Dockerfile 的通用指南。
Dockerfile 是帮助您在Docker 容器中部署代码的主要文件。有了最佳实践指南,创建和使用 Dockerfile 将变得更加轻松和精简。
Dockerfile 最佳实践
Dockerfile 看似简单,但从开发者的角度来看却极其复杂。它们必须提供足够详细的文档,以便任何人都可以运行它们并最终获得一个可以运行的容器。全面记录开发流程也是最佳实践,尤其是在您的团队(或组织)有多名开发人员同时编写代码的情况下。
以下是一些需要牢记的最佳做法
- 不要使用 Dockerfile 作为构建脚本:
Dockerfile 是一组可用于创建自定义镜像的指令。它不应该用作构建脚本,因为这会使构建过程不必要地冗长。当您必须在 Dockerfile 中编译或打包软件时,应该使用 ADD 指令。这会在镜像开始运行命令之前将编译所需的文件复制到镜像中。这样可以保持 Dockerfile 的简洁性,并将编译所需的任何依赖项与 Dockerfile 分开管理。
- 使用 ENV 定义环境变量:
设置环境变量是 Dockerfile 的最佳实践。虽然这看起来像是一个小细节,但定义环境变量可以提高容器的可移植性。这是因为环境变量是唯一会在每次执行之间发生变化的变量。需要注意的是,Docker 容器是软件应用程序的抽象,这意味着如果不更改主机系统的操作系统,就无法更改容器内 Linux 操作系统的任何内容。如果某个变量在容器内外都必须不同,则必须使用 ENV 来定义它。
- 将您的 Dockerfile 提交到存储库:
Dockerfile 的最佳实践之一是将其提交到你的仓库。这样你以后可以轻松快速地引用它,而无需记住你使用过的所有命令及其顺序。
- 注意你的基础图像及其大小:
创建 Dockerfile 时需要考虑的最重要的事情之一是所使用的基础镜像。如果包含大量无关代码,Docker 镜像的大小就会增加。这会导致容器启动速度变慢,甚至更糟的是,导致容器根本无法启动。避免这种情况的最佳方法是仔细考虑所使用的软件包和脚本。如果觉得没有必要将其包含在基础镜像中,请尝试在容器启动时安装它。这将节省容器的空间,使其运行得更快、更高效。
- 不要泄露秘密:
切勿共享或复制 Dockerfile 中的应用程序凭据或任何敏感信息。相反,请使用 .dockerignore 文件来防止复制可能包含敏感信息的文件。.dockerignore 文件的作用相当于 .gitignore 文件,它允许您指定希望构建过程忽略的文件。
- 注意哪些端口是暴露的:
在设计 Dockerfile 时,请确保您知道哪些端口是公开的。默认情况下,Docker 会将所有容器公开到一系列随机的内部端口。这很成问题,因为它可能会将关键服务暴露给外部世界,使其容易受到攻击。如果您使用的服务必须公开到公共互联网,则必须在 Dockerfile 中创建一个条目。这可以通过在 Dockerfile 中添加“EXPOSE”来实现。
FROM node:14-alpine AS development
ENV NODE_ENV development
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3002
CMD [ "node", "app.js" ]
FROM node:14-alpine AS development
:来自基础镜像节点,版本 14-alpine 变体。我们本质上使用 Node:14-alpine 作为镜像的模板。
ENV NODE_ENV development
:NODE_ENV 是 Node 向正在运行的脚本公开的系统环境变量。它通常用于确定开发环境和生产环境的行为。这里我们将其设置为开发环境。
WORKDIR /app
:接下来,我们将容器中的工作目录设置为 /app。我们提到,名为 app 的目录将用于保存我们的项目(文件和所有相关内容)。
COPY package.json
.:我们正在复制我们的 package.json 文件以了解依赖关系。
RUN npm install
:此命令安装我们的 package.json 文件中提到的所有依赖项。
COPY . .
:我们将当前工作目录中的所有内容复制到 Docker 镜像中。
EXPOSE 3002
:我们指定公开端口 3002。
CMD [“node”, “app.js”]
:我们指定使用命令“node app.js”运行应用程序。
最后要记住的最佳实践是,Dockerfile 应尽可能简洁——正如其初衷。因此,不要试图增加不必要的复杂性。你应该让它足够简单,以便其他开发人员无需任何帮助就能轻松理解和执行。
结论
Docker 拥有庞大的社区,并将在云原生生态中继续蓬勃发展,它为企业在云原生之旅中取得成功提供了诸多优势。此外,Docker 对开发者来说是一个福音,每个组织都希望采用 DevOps 最佳实践。我们都在继续使用 Docker 通过容器构建和交付软件。因此,了解如何创建 Dockerfile 变得至关重要。希望本文能帮助您充分了解如何创建符合最佳实践的 Dockerfile。
接下来是什么?快来学习这个简单的 Dockerizing 你的 Node.js 应用程序教程,了解 Dockerfile 的实际工作原理,并使用Harness CD进行测试。下载免费试用版。
文章来源:https://dev.to/pavanbelagatti/dockerfile-best-practices-for-developers-mh2