docker部署nodejs项目应用
之前笔者弄了一套nestjs项目放在自己服务器上,并用pm2管理进程。
现在要把pm2停止,尝试一下用docker容器,那么首先要安装docker
一、安装docker
由于笔者服务器的系统是centos7,所以这里写的是在centos7上安装docker;
注:Docker 要求 CentOS 系统的内核版本高于 3.10
我们可以用以下命令来查看centos版本
uname -r
确定centos内核版本高于3.10后,接下来开始安装:
1、安装所需的软件包
yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、设置yum源
官方源地址作为稳定的仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、查看所有仓库中所有docker版本,可以选择特定版本安装
yum list docker-ce --showduplicates | sort -r
4、安装docker
# 这里安装的是最新版本
sudo yum install docker-ce
# 指定版本安装如下
sudo yum install docker-ce-19.03.09
5、启动docker
sudo systemctl start docker
6、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
至此,docker就安装完成了
二、Docker部署node.js后端应用
1、写Dockerfile文件
这里笔者将dockerfile文件放在和我的nestjs项目同级,同级的还有 .dockerignore文件,下面会细讲
下面是我的dockerfile文件内容(注意开头必须大写):
# FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。 # 指定我们的基础镜像是node,latest表示版本是最新 FROM node:latest # 执行命令,创建文件夹 RUN mkdir -p /home/nodeNestjs # 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的文件夹下 COPY ./nestjs /home/nodeNestjs # WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值, # 例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。 # cd到 /home/nodeNestjs WORKDIR /home/nodeNestjs # 安装项目依赖包 RUN npm install RUN npm build # 配置环境变量 ENV HOST 0.0.0.0 ENV PORT 3000 # 容器对外暴露的端口号(笔者的nestjs运行的端口号是3000) EXPOSE 3000 # 容器启动时执行的命令,类似npm run start CMD ["node", "/home/nodeNestjs/dist/main.js"]
.dockerignore文件
.dockerignore文件类似于git的.gitignore
文件,可以忽略掉添加进镜像中的文件,写法、格式和.gitignore
一样,一行代表一个忽略。
/dist /node_modules logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* .DS_Store /coverage /.nyc_output /.idea .project .classpath .c9/ *.launch .settings/ *.sublime-workspace .vscode/*
2、 将代码打包成镜像
切换到Dockerfile所在的位置
运行以下命令(注意最后的那个 . !!!)开始打包:
# -t表示指定镜像的名字
docker build -t kai_docker:v1.0 .
接下来,等待安装过程,直到打包成功
运行以下命令可查看目前本地docker的镜像
docker images
从上图可以看到我们刚刚打包的kai_docker镜像
3、 运行启动镜像
docker run -d -p 3000:3000 kai_docker:v1.0
- -d:表示后台运行
- -p:表示指定端口映射,(3000:3000)表示(本机端口:容器端口),3000是笔者的nestjs代码中监听的访问端口,也是容器对外暴露的端口
- 镜像名后面的:v1.0:表示打的tag号
这里笔者加上 --restart=always 让进程自动重启
docker run -d --restart=always -p 3000:3000 kai_docker:v1.0
运行以下命令可以查看容器运行情况
docker ps
可以看到我们的容器正常运行中
至此,笔者的nestjs的接口就可以正常访问了
三、容器报错停止
如果容器运行后执行docker ps没有出现刚刚运行的容器,可以执行以下命令查看退出的容器:
docker ps -a
出现这种情况的原因是运行的docker容器报错所致,可以用以下命令查看报错日志
docker logs CONTAINER_ID(CONTAINER_ID是docker容器的id)
容器报错有可能是因为dockerfile写的有问题所致,这时候需要删掉错误的容器和镜像,再重新打包正确的镜像
参考以下命令:
删除docker中的容器
docker rm 容器id
删除docker中的镜像
docker rmi 镜像id
删除docker中所有容器
docker rm $(docker ps -aq)
删除docker中所有镜像
docker rmi $(docker images -q)
注:如果镜像有容器正在使用,即使是已停止的容器,我们也必须先删除正在运行的容器才能删除镜像
删掉错误的容器和镜像,再按之前的步骤重新打包正确的镜像就可。