Docker 和 NodeJS:入门
介绍
最近,我花了很多时间在私有区块链的世界里。当你学习像这样的新技术时,你会遇到一些你必须理解的概念或原则才能继续前进。Docker 和容器对我来说似乎就是其中之一。所以,以一种“让我们写下我学到的东西”的方式,我试图解释 Docker 的功能以及我是如何开始使用它的。
容器?
Docker 是一个供开发人员使用容器开发和部署应用程序的平台。Docker 并非容器或容器化技术的发明者,但却普及了这一概念,因此它们有时被用来描述同一件事物。
容器通过运行镜像来启动。镜像是一个可执行文件,它解释了应用程序运行所需的所有内容以及在哪里/如何找到它们。容器是镜像的运行实例。这种方式比提供完整“虚拟”操作系统的虚拟机 (VM) 占用的资源更少,而虚拟机占用的资源比大多数应用程序所需的资源要多。通过将应用程序及其依赖项容器化,可以消除操作系统发行版和底层基础架构之间的差异。
Docker 和 NodeJS
理论已经讲得够多了,让我们看看如何使用 Docker 为 NodeJS 应用程序创建镜像。
首先,按照这里的说明安装 Docker 。完成后,docker --version
在终端中运行。你应该看到类似以下内容:
Docker version 17.12.0-ce, build c97c6d6
如果您想确保一切正常,您可以运行:docker run hello-world
。这将为您拉取hello-world镜像并启动一个容器。
您可以看到使用 所下载图像的列表docker image ls
。
您可以使用 查看正在运行的容器列表docker container ls
,也可以使用 查看所有容器docker container ls --all
。请记住,容器是您下载的镜像的实例。
因此,如果您运行hello-world镜像,假设您之前没有运行任何容器,您将在此列表中看到一个容器。如果您运行hello-world 5 次,您将拥有 5 个容器( hello-world镜像的实例)。
注意:要停止容器,请运行docker kill $(docker ps -q)
。您仍然会看到带有 ` 的容器docker container ls --all
。要完全删除它们,请运行docker rm $(docker ps -a -q)
。
NodeJS 应用程序
我们来做一件非常简单的事情。一个 Express 应用,包含 2 个路由,渲染 2 个 html 页面。创建一个名为 express-app 的新目录:
mkdir express-app && cd express-app
使用默认设置运行npm init
。然后运行npm install express --save
。
创建 3 个文件:index.js、index.html、about.html。
- index.js
` javascript
const express = require('express')
const app = express()
app.get('/', ( req, res ) => {
res.sendFile( ${__dirname}/index.html
)
})
app.get('/about', (req, res) => {
res.sendFile( ${__dirname}/about.html
)
})
app.listen(3000, () => {
console.log('正在监听 3000 端口!')
}) `
创建一个 express 应用程序,为我们的 html 文件设置 2 个路由并监听端口 3000。
- 索引.html
`html
<html>
<body>
<h1>Hello Docker from index</h1>
</body>
</html>
`
- 关于.html
`html
<html>
<body>
<h1>About page</h1>
</body>
</html>
`
好的,我们的应用完成了。运行后node index.js
,你将在 localhost:3000/ 和 localhost:3000/about 上看到我们的 html 页面。
Dockerfile
为了定义容器内的环境,我们将使用Dockerfile。这是一系列指令,告诉 Docker 如何创建我们想要的镜像。
使用以下命令在您的目录中创建 Dockerfile touch Dockerfile
:
`
来自节点:碳
工作目录 /usr/src/app
复制包*.json ./
运行 npm install
复制 。 。
曝光 3000
CMD [“node”, “index.js”]
`
这里发生了什么?第一行表示我们要使用最新的 Node 版本来构建镜像。这就是我们开始使用的镜像。node :carbon是最新的长期支持版本。
第二行创建一个目录来保存图像内的应用程序代码。
第三行和第四行复制 package.json 文件并运行npm install
命令。第一行提供了 node.js 和 npm。因此我们安装依赖项,在本例中仅安装 express.js。注意,我们不会复制/node_modules 文件。
COPY指令将我们的应用程序捆绑在 Docker 镜像中,因此在我们的例子中是我们的 html 文件和 index.js 文件。
EXPOSE指令公开我们的应用程序使用的 3000 端口。
最后,CMD指令指定我们的应用程序启动时需要运行哪个命令。
建造
现在一切准备就绪,我们可以构建应用程序了。
跑步docker build -t node-app .
-t标签允许你为 Docker 镜像指定一个友好名称。你应该在终端中看到类似这样的内容:
`
将构建上下文发送到 Docker 守护进程 21.5kB
步骤 1/7:FROM node:carbon
---> 41a1f5b81103
步骤 2/7:WORKDIR /usr/src/app
---> 使用缓存
---> ffe57744035c
步骤 3/7:COPY package*.json ./
---> 使用缓存
---> c094297a56c2
步骤 4/7:RUN npm install
---> 使用缓存
---> 148ba6bb6f25
步骤 5/7:COPY . .
---> 使用缓存
---> 0f3f6d8f42fc
步骤 6/7 :EXPOSE 3000
---> 使用缓存
---> 15d9ee5bda9b
步骤 7/7 :CMD ["node", "index.js"]
---> 使用缓存
---> 154d4cd7e768
成功构建 154d4cd7e768
成功标记 node-app:latest
`
现在,如果你运行。你将在列表中docker image ls
看到你的node-app 。
启动容器
现在我们可以启动容器了。运行docker run -p 8080:3000 -d node-app
-d标志以分离模式运行应用程序。-p 8080:3000将公共端口重定向到私有端口。8080 是私有端口,3000 是我们导出的公共端口。
转到 localhost:8080,您的应用程序正在运行!
现在,运行docker run -p 10000:3000 -d node-app
,然后docker run -p 4000:3000 -d node-app
。
打开 localhost:10000 和 localhost:4000,你会发现你的 node-app 镜像有三个不同的实例同时运行!为了确认这一点,你可以运行它,docker container ls
看看你的三个容器在不同端口上运行着同一个镜像。
好了,以上就是对 Docker 的简单介绍。祝您玩得开心!
补充:我忘了提了,其实我应该提一下。你应该创建一个.dockerignore文件,并在其中添加node_modules,告诉 Docker 你不想复制这个文件夹,因为我们复制的是package.json文件并运行npm install
。省略它也可以,但加上它更有意义 ;)