Docker部署node服务

778 阅读2分钟

概述

可以简单理解为通过docker构建一个镜像,让node服务在docker中运行。

如何通过docker部署node服务

Docker Compose管理服务

通过docker-compose,可以使用YML文件来配置应用程序需要的所有服务,然后,使用一个命令,就可以从yml文件配置中创建并启动所有服务

docker-compose.yml文件编写

version: '3.0'
services: # 服务列表
  mysql:
    image: mysql
    container_name: mysql_container
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=test#123
    ports:
      - 13306:3306
    volumes:
      - /xxx/data:/var/lib/mysql # xxx为服务器上目录,/var/lib/mysql为mysql安装目录

  server:  # node服务
    container_name: server-container # 容器名称
    image: node:14.15.0 # 基于node哪个版本构建镜像
    ports:  # 暴露的端口
      - "7007:5088" # 7007对应对外暴露的端口,5088对应本地node服务端口
    volumes:
      - .:/data
    working_dir: /data # 容器的工作目录
    depends_on: # 设置依赖关系,web服务依靠mysql要先等mysql启动
      - mysql
    restart: on-failure:5 # 自动重启,失败的话重启5次后停止
    command: yarn start # 覆盖容器启动后默认执行的命令,node服务启动命令

说明

  • working_dir是容器工作目录,即执行docker exex -it 容器 bash,显示如下图

image.png

  • 可以通过docker inspect ed8bc7df3fa1命令查询容器具体信息
  • volumes:本质上是容器与主机之间共享的目录或者文件,这样docker volume中的数据可以在主机和容器中实时同步。作用是数据持久化,挂载本地目录到container,修改时同步

接下来就可以执行docker-compose命令,可以对配置的服务创建并启动,即执行如下命令:

docker-compose  up -d # 添加-d容器后台执行
或
docker-compose  up # 以依赖性顺序启动服务

遇到的问题

问题一:docker-compose文件和Dockerfile文件编写好后,执行docker-compose up -d报unknown flag: --iidfile,具体如下图所示:

image.png

排查:发现Dockerfile和Dockerfile文件编写的不对,包括image、WORKDIR、ENV等等,比如之前的image是自己随便起的一个,网上有的说是需要降级docker-compose版本,这个不一定是对的,具体需要看自己的写的配置文件

解决:修改配置文件

问题二:执行yarn start时,报nest是undefined,排查了好久

排查:发现node_modules里面没有devDependencs里面的依赖,查看docker-compose配置文件,发现配置了线上环境变量,突然醒悟,当环境变量是prod时devDependences里面的依赖不会被打包到node_modules中

environment:
      NODE_ENV: production

解决:去掉环境变量

说明

通过docker-compose正常启动后,通过docker ps -a查看容器运行情况,具体如下图所示:

image.png