如何在 Node.js 中创建 Dockerfile?
Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。它类似于将多个命令收集到单个文档中以完成单个任务的 shellscript。
先决条件:在您可以对任何应用程序进行 Dockerize 之前,您需要根据您的操作系统安装 Docker 引擎。转到 https://docs.docker.com/engine/install/ 安装 Docker 引擎。根据您的操作系统下载它。
命令:我们在编写 Dockerfile 时必须知道的基本命令。
- WORKDIR :用于指定工作路径,也就是说在图片文件中,我们目前在/app
- COPY:用于将项目中的文件复制到镜像文件中。
- RUN:现在已经有Node.js环境的镜像文件,以及package.json档案,然后我们可以执行npm安装所有套件的依赖项也将它们打包到镜像文件中
- EXPOSE:在使用容器的时候,可以想象它是一个封闭的机器,所以我们需要与外界建立一个通讯通道。这里我们设置了8081端口,也就是我们常用的端口。
- CMD:用于设置启动图像的方式。
- PULL:用于从 Docker 存储库中添加文件。
- VOLUME:用于创建目录挂载点以访问和存储持久数据。
- ARG:用于定义构建时变量。
- DOCKER BUILD:用于构建命令,用于从 Dockerfile 创建图像。
- DOCKER PUSH:用于将图像推送到您的 Docker 存储库。
让我们通过创建一个示例 express 应用程序来创建一个简单的 DockerFile。
第 1 步:通过 Express 框架创建示例 NodeJs 应用程序。
npm init
第 2 步:让我们通过运行以下命令将 Express 框架添加为第一个依赖项。
npm i express -s
第 3 步:我们可以使用简单的 http 服务器创建server_init.js文件。
server_init.js
// Load express module using `require` directive
let express = require('express')
let app = express()
// Define request response in root URL (/)
app.get('/', function (req, res) {
res.send('Dockerize the node app')
})
// Launch listening server on port 8081
app.listen(8081, function () {
console.log('app listening on port 8081')
})
运行应用程序的步骤:打开终端并键入以下命令。
node server_init.js
在浏览器中访问 http://localhost:8081/ 进行查看。
现在让我们为上述示例创建一个 docker 文件:
第 1 步:让我们继续在项目的根目录为我们的演示应用程序创建一个 Dockerfile。
touch Dockerfile
第 2 步:打开 Dockerfile 并添加以下步骤。每个 Dockerfile 都必须以 FROM 指令开头。这背后的想法是你需要一个起点来建立你的形象。您可以从从公共注册表中提取的任何有效映像启动 Docker 映像。您开始使用的映像称为基础映像。在我们的例子中,让我们将 FROM node:12.16-alpine 添加到 Dockerfile。
FROM node:12.16-alpine
第 3 步:在容器中创建目录,我们将使用该目录来存储文件、运行 NPM 并启动我们的应用程序:
RUN mkdir node
COPY . ./node
WORKDIR ./node/
第 4 步:通过以下命令安装所有 NodeJs 依赖项
RUN npm install
第 5 步:在应用示例中,我们在端口 8081 上运行 NodeJs 应用程序。
EXPOSE 8081
第 6 步:通过以下命令启动我们的 NodeJs 应用程序。
CMD node server_init.js
第 7 步:构建 Docker 映像。运行我们的应用程序的命令是
docker build -t hello-world .
第 8 步:我们可以找到我们创建的 docker 镜像。
docker image ls
通过以下命令运行应用程序
docker run -p 8081:8081 hello-world
输出:当我们运行我们在 docker 文件中编写的 docker build 步骤时,将被执行。打开浏览器并打开 localhost:8081
Push To ContainerRegistry:我们可以将镜像推送到我们的公共或私有 Registry。只需三个简单的步骤即可将镜像推送到 Dockerhub
docker login --username username --password yourpassword
docker tag localimagename username/repositoryname:tagname
docker push username/repositoryname:tagname