之前筆者弄了一套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)
注:如果鏡像有容器正在使用,即使是已停止的容器,我們也必須先刪除正在運行的容器才能刪除鏡像
刪掉錯誤的容器和鏡像,再按之前的步驟重新打包正確的鏡像就可。