本篇主要分享如何在Docker部署常见的技术栈 Node.js+Mongodb 再选用一个可视化的工具 mongo-express。下面分别对这三点进行介绍。
1.部署Node.js
部署Node.js代码时,我首先编写了一个Dockerfile源文件,目的是为了生成一个镜像。具体该如何编写dockerfile可以参看我的其他文章。
// 1.拉取node基础镜像
FROM node:latest
因为后端代码是node.js所以生成镜像,第一步是需要先给到一个能够运行代码的基本环境。
// 2.创建工作目录
RUN rm -rf /app
RUN mkdir /app
WORKDIR /app
COPY package.json /app/
RUN mkdir public
WORKDIR public
RUN mkdir upload
WORKDIR /app
在之后,就是要往这个基本环境里添油加醋啦。创建一些目录,然后使用COPY将本地里的一些东西拷贝到镜像环境里。WORKDIR是指定当前的工作目录。
# 3.安装项目依赖
RUN npm install
COPY . /app/
RUN npm run build
这部分是在进行环境中包的安装。上一步中,把package.json文件拷贝到了环境里,然后执行npm install进行依赖安装,然后再将当前本地目录下的代码都拷贝到 环境里/app下。这里要注意的是,可能在你的本地目录下,有一些你并不想拷贝进来的,可以写一个.dockerignore文件来申明这些忽略。下面是我的.dockerignore文件,我这里申明把node_modules忽略,主要是为了加快生成镜像的速度,此次,主要是将后端代码部署到docker,这里public里面的东西也暂且忽略了。
node_modules
public
拷贝好之后,就可以执行npm run build 对后端代码在镜像里打包了
// 4. 对外暴露端口
EXPOSE 5000
指明暴露的端口号,这里暴露5000端口。
// 5.执行wait操作,让服务在Mongodb启动之后再执行
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait
CMD /wait && npm run start
这里是一个关键的地方。使用/wait来让某个此服务等待其他的服务启动后才执行。和docker-compose.yml中的depends_on有异曲同工之妙吧。
在写完dockerfile文件之后,又再docker-compose.yml中进行了自动化的部署工作。
web:
build:
context: ./
dockerfile: Dockerfile
container_name: web-backend
restart: on-failure
environment:
PORT: 5000
WAIT_HOSTS: mongodb:27017
MONGODB_URI: mongodb://mongodb:27017/myblog_db2
depends_on:
- mongodb
ports:
- 5000:5000
networks:
- webapp-network
在这里,需要主要的是build这里指定了我刚才写好的dockerfile文件,在自动化部署的时候就会使用这里生成的镜像了。另外,还要注意的是,WAIT_HOSTS: mongodb:27017这里是指明需要等待mongodb启动之后才执行,然后MONGODB_URI中申明了连接的地址。docker-compose中的具体细节可以参看我的其他文章。
2.部署Mongodb
下面开始进行mongodb的自动化部署。首先是需要拉取mongodb的镜像,然后需要申明端口号使用的是27017。这里,需要注意的是,volumes是用来持久化数据,这里用的是绝对路径的方式,需要自己管理本地的路径。通过volumes 关键字实现物理主机目录挂载到容器中的功能(同时删除Dockerfile中的COPY指令,不需要创建镜像时将代码打包进镜像,而是通过volums动态挂载,容器和物理host共享数据卷,左侧为物理host,右侧为容器地址)。
mongodb:
image: mongo
container_name: mongodb
restart: always
ports:
- 27017:27017
volumes:
- ~/data/db:/data/db
networks:
- webapp-network
3.部署mongo-express
最后是选择使用了一个对mongodb进行可视化的工具。除了mongo-express之外,还有其他的选择,比如:adminmongo等。这里以部署mongo-express为例。
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always
links:
- mongodb:mongodb
depends_on:
- mongodb
networks:
- webapp-network
ports:
- 27018:8081
environment:
ME_CONFIG_OPTIONS_EDITORTHEME: 3024-night
ME_CONFIG_MONGODB_SERVER: mongodb
ME_CONFIG_BASICAUTH_USERNAME: admin
ME_CONFIG_BASICAUTH_PASSWORD: admin
这里enviroment参数里填写了对mongodb和mongo-express的基本配置信息。端口号暴露为27018,容器内为8081。depends_on申明此镜像部署依赖于mongodb完成后进行。
以上就是对后端Node.js代码及数据库mongodb和可视化工具mongo-express的本地docker部署。如果遇到什么疑问和问题,欢迎留言讨论。如果有什么不正确的地方,也欢迎指正。