记一次docker部署node项目的过程

1,902 阅读5分钟

作者 | 周周酱

本文写于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,生成密钥

微信图片_20191230202608.png

微信图片_20191230202805.png

  • 将公钥导出

微信图片_20191230202808.png

  • 将公钥保存到服务器/root/.ssh/authorized_keys文件中

  • 客户端登录

微信图片_20191230203202.png

  • 登录成功

微信图片_20191230203626.png

环境准备

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 微信图片_20191228230259.png

  • 启动服务

systemctl daemon-reload service docker start

镜像构建

我们需要部署的项目是一个基于nest cli搭建的简单的web API CURD应用程序,数据库使用的是mysql,orm框架使用的是typeorm。本文的目的主要是部署项目而非项目内容本身,所以这个例子里只有一个模型,一个接口,当部署完成后模型成功同步,并且接口访问无误,则部署成功。

  • 项目结构

微信图片_20191229210343.png

  • 在项目根目录创建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"]

以上做了几件事

  1. 安装编译依赖项,并执行编译
  2. 安装生产环境依赖项
  3. 将安装好的依赖项和编译后的dist目录拷贝到最终的镜像里
  4. 声明运行时容器提供的服务端口
  5. 指定启动的容器时默认要运行的程序(node dist/main)
  • 构建镜像

docker build -t backend-test .

微信图片_20191228213228_看图王.png

  • 查看本地镜像

docker images 微信图片_20191230103628.png

镜像已经存在我们本机硬盘中,在本地可以通过docker run 命令来启动容器来跑我们的项目程序。实际上一般会上传到容器镜像仓库中去管理镜像。

上传镜像

  • 使用阿里云容器镜像服务,创建一个镜像仓库

微信图片_20191229224458.png

  • 回到本地docker环境执行操作:
  1. 登录阿里云Docker Registry

docker login --username=*** registry.cn-hangzhou.aliyuncs.com

  1. 标记tag

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com``/命名空间``/backend-test:[镜像版本号]

  1. push镜像

docker push registry.cn-hangzhou.aliyuncs.com``/命名空间``/``backend-test:[镜像版本号]

  • 镜像成功上传

微信图片_20191229224835.png

启动容器

  • 现在基于已经构建上传的镜像来启动容器,从而将项目部署在服务器上。

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

微信图片_20191230105618.png

  • 试下站点能否正常访问

微信图片_20191230105940.png

接口已能正常返回结果,node项目已经成功部署在linux服务器上。