docker node.js和mongodb示例
#javascript #网络开发人员 #devops #docker

Docker提供了轻巧的容器来与基础架构隔离运行服务,因此我们可以快速提供软件。在本教程中,我将向您展示如何使用Docker Compose dockerize nodejs express和mongodb示例。

相关文章:

dockerize fulstack:

node.js express和docker概述

假设我们有一个与MongoDB数据库一起使用的NodeJS应用程序。
问题是要容忍一个需要多个Docker容器的系统:

  • node.js for api
  • 数据库的mongodb

Docker组成的构成可帮助我们更容易,更有效地设置系统,而不是仅使用Docker。我们将遵循以下步骤:

  • 创建使用MongoDB数据库的Nodejs应用程序。
  • 为nodejs应用创建dockerfile。
  • 写docker在yaml文件中构成配置。
  • 设置Docker组成的环境变量
  • 运行系统。

目录结构:

docker-compose-nodejs-mongodb-example-structure

创建nodejs app

您可以从以下教程中的一个:

中读取并获取github源代码

使用上面的代码库,我们将nodejs项目放入 bezkoder-app 文件夹中,然后修改某些文件以与环境变量一起使用。

首先,让我们将dotenv模块添加到 package.json

{
  ...
  "dependencies": {
    "dotenv": "^10.0.0",
    ...
  }
}

接下来,我们在 server.js 中导入dotenv并使用process.env进行设置端口。

require("dotenv").config();
..
// set port, listen for requests
const PORT = process.env.NODE_DOCKER_PORT || 8080;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

然后,我们更改修改数据库配置和初始化。

app / config / db.config.js

const {
  DB_USER,
  DB_PASSWORD,
  DB_HOST,
  DB_PORT,
  DB_NAME,
} = process.env;

module.exports = {
  url: `mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=admin`
};

我们还需要制作 .env 示例文件,以显示所有必要的参数。

bezkoder-app / .env.sample

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
DB_NAME=bezkoder_db
DB_PORT=27017

NODE_DOCKER_PORT=8080

为nodejs应用创建Dockerfile

Dockerfile定义了Docker用于设置Node.js应用程序环境的命令列表。因此,我们将文件放入 bezkoder-app 文件夹中。

因为我们将使用Docker组成,所以我们不会在此Dockerfile中定义所有配置命令。

bezkoder-app / dockerfile

FROM node:14

WORKDIR /bezkoder-app
COPY package.json .
RUN npm install
COPY . .
CMD npm start

让我解释一些要点:

  • FROM:安装node.js版本的图像。
  • WORKDIR:工作目录的路径。
  • COPY:复制 package.json 文件到容器,然后第二个复制项目目录中的所有文件。
  • RUN:在容器中执行命令行:npm install package.json
  • 中安装依赖项
  • CMD:构建图像后运行脚本npm start

写码头构成配置

在项目目录的根部,我们将创建 docker-compose.yml 文件。遵循Docker定义的version 3语法:

version: '3.8'

services: 
    mongodb:
    app:

volumes:
  • version:将使用Docker组成的文件格式版本。
  • services:孤立容器中的单个服务。我们的应用程序有两个服务:app(Nodejs)和mongodb(MongoDB数据库)。
  • volumes:命名量,使我们的数据在重新启动后保持活力。

让我们实现详细信息。

docker-compose.yml

version: "3.8"

services:
  mongodb:
    image: mongo:5.0.2
    restart: unless-stopped
    env_file: ./.env
    environment:
      - MONGO_INITDB_ROOT_USERNAME=$MONGODB_USER
      - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_PASSWORD
    ports:
      - $MONGODB_LOCAL_PORT:$MONGODB_DOCKER_PORT
    volumes:
      - db:/data/db
  app:
    depends_on:
      - mongodb
    build: ./bezkoder-app
    restart: unless-stopped
    env_file: ./.env
    ports:
      - $NODE_LOCAL_PORT:$NODE_DOCKER_PORT
    environment:
      - DB_HOST=mongodb
      - DB_USER=$MONGODB_USER
      - DB_PASSWORD=$MONGODB_PASSWORD
      - DB_NAME=$MONGODB_DATABASE
      - DB_PORT=$MONGODB_DOCKER_PORT
    stdin_open: true
    tty: true

volumes:
  db:
  • mongodb

    • image:官方Docker Image
    • restart:配置restart policy
    • env_file:指定我们将在以后创建的 .env 路径
    • environment:使用环境变量提供设置
    • ports:指定端口将被使用
    • volumes:地图卷文件夹
  • app

    • depends_on:依赖顺序, mongodb 是在 app 之前开始的
    • build:在 dockerfile 中定义的构建时间上应用的配置选项
    • environment:节点应用程序使用的环境变量
    • stdin_opentty:建造容器后,保持终端

您应该注意,主机端口(LOCAL_PORT)和容器端口(DOCKER_PORT)不同。网络服务到服务通信使用容器端口,外部使用主机端口。

Docker用MongoDB组成环境变量

在服务配置中,我们使用了 .env 文件中定义的环境变量。现在我们开始编写它。

.env

