作者 | 周周酱
本文写于2020年1月。首发于周周酱个人博客,转载请注明出处。
这是一篇node部署学习实践的笔记,记录了从ssh连接,环境安装,镜像创建到应用启动的过程。主要为个人学习过程中的一些实操性步骤,概念性以及原理内容可以另外结合文档查看。
知识储备
SSH
SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH远程连接验证方式有两种,一种基于口令验证,但不太安全,我们这里用密钥方式。 用户需要创建一对密钥,把公钥放到需要访问的服务器上,自己保留私钥,当需要连接到SSH服务器上时,客户端软件就会向服务器发出请求,请求使用客户端的密钥进行安全验证。服务器收到请求之后,先在该用户的根目录下寻找公钥,然后把它和发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有的密钥加密“质询”,并把它发送给客户端软件。客户端收到质询之后,就可以用本地的私人密钥解密再把它发送给服务器。这种方式是相当安全的(百度百科)。
Dockerfile创建推送镜像
Dockerfile是由一组指令组成的文件,其中每条命令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定的镜像。Dockerfile指令详解请参考文档dockerfile介绍
- 镜像构建
docker build ``-t`` nginx:test .
基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。
- 列出镜像列表
docker images
- 设置镜像标签
docker tag [``镜像ID]`` nginx``/``test:[镜像版本号]
- 上传镜像
1.登录镜像仓库
docker login
2.推送镜像
docker push [``Docker 账号用户名``]``/[镜像名]``:``[镜像版本号]
- 获取镜像
docker pull [镜像名]``:[镜像版本号]
环境支持
一台阿里云Linux CentOS服务器
ssh登录远程服务器
- 在服务端安装ssh server
sudo yum install openssh-server
- 启动服务
service sshd start
- 客户端使用Bitvise SSH Client,生成密钥
- 将公钥导出
-
将公钥保存到服务器/root/.ssh/authorized_keys文件中
-
客户端登录
- 登录成功
环境准备
mysql
- 下载仓库文件
wget`` http:``//``repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm
yum`` localinstall mysql80-community-release-el7-``1``.noarch.rpm
- mysql安装
yum install mysql-community-server -y
- 查询已安装mysql信息
rpm -qi mysql-community-server.x86_64 ``0``:``8.0``.``18``-1.el7
- 启动mysql服务
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld
- 查找初始密码
cat`` /var/log/mysqld.log | ``grep`` password
- 进入mysql
mysql -uroot -p
- 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码';
docker
- docker安装
yum install -y docker
- 查看docker安装信息
yum list installed |grep docker
- 启动服务
systemctl daemon-reload
service docker start
镜像构建
我们需要部署的项目是一个基于nest cli搭建的简单的web API CURD应用程序,数据库使用的是mysql,orm框架使用的是typeorm。本文的目的主要是部署项目而非项目内容本身,所以这个例子里只有一个模型,一个接口,当部署完成后模型成功同步,并且接口访问无误,则部署成功。
- 项目结构
- 在项目根目录创建dockerfile文件
FROM node:lts AS deps
RUN set -ex && \
npm set progress=false && \
npm config set registry https://registry.npm.taobao.org
WORKDIR /var/app
# -- 编译项目 --
FROM deps AS compiler
COPY package*.json tsconfig*.json ./
COPY src ./src
RUN set -ex && \
npm i --ignore-scripts && \
npm run build
# -- 安装生产依赖 --
FROM deps AS installer
COPY package*.json ./
RUN npm i --production
# -- runtime --
FROM node:lts-slim
LABEL maintainer="zzj <zhjlydia@foxmail.com>"
WORKDIR /var/app
COPY --from=installer /var/app/node_modules ./node_modules
COPY --from=installer /var/app/package*.json ./
COPY --from=compiler /var/app/dist ./dist
COPY ormconfig.json ./ormconfig.json
EXPOSE 3000
CMD ["node", "dist/main"]
以上做了几件事
- 安装编译依赖项,并执行编译
- 安装生产环境依赖项
- 将安装好的依赖项和编译后的dist目录拷贝到最终的镜像里
- 声明运行时容器提供的服务端口
- 指定启动的容器时默认要运行的程序(node dist/main)
- 构建镜像
docker build -t backend-test .
- 查看本地镜像
docker images
镜像已经存在我们本机硬盘中,在本地可以通过docker run 命令来启动容器来跑我们的项目程序。实际上一般会上传到容器镜像仓库中去管理镜像。
上传镜像
- 使用阿里云容器镜像服务,创建一个镜像仓库
- 回到本地docker环境执行操作:
- 登录阿里云Docker Registry
docker login --username=*** registry.cn-hangzhou.aliyuncs.com
- 标记tag
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com``/命名空间``/backend-test:[镜像版本号]
- push镜像
docker push registry.cn-hangzhou.aliyuncs.com``/命名空间``/``backend-test:[镜像版本号]
- 镜像成功上传
启动容器
- 现在基于已经构建上传的镜像来启动容器,从而将项目部署在服务器上。
docker run -d --name backend-test -p 3001:3000 registry.cn-hangzhou.aliyuncs.com/xxx(命名空间)/backend-test:0.0.2
此操作会先拉取镜像,启动容器,执行CMD运行命令node dist/main
- 启动成功后查看容器状态:
docker ps
- 试下站点能否正常访问
接口已能正常返回结果,node项目已经成功部署在linux服务器上。