Node + Express + Mongodb 配置 Dockerfile

956 阅读3分钟

一、node 项目正常开发

项目目录

部分测试代码

.env

MONGO_URL=mongodb://mongodb/node-docker-test

App.js

const express = require('express')
require('dotenv').config({ path: '.env' })

require('./db/mongo')

const app = express()

app.use('/', (req, res, next) => {
  res.end('-----docker node is running-------')
})

app.listen(3000, () => {
  console.log(`server is running at port 3000`)
})

db/mongo.js

const mongoose = require('mongoose')
const chalk = require('chalk')

mongoose.set('useCreateIndex', true)

mongoose
  .connect(process.env.MONGO_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => {
    console.log(chalk.cyan(`db is connect`))
  })
  .catch((error) => {
    console.log(chalk.red(`db is error ${error}`))
  })

mongoose.connection.on('disconnected', function () {
  console.log('Mongoose connection disconnected')
})

mongoose.connection.on('open', function () {})

mongoose.connection.on('error', function (error) {
  console.log(error)
  mongoose.connection.close(function () {})
})

module.exports = mongoose

二、创建 .dockerignore

创建 .dockerignore 设置 docker 忽略文件

node_modules
npm-debug.log

三、在项目根部录下创建 Dockerfile 文件

FROM node:10.15.3 # 																						# 指定从哪个版本开始
	
LABEL maintainer="webB1anyaoyao@gmail.com"											# 指定开发人员

COPY . /app																											# 拷贝当前项目文件到容器的 /app 文件下,即打包后的镜像会在 /app 目录下

WORKDIR /app 																										# 设置镜像的目录,下方的运行命令都是在该工作目录下运行的

RUN ls																													# 测试 WORKDIR

RUN npm install --registry=https://registry.npm.taobao.org			# 安装依赖

RUN ls																													# 测试以依赖安装结果

EXPOSE 3000																											# 声明运行容器时提供的服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务

CMD [ "npm", "start"]																						# 指定容器启动时要执行的命令

四、 打包镜像

清空 docker 镜像、容器

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

通过 Dockerfile 打包镜像

$ docker build -t node-docker-test .
Sending build context to Docker daemon  33.79kB
Step 1/9 : FROM node:10.15.3
10.15.3: Pulling from library/node
c5e155d5a1d1: Pull complete 
221d80d00ae9: Pull complete 
4250b3117dca: Pull complete 
3b7ca19181b2: Pull complete 
425d7b2a5bcc: Pull complete 
69df12c70287: Pull complete 
ad53476a61f2: Pull complete 
204bb8bac4a1: Pull complete 
Digest: sha256:c5e919a89352d3ce6a883dde54a5d51dde12229c2d11088593cd1f3efefcc16e
Status: Downloaded newer image for node:10.15.3
 ---> 5a401340b79f
Step 2/9 : LABEL maintainer="webB1anyaoyao@gmail.com"
 ---> Running in cf46f8922ad5
Removing intermediate container cf46f8922ad5
 ---> 8f71629478c5
Step 3/9 : COPY . /app
 ---> a48c555db795
Step 4/9 : WORKDIR /app
 ---> Running in b45438ed4fa2
Removing intermediate container b45438ed4fa2
 ---> 0addf993831e
Step 5/9 : RUN ls
 ---> Running in ed804a076299
Dockerfile
app.js
db
package-lock.json
package.json
Removing intermediate container ed804a076299
 ---> 5b9ef7249334
Step 6/9 : RUN npm install --registry=https://registry.npm.taobao.org
 ---> Running in d76053046c13
npm WARN node-docker-test@1.0.0 No repository field.

added 86 packages from 52 contributors in 4.349s
Removing intermediate container d76053046c13
 ---> 8a6082ec2165
Step 7/9 : RUN ls
 ---> Running in 12b4474d6b70
Dockerfile
app.js
db
node_modules
package-lock.json
package.json
Removing intermediate container 12b4474d6b70
 ---> f7028b7aadeb
Step 8/9 : EXPOSE 3000
 ---> Running in 37ebfe720a9e
Removing intermediate container 37ebfe720a9e
 ---> 12c8b2fdc2db
Step 9/9 : CMD [ "npm", "start"]
 ---> Running in 0216d6f3f580
Removing intermediate container 0216d6f3f580
 ---> c5448c344879
Successfully built c5448c344879
Successfully tagged node-docker-test:latest

查看镜像是否打包成功

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
node-docker-test    latest              c5448c344879        About a minute ago   912MB
node                10.15.3             5a401340b79f        16 months ago        899MB

五、docker 拉取并运行 mongo

$ docker run -d -p 27017:27017 --name node-docker-mongodb mongo
# -d 										后台运行
# -p 27017:27017				端口指定
# --name node-mongodb		指定容器名称

六、运行打包后的 node 项目镜像

查看 node 打包后镜像

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
node-docker-test    latest              c5448c344879        4 minutes ago       912MB
mongo               latest              923803327a36        8 hours ago         493MB
node                10.15.3             5a401340b79f        16 months ago       899MB

查看运行的 mongo 容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
b68469f44a7e        mongo               "docker-entrypoint.s…"   53 seconds ago      Up 52 seconds       0.0.0.0:27017->27017/tcp   node-docker-mongodb

运行 node-docker-test 镜像

$ docker run -d -p 3333:3000 --name node-docker-service --link node-docker-mongodb:mongodb c5448c344879
# -d																	后台运行
# -p 3333:3000												指定容器向外部暴露端口
# --name node-docker-service					指定容器名称
# --link node-docker-mongodb:mongodb  连接 node-docker-mongodb 容器,node-docker-mongodb 在 node-docker-service 下别名为 mongodb
# 这就是为什么 `.env` 文件中 mongodb 的连接地址
# 由     mongodb://localhost:20710/node-docker-test
# 改为了:mongodb://mongodb/node-docker-test

a910c52aa4c86ee4708414e6be36988dfe11ddf7c8b37ae8416f1450cc56aee2
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
a910c52aa4c8        c5448c344879        "npm start"              28 seconds ago      Up 28 seconds       0.0.0.0:3333->3000/tcp     node-docker-service
b68469f44a7e        mongo               "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:27017->27017/tcp   node-docker-mongodb

查看 node-docker-service logs

$ docker logs a910c52aa4c8

> node-docker-test@1.0.0 start /app
> node app.js

server is running at port 3000
db is connect

测试接口

$ curl localhost:3333

-----docker node is running-------