MONGODB_USER=root
MONGODB_PASSWORD=123456
MONGODB_DATABASE=bezkoder_db
MONGODB_LOCAL_PORT=7017
MONGODB_DOCKER_PORT=27017

NODE_LOCAL_PORT=6868
NODE_DOCKER_PORT=8080

使用Docker Compose

运行Nodejs mongodb

我们只能使用一个命令轻松地运行整个命令:
docker-compose up

docker会拉动mongodb和node.js images(如果我们的计算机之前没有它)。

服务可以通过命令在后台运行:
docker-compose up -d

$ docker-compose up -d
Creating network "node-mongodb_default" with the default driver
Creating volume "node-mongodb_db" with default driver
Pulling mongodb (mongo:5.0.2)...
5.0.2: Pulling from library/mongo
16ec32c2132b: Pull complete
6335cf672677: Pull complete
cbc70ccc8ebe: Pull complete
0d1a3c6bd417: Pull complete
960f3b9b27d3: Pull complete
aff995a136b4: Pull complete
4249be7550a8: Pull complete
cc105ff5aa3c: Pull complete
82819807d07a: Pull complete
81447d2c233f: Pull complete
Digest: sha256:54d24682d00278f64bf21ff62b7ee62b59dae50f65139831a884b345922b0f8a
Status: Downloaded newer image for mongo:5.0.2
Building app
Sending build context to Docker daemon  19.46kB
Step 1/6 : FROM node:14
14: Pulling from library/node
eb18d230e067: Pull complete 
83600c1b4583: Pull complete 
4ae15c65bfa0: Pull complete 
c19c058edda5: Pull complete 
05cdaa0fd103: Pull complete 
8461dcff50c4: Pull complete 
84be4117f79d: Pull complete 
4ccb803887fd: Pull complete 
ab52680a5469: Pull complete 
Digest: sha256:c1fa7759eeff3f33ba08ff600ffaca4558954722a4345653ed1a0d87dffed9aa
Status: Downloaded newer image for node:14
 ---> 256d6360f157
Step 2/6 : WORKDIR /bezkoder-app
 ---> Running in 71b4b2e9dd6c
Removing intermediate container 71b4b2e9dd6c
 ---> 194372d3695c
Step 3/6 : COPY package.json .
 ---> 093f866b404a
Step 4/6 : RUN npm install
 ---> Running in 025f0f0365a9
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN node-express-mongodb@1.0.0 No repository field.

added 81 packages from 128 contributors and audited 81 packages in 6.902s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

Removing intermediate container 025f0f0365a9
 ---> 2f04aeaa93b1
Step 5/6 : COPY . .
 ---> 50e31a045a02
Step 6/6 : CMD npm start
 ---> Running in 7353ac17fa02
Removing intermediate container 7353ac17fa02
 ---> bd9d66054ea2
Successfully built bd9d66054ea2
Successfully tagged node-mongodb_app:latest
WARNING: Image for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating node-mongodb_mongodb_1 ... done
Creating node-mongodb_app_1     ... done

现在您可以检查当前的工作容器:

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                                         NAMES
42b9271dd73f   node-mongodb_app   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:6868->8080/tcp, :::6868->8080/tcp     node-mongodb_app_1
e17bf545c0ba   mongo:5.0.2        "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:7017->27017/tcp, :::7017->27017/tcp   node-mongodb_mongodb_1

和docker图像:

$ docker images
REPOSITORY            TAG            IMAGE ID       CREATED         SIZE
node-mongodb_app      latest         bd9d66054ea2   5 minutes ago   960MB
node                  14             256d6360f157   6 minutes ago   944MB
mongo                 5.0.2          269b735e72cb   6 minutes ago   682MB

让我们发送一个HTTP请求以检查Express Rest API:

docker-compose-nodejs-mongodb-example-test-api

和mongoDB数据库:

docker-compose-nodejs-mongodb-example-test-database

停止应用程序

停止所有运行容器也很简单,只需一个命令:
docker-compose down

$ docker-compose down
Stopping node-mongodb_app_1     ... done
Stopping node-mongodb_mongodb_1 ... done
Removing node-mongodb_app_1     ... done
Removing node-mongodb_mongodb_1 ... done
Removing network node-mongodb_default

如果您需要停止并删除 docker-compose.yml 文件中任何服务使用的所有容器,网络和所有图像,请使用命令:
docker-compose down --rmi all

$ docker-compose down --rmi all
Stopping node-mongodb_app_1     ... done
Stopping node-mongodb_mongodb_1 ... done
Removing node-mongodb_app_1     ... done
Removing node-mongodb_mongodb_1 ... done
Removing network node-mongodb_default
Removing image mongo:5.0.2
Removing image node-mongodb_app

结论

今天,我们成功地创建了docker为nodejs和mongodb应用程序组成文件。现在,我们可以以一种非常简单的方式与Docker一起部署Nodejs Express和MongoDB: docker-compose.yml

您可以将这种方式应用于以下项目之一:

或Dockerize Fullstack:

快乐学习!再次见。

源代码

本教程的源代码可以在Github中找到。

进一步阅读

关联: