在Dockerfile介绍文章中,我介绍了一个简单的Node.js Dockerfile例子。
FROM node:14
WORKDIR /usr/src/app
COPY package*.json app.js ./
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]
注意:在
CMD行中使用双引号。单引号会导致错误。
让我们使用这个Dockerfile来构建一个镜像,然后运行容器。
我将在dev/docker/examplenode 文件夹中创建这个文件。我在app.js 文件中创建一个简单的Node.js应用,使用Express。
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(3000, () => console.log('Server ready'))
超级简单,但我们有一个依赖性。我需要把它添加到package.json 文件中,所以我运行了
npm init -y
npm install express
现在你可以运行node app.js ,并确保它工作。

停止这个进程,让我们从中创建一个Docker Image。
你所需要的是app.js,package.json 和package-lock.json 文件。
还有Docker文件。在同一文件夹中创建一个Dockerfile 文件,没有扩展名(不是Dockerfile.txt)。
你可以自由地删除现在包含Express库及其依赖关系的node_modules 文件夹,但你也可以创建一个.dockerignore 文件,并在其中添加node_modules ,以使Docker完全忽略这个文件夹。
它的作用与Git中的.gitignore 。
运行命令
docker build -t examplenode .

下载Node镜像和运行npm install ,需要一段时间,然后你会得到一个成功的消息。
值得注意的是,在你第一次下载一个基础镜像,比如我们在这里使用的node ,那会被缓存在本地,所以你不需要再次下载,镜像构建过程会快很多。
现在我们可以从该镜像中运行一个容器。
docker run -d -p 3000:3000 --name node-app examplenode

现在你可以看到镜像在Docker Desktop中运行。

而且你可以点击 "在浏览器中打开 "按钮,打开运行在3000端口的应用程序。

就像以前一样!除了现在应用程序在它自己的容器中运行,完全隔离,我们可以在容器中运行任何我们想要的Node版本,并拥有Docker给我们的所有好处。
例如,你可以移除容器,在80端口而不是3000端口上运行它。
docker run -d -p 80:3000 --name node-app examplenode
镜像不需要改变,你所改变的只是端口映射。这就是结果。
