概述
可以简单理解为通过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,显示如下图
- 可以通过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,具体如下图所示:
排查:发现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查看容器运行情况,具体如下图所示: