Docker最全教程之使用Node.js搭建团队技术文档站(二十三)
<h1>前言 </h1><p>各种编程语言均有其优势和生态,有兴趣的朋友完全可以涉猎多门语言。在平常的工作之中,也可以尝试选择相对适合的编程语言来完成相关的工作。</p>
<p>在团队技术文档站搭建这块,笔者尝试了许多框架,最终还是选择了Hexo,主要是由于其丰富的主题和插件,并且灵活和高度可定制化,改起来也非常方便。我们团队文档站即使用Hexo来构建,并且基于容器配置了完整的代码流水线:docs.xin-lai.com</p>
<p>如果对站点配置、主题、插件存在疑问,可以加群沟通。</p>
<hr>
<h1> 目录</h1>
<ul>
<li><strong><span style="font-size: 16px">官方镜像 </span></strong></li>
<li><strong><span style="font-size: 16px">编写一个简单的Web服务器 </span></strong></li>
</ul>
<ol>
<li>编码 </li>
<li>编写Dockerfile </li>
<li>构建并运行 </li>
</ol>
<ul>
<li><strong><span style="font-size: 16px">使用Hexo搭建团队技术文档站 </span></strong></li>
</ul>
<ol>
<li>安装 </li>
<li>初始化 </li>
<li>配置站点信息 </li>
<li>生成静态文件 </li>
<li>使用hexo-server进行托管 </li>
<li>使用容器构建和托管 </li>
</ol><hr>
<p> Node.js 是一个基于 Chrome V8 引擎构建的JavaScript运行环境,是一个让JavaScript能够运行在服务端的开发平台。Node.js可以方便地搭建响应速度快、易于扩展的Web应用。Node.js 使用事件驱动, 非阻塞I/O模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。</p>
<p>Node.js的诞生给前端开发人员带来了极大的惊喜,传统的Web 开发者,前端使用JavaScript进行编程,服务器端代码得用另外一种语言,比如Java、.NET、PHP 等等。但是 Node.js 出现之后,前端开发者使用JavaScript就可以前后端通吃了。</p>
<hr>
<h2>官方镜像</h2>
<p>官方镜像地址:https://hub.docker.com/_/node</p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605093938921-1966213243.png" alt=""></p>
<p> </p>
<hr>
<h2 class="Figure"> 编写一个简单的Web服务器</h2>
<h3 class="FirstParagraph">1.编码</h3>
<p class="FirstParagraph">使用Node.js编写一个简单的Web服务器非常简单,主要需要用到http模块,http模块主要用于搭建 HTTP 服务端和客户端,全部代码如下所示:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 加载http模块</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> http = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置端口</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> port = <span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建Web服务器</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> server = http.createServer((req, res) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置响应的状态码</span>
<span style="color: rgba(0, 0, 0, 1)">
res.statusCode </span>= <span style="color: rgba(128, 0, 128, 1)">200</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置响应的请求头</span>
<span style="color: rgba(0, 0, 0, 1)">
res.setHeader(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Type</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">text/plain</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置响应输出文本</span>
<span style="color: rgba(0, 0, 0, 1)">
res.end(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello World !</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置Web服务器监听端口</span>
<span style="color: rgba(0, 0, 0, 1)">
server.listen(port);</span></pre>
</div>
<p> </p>
<h3>2.编写Dockerfile</h3>
<p class="FirstParagraph">Dockerfile文件如下所示:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">#指定node镜像的版本
FROM node:</span><span style="color: rgba(128, 0, 128, 1)">8.9</span>-<span style="color: rgba(0, 0, 0, 1)">alpine
#对外暴露的端口
EXPOSE </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
# 复制文件
COPY . .
# 运行
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">app.js</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
<p> </p>
<h3>3.构建并运行</h3>
<p class="FirstParagraph">构建命令如下所示:</p>
<div class="cnblogs_code">
<pre>docker build --rm -f <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dockerfile</span><span style="color: rgba(128, 0, 0, 1)">"</span> -t nodetest1:latest .</pre>
</div>
<p class="FirstParagraph"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094047389-1483730082.png" alt=""></p>
<p> </p>
<p class="FirstParagraph">运行:</p>
<div class="cnblogs_code">
<pre>docker run --rm -p <span style="color: rgba(128, 0, 128, 1)">4000</span>:<span style="color: rgba(128, 0, 128, 1)">80</span> nodetest1:latest</pre>
</div>
<p class="FirstParagraph"> <img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094104353-1794724542.png" alt=""></p>
<p>在日常开发中,一些简单的脚本的编写,为了避免反复的构建过程,大家同样可以参考PHP一节,然后直接运行Node.js的镜像来执行Node.js的脚本。</p>
<p>参考脚本如下所示:</p>
<div class="cnblogs_code">
<pre>docker run -it --<span style="color: rgba(0, 0, 0, 1)">rm `
</span>--name node-running-<span style="color: rgba(0, 0, 0, 1)">script `
</span>-v D:\temp\node:/usr/src/<span style="color: rgba(0, 0, 0, 1)">myapp `
</span>-w /usr/src/<span style="color: rgba(0, 0, 0, 1)">myapp `
node:</span><span style="color: rgba(128, 0, 128, 1)">8.9</span>-alpine node app.js</pre>
</div>
<hr>
<h2>使用Hexo搭建团队技术文档站</h2>
<p>Hexo 是一个快速、简洁且高效的博客(不仅仅是博客)框架,他可以使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。我们可以用其来搭建博客、文档站点或者其他官网。接下来,我们将使用Hexo来搭建团队技术文档站。之所以选择Hexo,主要原因如下:</p>
<ul>
<li>主题丰富</li>
</ul>
<p>Hexo的主题很多,我们在官网就能找到很多可用的主题,而且均已开源,如下所示:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094129365-329576907.png" alt=""></p>
<p> </p>
<ul>
<li>插件丰富</li>
</ul>
<p>在官网,我们就可以找到很多各种各样的插件,比如搜索、字数统计、自动分类、百度网址提交、静态资源压缩等等各种各样的开源插件:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094146850-1078114879.png" alt=""></p>
<p> </p>
<ul>
<li>灵活可扩展</li>
</ul>
<p>无论是主题还是插件,均为开源。相关主题的修改也非常简单,您只要具备一定的JavaScript和Html的知识,就可以完成对主题和插件的修改。</p>
<ul>
<li>支持对Markdown进行渲染</li>
</ul>
<p>无论是搭建博客还是技术文档站,使用Markdown进行文章编写都是需要优先考虑的。团队成员仅需提交Markdown,就可以生成一个漂亮美观的静态站点,这是一件多么惬意的事情啊!</p>
<p class="FirstParagraph">接下来,我们就演示如何一步一步的使用Hexo来构建团队技术站点:</p>
<h3>1.安装</h3>
<p class="FirstParagraph">在安装Hexo之前,我们先必须安装好以下内容:</p>
<ul>
<li>Node.js (Node.js的版本不得小于6.9)</li>
<li>Git</li>
</ul>
<p class="FirstParagraph">接下来,我们仅需使用以下命令来安装Hexo:</p>
<p>npm install -g hexo-cli</p>
<p>npm是Node.js的包管理工具,在安装Node.js时会顺带安装好,通过以上命令,我们将使用npm全局安装(安装到全局目录)hexo-cli。</p>
<h3>2.初始化</h3>
<p class="FirstParagraph">接下来,我们可以开始使用Hexo建站了。首先我们需要进行一些站点初始化的工作:</p>
<p>hexo init <folder></p>
<p>目录为选填,不填则默认当前目录。</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094231028-1949045222.png" alt=""></p>
<p class="FirstParagraph">初始化完成之后,就可以看到目标目录下多了很多内容:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094251354-1213858004.png" alt=""></p>
<p class="FirstParagraph">接下来,我们使用npm管理工具进行安装相关包:</p>
<p>npm install</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094304321-1101638272.png" alt=""></p>
<h3>3.配置站点信息</h3>
<p class="FirstParagraph">在根目录下,我们可以找到“_config.yml”文件,通过修改该文件,我们可以在此配置大部分参数:</p>
<p class="Figure"> <img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094317210-1447356732.png" alt=""></p>
<p class="FirstParagraph">具体配置信息见官网说明:https://hexo.io/zh-cn/docs/configuration</p>
<h3>4.生成静态文件</h3>
<p class="FirstParagraph">默认情况下,Hexo进行站点初始化时,已经完成了默认主题(landscape)和内容(hello-world.md)的设置,我们可以直接执行以下命令来生成静态文件:</p>
<p>hexo generate</p>
<p class="Figure"> <img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094339622-1781505243.png" alt=""></p>
<p class="FirstParagraph">执行之后,我们可以在“public”目录看到以下静态文件:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094402952-1740165348.png" alt=""></p>
<p class="FirstParagraph">我们还可以使用命令“hexo deploy”来部署站点,比如部署到GitHub然后使用GitHub进行托管。Hexo支持多种部署方式,具体见官网:https://hexo.io/zh-cn/docs/deployment</p>
<h3>5.使用hexo-server进行托管</h3>
<p class="FirstParagraph">我们也可以使用官方组件hexo-server进行托管我们的静态站点,在使用之前,我们得先进行安装:</p>
<p>npm install hexo-server –save</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094422522-761926481.png" alt=""></p>
<p class="FirstParagraph">安装完成后,就可以使用以下命令来启动web服务器来进行查看了:</p>
<p>hexo server -p 5000</p>
<p>-p参数用于指定端口,默认端口为4000:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094444286-628281689.png" alt=""></p>
<p class="FirstParagraph">接下来,我们就可以用浏览器直接打开这个地址进行访问了:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094459014-579771308.png" alt=""></p>
<p class="FirstParagraph">至此,一个简单的静态站点就搭建好了。我们可以配置导航链接,或者使用主题和插件来支持各种自定义的功能。例如如下所示的站点:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094522077-1036773995.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094541416-166006234.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094559944-125135981.png" alt=""></p>
<h3>6.使用容器构建和托管</h3>
<p class="FirstParagraph">初步了解Hexo之后,我们可以使用Docker来构建和托管我们的站点。主体参考流程如下所示:</p>
<p class="Figure"><img src="https://img2018.cnblogs.com/blog/70544/201906/70544-20190605094617289-577190855.png" alt=""></p>
<p class="FirstParagraph">以上流程仅供参考,TeamCity的配置请参考DevOps相关章节。</p>
<p>Dockerfile文件如下所示:</p>
<div class="cnblogs_code">
<pre>FROM node:<span style="color: rgba(128, 0, 128, 1)">10.15</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(0, 0, 0, 1)">alpine
# 设置标签
LABEL author</span>=雪雁 email=xinlai@xin-lai.com site=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.xin-lai.com</span>
<span style="color: rgba(0, 0, 0, 1)">
# 设置容器内端口
EXPOSE </span><span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 0, 0, 1)">
# 添加目录
ADD . </span>/<span style="color: rgba(0, 0, 0, 1)">app
# 设置当前工作目录
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app
# 复制文件
COPY . .
# 设置npm并且使用npm安装hexo以及相关插件,然后生成静态页并且安装hexo</span>-<span style="color: rgba(0, 0, 0, 1)">server
RUN npm config </span><span style="color: rgba(0, 0, 255, 1)">set</span> <span style="color: rgba(0, 0, 255, 1)">unsafe</span>-perm <span style="color: rgba(0, 0, 255, 1)">true</span> &&<span style="color: rgba(0, 0, 0, 1)"> \
npm config </span><span style="color: rgba(0, 0, 255, 1)">set</span> registry https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">registry.npm.taobao.org && \</span>
<span style="color: rgba(0, 0, 0, 1)">
npm install </span>-g hexo-cli &&<span style="color: rgba(0, 0, 0, 1)"> \
# hexo clean </span>&&<span style="color: rgba(0, 0, 0, 1)"> \
cd src </span>&&<span style="color: rgba(0, 0, 0, 1)"> \
npm install hexo </span>--save &&<span style="color: rgba(0, 0, 0, 1)"> \
npm install hexo</span>-neat --save &&<span style="color: rgba(0, 0, 0, 1)"> \
npm install </span>--save hexo-wordcount &&<span style="color: rgba(0, 0, 0, 1)"> \
npm i </span>-S hexo-prism-plugin &&<span style="color: rgba(0, 0, 0, 1)"> \
npm install hexo</span>-generator-search --save &&<span style="color: rgba(0, 0, 0, 1)"> \
npm i hexo</span>-permalink-pinyin --save &&<span style="color: rgba(0, 0, 0, 1)"> \
hexo generate </span>&&<span style="color: rgba(0, 0, 0, 1)"> \
npm install hexo</span>-server --<span style="color: rgba(0, 0, 0, 1)">save
# 设置工作目录
WORKDIR src
# 使用hexo</span>-<span style="color: rgba(0, 0, 0, 1)">server托管静态文件
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hexo</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">server</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-p</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">8000</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
<p> </p>
<hr>
<p> </p>
<div class="ace-line gutter-noauthor text-align-type-justify pap-stylesheet-name-normal emptyGutter">
<h2><strong>往期内容链接</strong></h2>
</div>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(一)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(二)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(三)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(四)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(五)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(六)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(七)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——从理论到实战(八)</span></p>
<div class="ace-line gutter-noauthor text-align-type-justify pap-stylesheet-name-normal emptyGutter">
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之使用Tencent Hub来完成CI(九)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——数据库容器化(十)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——数据库容器化之持久保存数据(十一)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——MongoDB容器化(十二)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程——Redis容器化以及排行榜实战(十三)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之Ubuntu下安装Docker(十四)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之树莓派和Docker(十五)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之使用TeamCity来完成内部CI、CD流程(十六)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之使用Docker搭建Java开发环境(十七)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之Go实战,墙裂推荐(十八)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之使用.NET Core推送钉钉消息(十九)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之使用 Visual Studio Code玩转Docker(二十)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之Python爬网实战(二十一)</span></p>
<p class="postTitle"><span style="font-size: 14px">Docker最全教程之使用PHP搭建个人博客站点(二十二)</span></p>
</div>
</div>
<div id="MySignature" role="contentinfo">
作者:雪雁<br>出处:http://www.cnblogs.com/codelove/
<br>如果喜欢作者的文章,请关注【CodeSpirit-码灵】公众号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。<br><b>静听鸟语花香,漫赏云卷云舒。</b>
<br>
<img src="https://images.cnblogs.com/cnblogs_com/codelove/315887/o_251224070213_%E5%85%AC%E4%BC%97%E5%8F%B7.jpg" width="100" height="100"><br><br>
来源:https://www.cnblogs.com/codelove/p/10977916.html
頁:
[1]