文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏
参与翻译: 墨镜大头 (11)

我喜欢Node.js和Docker。虽然我不是其中的专家, 假装我是从事着相关工作.

最近我一直关注着 Openshift CDK 并思考如何围绕它开发Node.js应用。具体来讲, 我在看MSA Hello World 演示和Bounjour微服务.

我最近还写了篇新MacBook Pro上重新安装设置CDK环境。 我会把它分享出来,这是篇好文章。

我最初的目的是找出如何“docker化“Node.js应用然后部署我的本地的OpenShift虚拟机上,但当我开始并逐步深入后,我发现了几种不同的方法来实现(Docker化). 希望这篇文章将带来不同的视野。

第 1 段(可获 1.7 积分)

初级Node应用

在我开始我的dockerization之前,我使用express创建了一个基础Node.js Web应用。这里是应用仓库

'use strict';

const express = require('express');

// Constants
const PORT = 8080;

// App
const app = express();
app.get('/', function (req, res) {
  res.send('Hello world\n');
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

当然你需要运行 npm install express --save来安装express.

然后运行npm run start来启动。

如果你学过Node的入门教程,这应该是非常熟悉的。 事实上,docker化web应用的示例代码是从nodejs.org指南获取的,你可以在这里找到: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

第 2 段(可获 1.06 积分)

或者你可以在这里阅读到更多,因为在这篇文章中我将在docker化的应用中做这些事情。

初级Docker化的Node应用

将这段代码构建到一个初级的docker镜像中(Docker化)相当的简单。我们将需要创建一个Dockerfile文件。

请注意:这来自Node.js的官方文档, 链接在上面

首先, 我们需要一个基础镜像,所以让我们选择官方的Node.js镜像

FROM node:6.9.5

现在我们的镜像中需要一个目录来存放代码。

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

然后我们需要复制package.json文件和代码并执行npm install

第 3 段(可获 1.26 积分)
# Install app dependencies
COPY package.json /usr/src/app/

# Bundle app source
COPY . /usr/src/app

RUN npm install

然后我们需要将端口8080暴露出来,这样就可以访问我们的服务器了

EXPOSE 8080

最后我们要指定在最后运行镜像时执行的命令。

CMD [ "npm", "start" ]

现在我们只需要构建这个镜像:

docker build -t lholmquist/docker-web-app .

我们使用了带有-t参数的docker构建命令因此我们可以使用lholmquist/docker-web-app的名称标记它并且.是告诉docker使用当前目录来构建。

运行docker image list应该会输出类似的东西:

第 4 段(可获 0.89 积分)

docker-image

现在,这只是一个镜像,因此要运行它, 你可以像这样做:

docker run -p 8080:8080 lholmquist/docker-web-app

你应该在控制台上会看到类似的东西:

并且你如果在浏览器中打开 http://localhost:8080,你应该看到一些东西。

使用源码到镜像(Source-to-image)

如果你不想处理过多的Dockerfiles可以使用Openshift(S2I)源码到镜像工具

S2I基本上是将你的代码和一个兼容S2I的镜像柔和在一起来获得一个不错容器去运行。

那这是如何做到的,听起来有点像魔术。好吧, 它的确是的。

第 5 段(可获 1.25 积分)

让我们来看一下将要用于构建应用docker镜像的命令。对于示例应用,我们将继续使用之前的初级express示例。这个仓库 https://github.com/lholmquist/s2i-web-app,包含有相关代码。克隆下来并进入到目录中。

s2i build . bucharestgold/centos7-s2i-nodejs:7.5.0 s2i-web-app

让我们来看一看。

s2i build - 我们使用的s2i命令行工具提供的构建命令。

. 告诉工具使用我们当前目录中的代码。

下一部分很有意思:

bucharestgold/centos7-s2i-nodejs:7.5.0.

第 6 段(可获 1.05 积分)

让我们从命令的后面往前面看。

7.5.0 是镜像使用的node版本号。

centos7-s2i-nodejs 是我们要使用的镜像。我过会儿解释一下为什么要用这个。

bucharestgold 是dockerhub的命名空间。

所以如果运行这个命令,您将看到基础图像(the centos7-s2i-nodejs) 像正常docker构建中一样下载来。

然后你会看到一条消息:

---> Installing application source

这是在将当前目录中的代码复制到镜像中的目录中。

然后

---> Building your Node application from source

这基本上只是运行 npm install -d

第 7 段(可获 1.14 积分)

在完成后, 你可以使用我们之前使用过的相似的docker run命令来创建一个运行的容器。

docker run -p 8080:8080 s2i-web-app

并且如果你在浏览器中打开 http://localhost:8080,你应该看到的东西和另一个例子一样。

我们之所以使用这个镜像原因, 是因为s2i的特性已经在它里面是 "已启用"。

具体地说, 有一个 .s2i目录已经内建到镜像中,在里面保存了一些脚本。其中一个脚本是“汇编”脚本,在这里你可以看到内容: https://github.com/bucharest-gold/origin-s2i-nodejs/blob/master/s2i/assemble

第 8 段(可获 1.14 积分)

当我们执行docker build时这些步骤将会运行。如上所示,它拷贝我们的代码并运行 npm install

现在可以单独使用这个来快速打包一个Node.js应用(或者任何其他语言的应用)到docker中,但是这个工具只能在Openshift上开发Node.js应用的时候有出色表现。

如果我们看看基础镜像的Dockerfile,我们可以看到实际上我们下降root用户和更改了权限。这是因为在OpenShift中你不能以root来运行程序。 所以创建Docker容器这种方式,在OpenShift的相关开发上可以节省一些步骤。

第 9 段(可获 1.28 积分)

我们也提供了一些"ONBUILD"docker镜像以供你在某些场景想使用这个 bucharestgold/centos7-s2i-nodejs 镜像并需要使用dockerfile。

你只需把这放入你的Dockerfile中的"FROM" 部分

FROM bucharestgold/centos7-s2i-nodejs:7.5.0

让我们实际看看原始Dockerfile样子, 例如我们使用的这个镜像。

这里是原始的:

FROM node:6.9.5

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app


# Install app dependencies
COPY package.json /usr/src/app/

# Bundle app source
COPY . /usr/src/app

RUN npm install

EXPOSE 8080

CMD [ "npm", "start" ]
第 10 段(可获 0.76 积分)

现在让我没看看如果我们使用了“ONBUILD”镜像会是什么样子,

FROM bucharestgold/centos7-s2i-nodejs:7.5.0

是的,就是这样。 当我们运行docker build时,我们的基础镜像负责复制和安装,并设置CMD。

结论

正如我们所看到的,有几种不同的方式来Docker化我们的Node.js应用程序,最好的方法取决于你的应用场景,这篇文章仅仅是显示有不同的方法。

如果你想了解更多关于S2I 和我们正在做的Node.js相关工作可以看看我们的 Bucharest-gold仓库.

现在欣赏下猫图片吧:

第 11 段(可获 1.21 积分)

文章评论