边学边译JS机制-- 37.DOCK 化Node应用

175 阅读4分钟

Docker是一个工具,简化团队间应用开发环境。应用被打包在一个容器中,让开发者在开发,测试和部署的时候具有更好的体验。这个容器是由Docker 镜像创建的,所有的依赖和运行时信息都在里面运行。

最近这些年,开发者已经拥抱这些方式了。因为他们不用再被安装各种依赖困扰了。

这一章,我们将会讨论一些具体的步骤,开Dokcer化我们的Node应用。我们不会去解释什么是Docker,会讲一下为什么我们需要它。

预备知识

  • 熟悉Node和NPM
  • Docker的基础知识
  • 已经安装了Docker 并且有一个 Docker Hub 账号

如果你还没有安装Dockler,可以去Docker的官网上,按照步骤操作一下。有些概念可能你还不懂,可以百度一下,不复杂的。

步骤1 —安装一个Node(Express) 服务

我们将使用Express,我们用脚手架快速生成一个应用结构。 安装generator

$ npm install -g express-generator

生成一个应用结构

$ express --no-view nodeDockerApp

切换到文件目录,你可以重命名你的应用。本例中,我们命名为‘nodeDockerApp’,文件目录大概长这样:

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js

然后移除public和bin目录,聚焦于我们的服务端内容:

$ rm -r public bin

然后,在app.js中创建服务:

const express = require('express');
const logger = require('morgan');

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

const port = 5000;

const app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use('/', indexRouter);
app.use('/users', usersRouter);

app.listen(port, function () {
  console.log('App listening on port 5000!');
});

module.exports = app;

package.json文件中加入这些依赖和脚本:

{
  "name": "nodedockerapp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },
  "dependencies": {
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "morgan": "~1.9.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.7"
  }
}

然后,定义路由文件,在routes/users.js文件中贴入下面的代码:

const express = require('express');
const router = express.Router();

/* GET users listing. */
router.get('/', function (req, res, next) {
  const data = {
    name: 'Victor Jonah',
    job: 'Technical Author',
  };
  res.status(200).send(data);
});

/* Add user to the list. */
router.post('/', function (req, res, next) {
  const { name, job } = req.post();
  const data = {
    name,
    job
  }
  res.status(200).send(data);
});

module.exports = router;

所有依赖和服务器文件都到位了,我们启动了

启动应用:

npm run dev

我们会看到这些:

image.png 在终端中运行 :

curl http://localhost:5000/users

将会看到下面的内容:

image.png 步骤2 — Docker化你的应用

此时我们已经运行了应用,然后我们创建一个Dockerfile,去建立我们的Docker镜像。

开始之前,我们必须要执行一些步骤。 第一步依然是创建Dockerfile,它是一个蓝图,在我们执行时候依次提供Docker镜像。

在终端中执行:

touch Dockerfile

然后,在Dockerfile中添加以下结构:

FROM node:14

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

# Install dependencies
COPY package.json /usr/src/nodedockerapp
RUN npm install

# Push in app source
COPY . /usr/src/nodedockerapp

CMD [ "/bin/bash" ]

这就够了。我们来按行解释一下:

FROM node:14

这里,我们告诉Docker从Dockerhub中拉取镜像,这个镜像包含了所有的应用代码和工具。镜像运行之后,变成了一个容器。 第一行,创建了一个文件容器目录,第二行让它变成我们的工作目录。这意味着容器只有在这个目录工作。

COPY package.json  /usr/src/nodedockerapp

RUN npm install

这两行就比较好懂了,把package.json拷贝到我们的工作目录,然后安装所有的依赖

# Push in app source

COPY  .   /usr/src/nodedockerapp

把主目录(所有文件)拷贝到容器目录中。 步骤三 — 忽略容器中的文件

容器中有些文件是不必要的,所以可以忽略他们,我们使用.dockerignore

.git node_modules

很像.gitignore文件

步骤4 — 构建镜像

最后一步就是构建和运行镜像,这样就获得了容器。

在有Dockerfile文件的主目录里,我们执行:

docker build -t nodedockerapp .

image.png

你可以列出你构建的所有可用的dokcer镜像: docker images: image.png

我们运行镜像,来生成容器。同时,还需要映射一下本机的服务端口和DOcker的端口,这样我们在docker中运行服务器,也能进行连接。

运行:

docker run -it -p 5000:5000 nodedockerapp

这样我们的服务就运行在容器中,端口是5000,该端口与我们本地的机器连接

image.png

测试一下我们的端口:

image.png

image.png 可以看到应用在容器中运行良好 有时候我们有多个容器在应用中运行,就需要 docker-compose 它会协助我们管理所有的容器,让其表现得就像是只有一个容器。