多年来,应用程序和工具变得越来越复杂,以满足人们不断变化的需求和期望。但这可能会导致代码兼容性和远程访问的问题。例如,一个在Windows上正常运行的代码库在安装到Linux上时可能会出现兼容性错误。
幸运的是,Docker来拯救我们。但你可能会想——什么是Docker,它是如何帮助的?你将在本教程中了解这一切及更多内容。
但在我们开始之前,这里有一些先决条件:
-
了解Linux命令
-
了解终端使用
-
了解Node.js和Express.js
目录
什么是 Docker?
Docker 是一个开源工具,可以让软件在任何地方以一致的方式运行。它通过将您的应用程序及其所需的一切(如库和设置)放入容器中(稍后将详细讨论)来实现这一点。
将容器视为一个盒子:它包含您的应用程序及其所有部分,因此它在您的笔记本电脑、服务器或云中完全相同。Docker 通过确保一切以可靠和可移植的方式打包在一起,帮助开发人员避免“在我的机器上可以运行”的问题。
Docker 由 Solomon Hykes 在 2013 年创建。多年来,它已发展成涵盖各种工具的工具。它已成为改善应用程序部署和网络处理流程的首选工具。
在继续之前,让我们先了解一些在本教程中会遇到的关键术语:
Docker 引擎
Docker引擎,顾名思义,是Docker应用程序的核心。它包括客户端和服务器组件。在我们的情况下,Docker客户端是命令行界面工具或Docker终端,我们将使用它发送相关命令以执行项目。Docker服务器,通常称为守护进程,是负责运行各种Docker镜像和容器的服务器。
Docker镜像
Docker镜像是可执行软件和系统的预制模板。Docker提供了各种镜像,从操作系统模板到服务器模板、软件模板等等。您可以在Docker Hub注册表中找到这些镜像。
您还可以构建特定镜像,并将其托管在Docker Hub上的公共或私有注册表中。
Docker容器
Docker容器是在生成的模板上构建的可执行紧凑实例,即Docker镜像。它们是轻量级、可移植的软件包,包括运行软件所需的一切内容——代码、运行时、库和系统工具。容器确保应用程序在任何环境下都能一致运行。
使用Docker的好处
以下是作为后端开发人员使用Docker的一些好处:
-
Docker是创建应用程序开发稳固的DevOps文化的重要工具,因为它澄清了开发和运维团队的职能。
-
它也相当灵活,允许轻松部署微服务和分布式单体后端应用程序。
-
它还通过一次性移植应用程序及其必要的依赖项,最小化了安装过程中因依赖配置错误而导致的错误。
接下来,我们将深入探讨如何将 Node.JS Express 应用程序 Docker 化。但在此之前,您需要在计算机上安装 Docker。如果您已经安装了,可以跳过此步骤。
如何安装 Docker
Docker 是一个跨平台工具,可以在所有流行的操作系统(Windows、Mac OS 和 Linux 发行版)上安装。在本教程中,我将仅重点介绍如何在 Windows 上设置 Docker。
如果您当前使用的操作系统不是 Windows,您可以通过遵循 Docker 文档中的步骤 这里轻松设置 Docker。
对于 Windows 用户,确保您的 PC 满足最低规格是至关重要的,否则安装将不会成功。最低要求如下:
-
Windows 操作系统版本不低于 Windows 10 家庭版
-
已安装 WSL-2 或已启用 Hypervisor 的个人电脑。
有了这些,让我们开始下载 Docker 安装程序。您可以从这里下载最新的 Docker 安装程序。下载后运行该软件并接受条款和条件。成功完成后,启动该应用程序。您应该看到以下内容:
要确认您已成功安装该应用程序,请转到命令提示符终端并运行Docker --version
。如果安装成功,您应该看到您安装的 Docker 引擎工具的确切版本。
现在我们将继续进行正式项目。
演示项目:如何将 Node.js 应用程序容器化
在这一部分,我们将使用最少依赖项来对基于 Node.js 的简单后端服务进行容器化。这将向您展示如何使用一种称为Dockerfile的 Docker 应用程序容器化技术对应用程序进行容器化和移植。请记住,如果您有更复杂的应用程序,最好使用Docker compose YAML 工具。
首先,我们将设置示例的 Node.js 应用程序。我将在本文中提供完整的代码设置。但首先,让我们了解一下什么是 dockerfile。
什么是 Dockerfile?
基本上,Dockerfile 是一个模板系统,允许用户输入命令,这些命令在执行时可以生成应用程序的功能镜像。然后,这个镜像可以转换为一个容器。
以下是 Dockerfile 基本结构中包含的一些命令:
-
CMD
:如果在容器启动时未指定命令,则设置默认要运行的命令。可以通过在运行容器时提供命令来覆盖它(docker run ...
)。 -
ENTRYPOINT
:指定容器启动时始终运行的主要命令。它不容易被覆盖,但可以附加参数。
注意,CMD
和ENTRYPOINT
都指定了容器启动时应该运行的命令或进程。但它们的使用方式不同,目的也各异。使用CMD
进行可以被覆盖的默认行为。使用ENTRYPOINT
定义容器主要目的的固定命令。 -
FROM
:这通常是Dockerfile中的开头语句。此命令获取一个基础镜像,为构建所需应用程序的镜像奠定基础。例如,在我们的应用程序中,Node.js应用程序的基础镜像是安装了基线Node.js引擎的。 -
WORKDIR
:此语法定义活动工作目录,应用程序文件将驻留在定义的容器内。如果尚不存在,将创建一个自动文件夹。 -
COPY
: 此语法用于确保从代码基础项目文件创建Docker镜像所需的文件被复制到新创建的Docker容器中。这些文件的目录被仔细标出。 -
RUN
: 此语法指定您希望在完成应用程序容器化之前运行的脚本。 -
ENV
: 此语法用于突出显示在运行应用程序过程中将被调用的环境变量和秘密。 -
EXPOSE
: 此语法映射应用程序用于与外部互联网通信的浏览端口。例如,EXPOSE: 3000
将应用程序的Web界面映射到localhost:3000
。
深入了解Docker,让我们快速浏览一些在本教程中将使用的关键Docker命令:
-
Docker ps
:此命令列出Docker终端上所有正在运行的容器。 -
Docker run
:此命令执行Docker镜像以触发容器的一个实例。 -
Docker build
:此命令基于Docker文件生成服务或应用程序的镜像。 -
Docker rm
:此命令可用于使用图像标识详细信息删除图像。
如何将应用程序容器化
现在我们可以开始将我们的简单 Node/Express 应用程序容器化。要跟随教程,您可以从 这里 获取基础代码。
在本地测试时,它返回一个 CRUD API,您可以在执行时创建、获取、更新和删除产品。我们将打包该应用程序,以便使用我们的 Docker 引擎轻松部署到云端。我们可以使用上面讨论的 Dockerfile 工具来完成这项工作。
第 1 步:创建 Dockerfile
在您的项目文件夹中,创建一个名为 Dockerfile
的文件。确保名称 完全 是 “Dockerfile”(没有扩展名,并且在某些系统中区分大小写 – 所以确保它是大写的)。
如果您使用的是代码编辑器,只需创建一个名为 Dockerfile
的新文件。如果您使用的是基本文本编辑器,请将文件保存为 Dockerfile
,并确保它不会意外地保存为 .txt
等扩展名。
然后输入第一行:
FROM Node:18-alpine
此命令获取我们将用于支持 Express 应用程序的基础镜像,即 Node 引擎本身。
您可能会想知道 alpine
是什么。Alpine 是 Docker 镜像的一个轻量级、压缩得更多的版本。它不包括与基础操作系统直接不相关的额外软件包。使用轻量级发行版被倡导作为一种标准的良好代码实践,以实现更快的执行和更易于使用。
第 2 步:设置工作目录
WORKDIR /app
这将图像的工作目录设置为容器的 /app
文件夹。它确保所有文件操作都发生在这里,并且所有文件都复制到此目录中。
步骤 3:复制必要的文件
COPY package.json
此命令复制 package.json
文件,该文件包含要安装的依赖项和包的列表,以支持我们的应用程序。
步骤 4:执行设置脚本
RUN npm install
此命令确保容器中安装了支持我们的 Node.js 应用程序的所有必要依赖项。
步骤 5:复制代码文件
COPY . .
此命令确保本地目录中的所有文件都复制到已建立工作目录的容器文件系统中。
步骤 6:暴露服务器端口
EXPOSE 3000
此命令暴露我们打算用来访问容器的服务器端口。在这种情况下是端口 3000。
步骤 7:包含激活容器的命令
CMD ["npm", "run", "dev"]4
此命令在最后执行,以启动 Node.js 应用程序。它简单地运行 npm run dev
命令,这是您在开发环境中使用的命令。要在生产环境中运行,您可以使用 npm start
命令。
完成此过程后,最终的 Dockerfile 结构应如下所示:
FROM Node:18-alpine
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
测试 Docker 容器
总而言之,我们将创建一个 Node.js 应用程序的 Docker 镜像。为此,请执行命令 docker build -t nodeapp .
。docker build
命令用于构建镜像,而 -t
则允许指定镜像标签的详细信息。
在我们的案例中,我们将镜像命名为 nodeapp
,并且镜像将在工作目录中创建。
恭喜!您已成功构建了您的第一个 Docker 镜像。要查看您本地仓库中的所有镜像,请执行命令 docker images
。
为了创建一个可用于测试的镜像实例,请执行命令 docker run nodeapp
。
我们在本教程中使用 Mongo DB 作为数据库,因此我们需要将 MongoDB URL 作为环境变量传递给 Docker 容器。环境变量帮助您保护某些关键变量,这些变量不应公开暴露。其他可以作为环境变量传递的变量包括 API 密钥和加密代码。
要将 MongoDB URL 传递给 Docker 容器,我们使用 -e
标签,以确保 Docker 识别相应的值输入为环境变量。
docker run -e JWT_SECRETS={输入您选择的值} -e MONGO_URL={您选择的 mongo url} nodeapp
。
要在后台使用容器,只需附加 -d
标签,该标签表示分离选项。此选项允许容器在退出命令行终端后仍在后台运行。
如果没有错误,导航到 localhost:5000
也应该会产生类似于下面图像的结果。
总结
在本文中,您了解了Docker是什么以及它是如何工作的,常用命令以及如何使用它对后端应用程序进行容器化。除了基础知识,您还可以探索Docker在持续集成和开发中的其他用法。要了解更多关于Docker的信息,您可以在 这里 查看其文档。
我还建议利用您新获得的知识来部署具有实际用例的项目,并探索Docker应用程序中的网络。要使您的应用程序上线,您可以轻松地将创建的Docker镜像部署到AWS、GCP、Azure等流行的云服务提供商上。
随时问我任何问题!您还可以在 这里 查看我的其他文章。下次见,继续编程!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/