Docker提供了轻巧的容器来与基础架构隔离运行服务,因此我们可以快速提供软件。在本教程中,我将向您展示如何使用Docker Compose dockerize nodejs express和mongodb示例。
相关文章:
- Node.js Express Rest API with MongoDb
- Node.js Express Pagination with Mongoose and MongoDB
- Node.js + MongoDB: User Authentication & Authorization
- Upload/store images in MongoDB using Node.js, Express & Multer
- MongoDB One-to-One relationship tutorial with Mongoose example
- MongoDB One-to-Many Relationship tutorial with Mongoose examples
- MongoDB Many-to-Many Relationship with Mongoose examples
dockerize fulstack:
node.js express和docker概述
假设我们有一个与MongoDB数据库一起使用的NodeJS应用程序。
问题是要容忍一个需要多个Docker容器的系统:
- node.js for api
- 数据库的mongodb
Docker组成的构成可帮助我们更容易,更有效地设置系统,而不是仅使用Docker。我们将遵循以下步骤:
- 创建使用MongoDB数据库的Nodejs应用程序。
- 为nodejs应用创建dockerfile。
- 写docker在yaml文件中构成配置。
- 设置Docker组成的环境变量
- 运行系统。
目录结构:
创建nodejs app
您可以从以下教程中的一个:
中读取并获取github源代码- Node.js Express Rest API with MongoDb
- Node.js Express Pagination with Mongoose and MongoDB
- Node.js + MongoDB: User Authentication & Authorization
- Upload/store images in MongoDB using Node.js, Express & Multer
使用上面的代码库,我们将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_open
和tty
:建造容器后,保持终端
您应该注意,主机端口(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:
和mongoDB数据库:
停止应用程序
停止所有运行容器也很简单,只需一个命令:
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 。
您可以将这种方式应用于以下项目之一:
- Node.js Express Rest API with MongoDb
- Node.js Express Pagination with Mongoose and MongoDB
- Node.js + MongoDB: User Authentication & Authorization
- Upload/store images in MongoDB using Node.js, Express & Multer
或Dockerize Fullstack:
快乐学习!再次见。
源代码
本教程的源代码可以在Github中找到。
进一步阅读
关联: