dockerfile 打包生成全新的mynodeapi镜像 多容器通信 docker-compose 编排多容器项目

dockerfile 打包生成全新的mynodeapi镜像

用过宝塔或手动部署node-api项目就知道
有多少时候是因为生产环境上node的版本与我们提交的node版本过高或过低导致无法运行的 为了统一化使用docker搭建集成镜像就很有必要了
这几天玩docker随便把我原先的项目尝试打包镜像部署下

1.确保你的package.json中script有命令执行

我这里serve的nodemon是开发环境使用的更改持久化动态刷新
start的node在生产环境使用

{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "serve": "nodemon index.js",
    "start": "node index.js"
  },
  "author": "NanKe",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.26.1",
    "bcryptjs": "^2.4.3",
    "dayjs": "^1.10.7",
    "express": "^4.17.3",
    "express-async-errors": "^3.1.1",
    "express-jwt": "^6.1.1",
    "jsonwebtoken": "^8.5.1",
    "log4js": "^6.4.4",
    "mongoose": "^6.2.9",
    "multer": "^1.4.4",
    "node-schedule": "^2.1.0",
    "nodemailer": "^6.7.3",
    "socket.io": "^4.4.0"
  }
}

2.上传你的node项目到服务器(我这边是openwrt软路由)

image

3.在当前node项目手动创建Dockerfile文件

内容如下:

#设置基础镜像
FROM node:16.13.0

#创建镜像目录,保存我们的代码
RUN mkdir -p /usr/src/mynodeapi

#设置工作目录(注意:这个文件路径是镜像内部的文件路径)
WORKDIR /usr/src/mynodeapi

#把当前目录下的所有文件拷贝到镜像的/usr/src/mynodeapi文件夹下
COPY . /usr/src/mynodeapi

#上一次提示要升级
RUN npm install -g npm@9.3.0

#编译运行node项目,使用npm安装程序的所有依赖
RUN npm install

#暴露container的端口
EXPOSE 5000

#运行命令
ENTRYPOINT ["npm", "run"]
CMD ["start"]

4.当前Dockerfile下 打包成一个名为mynodeapi的镜像

不指定版本默认latest
docker build -t mynodeapi .
指定版本v1
docker build -t mynodeapi:v1 .
image

5.docker images看下

image
有啦 是真的大 940M!

6.根据镜像启动容器

不挂载
docker run -d -p 5000:5000 --name="mynodeapi" mynodeapi
挂载:解决添加新功能重新build和run的痛点 修改代码不用重新build和run 只需重启立即生效
docker run -d -p 5000:5000 -v 你服务器开发环境复制到生产环境存储代码的目录:/usr/src/mynodeapi --name="mynodeapi" mynodeapi

小处理

成功启动
image
记得打开openwrt的端口后重启容器
image

通过post请求我的接口发现无响应
查看日志发现
image
由于mongo在另一个容器 而我mynodeapi并没有与其建立通信连接
这就导致了mynodeapi无法找到mongo服务
这边手动修改db.js的mongoip地址
image

重新上面的打包步骤
image
可以啦!
image

多容器通信

为了解决上面手动修改mongo服务地址
我们可以通过创建虚拟网络的方式进行容器之间的通信

docker network create mynet

附上前面docker部署mongo步骤
https://www.cnblogs.com/NanKe-Studying/p/17048504.html
那么上面mongodb链接的部署代码应该修改为

docker pull mongo:latest

mkdir -p /usr/docker/mongodb/data
mkdir -p /usr/docker/mongodb/conf

docker run -d \
-p 27017:27017 \
--name mongo \
--network mynet \
--network-alias mongodb \
-v /usr/docker/mongodb/data:/data/db \
-v /usr/docker/mongodb/conf:/etc/mongo
--restart always \
mongo:latest --auth

mynodeapi的部署代码应该修改为

docker run -d -p 5000:5000 --network mynet -v 你服务器开发环境复制到生产环境存储代码的目录:/usr/src/mynodeapi --name="mynodeapi" mynodeapi

无需修改db.js即可容器之间连接
最后到portainer查看日志或调试验证

docker-compose编排多容器项目

由于项目的复杂性 需要同时提供web服务、mongodb数据库服务、peer服务
在上一个多容器通信显得就不是那么方便 而且每个容器运行还要写一大堆的run命令
所以 我们可以根据dockerfile上面我们自己打包的多个镜像
使用docker-comper编排镜像一键部署

在上传到服务器上的文件夹的根目录新建docker-compose.yml
例如:
image
vi编辑


posted @ 2023-01-13 22:55  南柯Dream丶  阅读(44)  评论(0)    收藏  举报