一、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-------