- javascript
- koa.js
- docker
Docker
docker是一个开源的应用容器引擎,可以为我们提供安全、可移植、可重复的自动化部署的方式。docker采用虚拟化的技术来虚拟化出应用程序的运行环境。此种方式具有以下优势:
-
每个部署的应用程序都是一个容器,彼此隔离,互不影响;
-
服务器只需要安装docker即可运行构建好的应用程序镜像,不会涉及复杂的服务器环境配置,因为配置都在特定的应用程序所在的镜像中去配置即可;
-
简化了自动化部署和运维的繁琐流程,只需将构建好的镜像load到服务器的docker中即可运行我们的应用程序;
-
可以充分利用服务器的系统资源,一台服务器上可以同时运行多个容器;
docker采用的是c/s架构,Client通过接口与Server进程通信实现容器的构建,运行和发布。docker比较重要的三个核心概念如下:
镜像(images):一个只读的模板,可以理解为应用程序的运行环境,包含了程序运行所依赖的环境和基本配置,镜像可以按照层级(从基础镜像开始)来构建,每一层包含特定的环境。
仓库(repository):一个用于存放镜像文件的仓库,如果你对git的仓库熟悉,应该很容易理解,对,就是那个。有私有仓库和公有仓库之分。
容器(container):一个运行应用程序的虚拟容器,在我们运行镜像时产生。容器包含自己的文件系统+隔离的进程空间和包含其中的进程。
前言
sharplook是一款通过大数据分析来解决客户在监控系统中存在的数据采集难、解析难、处理难的IT运维产品。在给客户部署产品的过程中涉及到比较多的环境配置和组件安装以及复杂的依赖项,这些繁琐的流程降低了安装部署的效率和产品质量。基于此,我们开发了一款可以快速便捷的安装部署套件,提供一种漂亮的安装部署流程。产品采用 Nuxt + Koa 的基础架构进行开发,其中采用nuxt来提供SSR(服务端渲染)功能,Nuxt.js是基于Vue.js的通用架构,其中集成了以下组件:
-
Vue2
-
Vue-Router
-
Vuex
-
Vue-Meta
另外,Nuxt.js 使用 Webpack 和 vue-loader 、 babel-loader 来处理代码的自动化构建工作(如打包、代码分层、压缩等等)。
我们项目使用Nuxt.js作为中间件来进行UI渲染,使用Koa启动我们自己的服务器,koa2 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。
关于如何快速搭建这样一个项目,小生之前在《vue-cli “从入门到放弃”》中介绍过vue-cli的使用,这个项目我们通过vue-cli工具,使用 模板,快速构建出来。具体的代码逻辑,在此不做赘述。
关于为什么选择docker来部署我们的node服务,前面已经介绍了,我们基于node的web应用涉及到的部署环境并不复杂,仅仅需要Node.js作为平台即可,由于依赖的包文件太多,而且比较大,业界还没有特别好用的开源node打包工具。做前端的同学都知道,webpack是一个功能强大的资源加载构建的打包工具,只需要将项目文件打包到一个dist文件下,打包后的文件体量小,解决了文件之间的依赖问题,提取出公共代码库,生产环境只需要部署dist文件夹即可。然而,Nodejs程序涉及到的依赖包,和资源却没法进行打包,node服务开启后仅仅是一个node进程而已。那么我们如何部署node程序呢?既然没法打包,只能将其全部文件进行部署(虽然可能存在别的问题,小生也在研究中,大神可以给点建议),于是小生就希望将其放入docker中去部署,免去生产环境node版本不一致等问题。下面小生就将如何用docker来部署Node项目的过程分享给诸位。
实战
以下将进入战备状态,请同志们准备好大脑和电脑,跟着我左手、右手一个慢动作。
环境准备
-
安装docker,未安装的同学,请根据自己的开发环境采用不同的安装方式去安装,具体操作参考教程,不做赘述。
-
安装成功后,可以通过查看版本号(尽量使用最新的稳定版本)。
项目准备
-
在你的项目根目录下,添加Dockerfile文件,此文件用来配置我们自定义一个镜像所需要指定的依赖项、环境以及执行的命令等。内容格式如下:
-
关于文件中的关键字,解释如下:
-
FROM
-
MAINTAINER
-
ADD
-
WORKDIR
-
RUN
-
ENV
-
EXPOSE
-
CMD
其中还有其他的一些关键字:USER、ENTRYPOINT、VOLUME、ONBUILD等,如果你有兴趣可以自行研究。
-
-
在项目根目录下添加文件,此文件的作用类似文件,可以忽略掉添加进镜像中的文件,写法、格式和一样,一行代表一个忽略。本项目添加的忽略如下:
构建镜像
-
查看目前本地docker的镜像
-
cd 到项目根目录下,执行以下命令
是镜像名,是镜像的版本号,到此你已经成功构建了一个新的镜像,你可以通过,查看你的镜像。
-
启动镜像,测试是否成功。
中表示后台运行,表示指定本地的9000端口隐射到容器内的8000端口。 为我们要运行的镜像。通过查看docker的进程(容器的运行本身就是一种特殊的进程)运行情况,发现我们的容器已经在运行。本地可以访问。
通过可以查看我们容器内应用进程的运行日志。
上传镜像(这里用上传到公共仓库来演示)
-
没注册DockerHub的同学,请注册DockerHub
-
登录docker
-
上传之前必须给镜像打上tag,可以指定为你的docker Id
-
将镜像上传至docker的公共仓库
-
上传成功后, 退出,登录 查看上传的镜像。
下载镜像
-
通过下载我们的镜像。
生产部署
前面说了,我们可以将上传到仓库的镜像下载下来部署,但是如果镜像比较大或者部署环境压根无法联网,你是不是要跪了。所以我们采取另一种方法,将开发好的镜像直接打包保存到安装盘里面,到客户生产环境再将镜像包上传并加载到服务器的docker中即可。
-
在开发环境打包,
这里会发现目录下生成了deploy.tar的文件。部署时将此文件copy到生产环境服务器上。
-
确保生产服务器上已经安装了docker,若没装,请参考相关文档,若不装,对不起小生也无力了,然后在服务器上加载上传的镜像包。
加载成功后,即可看到加载的镜像
-
运行镜像,成功后,在外部访问服务器的9000端口,
-
可以进入容器中执行,方便我们查看内部文件和调试
-
战功,访问部署的docker应用,,效果如下图: