水雲涧 發表於 2016-9-1 10:06:00

Docker实践--部署Nodejs应用

<p>  这个例子的目标是为了向大家展示如何在Docker的container里运行Node.js程序。我会先创建一个简单的Node.js web</p>
<p>app,来构建一个镜像。然后基于这个Image运行一个container。从而实现快速部署。</p>
<p>  由于网络的原因我的Node.js镜像从国内的镜像库下载,而不是Docker Hub。</p>
<p>  先从国内的镜像网站上pull下一下nodejs镜像。&nbsp; &nbsp; &nbsp;&nbsp;</p>
<div class="cnblogs_code">
<pre>docker pull hub.c.<span style="color: rgba(128, 0, 128, 1)">163</span>.com/nce2/nodejs:<span style="color: rgba(128, 0, 128, 1)">0.12</span>.<span style="color: rgba(128, 0, 128, 1)">2</span></pre>
</div>
<p><img src="https://images2015.cnblogs.com/blog/342595/201608/342595-20160831175532090-33307017.png" alt=""></p>
<p>  下载完后查看我们的镜像,找到他的名称,等会我们会用到</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201608/342595-20160831175718668-668533927.png" alt=""></p>
<h3>创建Node.js 程序</h3>
<p>  创建package.json,并写入相关信息和依赖</p>
<div class="cnblogs_code">
<pre>vi package.json</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</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)">webtest</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">version</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)">1.0.0</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">description</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)">Node.js on Docker</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">author</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)">lpxxn</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">main</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.js</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">scripts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">start</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)">node server.js</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dependencies</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">express</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)">^4.13.3</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
}</span></pre>
</div>
<p>  创建server.js</p>
<div class="cnblogs_code">
<pre>vi server.js</pre>
</div>
<p>  写一个最简单web 这个web基于express框架,返回Hello word.注意我们监听的是8888端口</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">use strict</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">var</span> express = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">express</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">var</span> PORT = <span style="color: rgba(128, 0, 128, 1)">8888</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">var</span> app =<span style="color: rgba(0, 0, 0, 1)"> express();
app.</span><span style="color: rgba(0, 0, 255, 1)">get</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)">'</span><span style="color: rgba(0, 0, 0, 1)">, function (req, res) {
res.send(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello world\n</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
});

app.listen(PORT);
console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Running on http://localhost:</span><span style="color: rgba(128, 0, 0, 1)">'</span> + PORT);</pre>
</div>
<h3>  创建Dockerfile</h3>
<p>  接下来主角上场了创建Dockerfile文件 这个文件是创建镜像所必须的文件</p>
<div class="cnblogs_code">
<pre>vi Dockerfile</pre>
</div>
<p>  Docker会依照Dockerfile的内容来构建一个镜像。我先给出完整的代码,再一行一行的给出解释</p>
<div class="cnblogs_code">
<pre>FROM hub.c.<span style="color: rgba(128, 0, 128, 1)">163</span>.com/nce2/nodejs:<span style="color: rgba(128, 0, 128, 1)">0.12</span>.<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">

# Create app directory
RUN mkdir </span>-p /home/<span style="color: rgba(0, 0, 0, 1)">Service
WORKDIR </span>/home/<span style="color: rgba(0, 0, 0, 1)">Service

# Bundle app source
COPY . </span>/home/<span style="color: rgba(0, 0, 0, 1)">Service
RUN npm install

EXPOSE </span><span style="color: rgba(128, 0, 128, 1)">8888</span><span style="color: rgba(0, 0, 0, 1)">
CMD [ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">npm</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)">start</span><span style="color: rgba(128, 0, 0, 1)">"</span> ]</pre>
</div>
<p>  我们来一句一句的解释  </p>
<div class="cnblogs_code">
<pre>FROM hub.c.<span style="color: rgba(128, 0, 128, 1)">163</span>.com/nce2/nodejs:<span style="color: rgba(128, 0, 128, 1)">0.12</span>.<span style="color: rgba(128, 0, 128, 1)">2</span></pre>
</div>
<p>  FROM是构建镜像的基础源镜像,hub.c.163.com/nce2/nodejs:0.12.2 这个是镜像的名称,也就是我们一开始从国内服务器上拉下来的那个Image。如果本地没有Docker 会自己pull镜像。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># Create app directory
RUN mkdir </span>-p /home/<span style="color: rgba(0, 0, 0, 1)">Service
WORKDIR </span>/home/Service</pre>
</div>
<p>  第一句RUN 用于在Image里创建一个文件夹,将来用于保存我们的代码。</p>
<p>  第二句WORKDIR是将我们创建的文件夹做为工作目录。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># Bundle app source
COPY . </span>/home/<span style="color: rgba(0, 0, 0, 1)">Service
RUN npm install</span></pre>
</div>
<p>  第一句的COPY是把本机当前目录下的所有文件拷贝到Image的/home/Service文件夹下。</p>
<p>  第二句的RUN 使用npm 安装我们的app据需要的所有依赖。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>EXPOSE <span style="color: rgba(128, 0, 128, 1)">8888</span></pre>
</div>
<p>  由于我们的web app监听的是8888端口,我们把这个端口暴露给主机,这样我就能从外部访问web了。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>CMD [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">npm</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)">start</span><span style="color: rgba(128, 0, 0, 1)">"</span> ]</pre>
</div>
<p>  这个我相信我不用解释你也能看出来他是做什么的。运行npm start命令,这个命令会运行 node service.js来</p>
<p>启动我们的web app。</p>
<h3>构建Image</h3>
<p>&nbsp;  在你Dockerfile文件所在的目录下运行下面的命令来构建一个Image.</p>
<div class="cnblogs_code">
<pre>docker build -t mynodeapp .</pre>
</div>
<p>  别忘了最的的那个点</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201608/342595-20160831191410574-1699280106.png" alt=""></p>
<p>  构建完后查看一下我们的镜像</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201608/342595-20160831191617511-1575309158.png" alt=""></p>
<p>&nbsp;</p>
<h3>&nbsp;运行镜像</h3>
<div class="cnblogs_code">
<pre>docker run -d -p 8888:<span style="color: rgba(128, 0, 128, 1)">8888</span> ac5</pre>
</div>
<p>  &nbsp;-d 表明容器会在后台运行,-p 表示端口映射,把本机的8888商品映射到container的8888端口这样外网就能通过本机的8888商品访问我们的web了。</p>
<p>后面的ac5是我们Image的ID因为前3个就已经能定位出这个Image所以我就没有把后边的再写出来。</p>
<p>  通过docker ps&nbsp;查看我们刚运行的Container的ID</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201609/342595-20160901094702652-918476434.png" alt=""></p>
<p>  打印log &nbsp;7370就是我们的Container ID,和Image ID一样,你也可以全写出来,我比较懒就写前4位,已经足够标识出这个Container了&nbsp;</p>
<div class="cnblogs_code">
<pre>docker logs <span style="color: rgba(128, 0, 128, 1)">7350</span></pre>
</div>
<p>&nbsp;</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201609/342595-20160901094839465-1349892711.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;  如果你想到Container里可以执行下面的命令,进入到里边后就可以像操作普通的linux 一样。如果想退出可执行exit命令。</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201609/342595-20160901095221324-1512902202.png" alt=""></p>
<p>&nbsp;</p>
<h3>&nbsp;测试</h3>
<p>&nbsp;  我们先通过curl 看能不能访问我们的web。</p>
<div class="cnblogs_code">
<pre>curl -i localhost:<span style="color: rgba(128, 0, 128, 1)">8888</span></pre>
</div>
<p><img src="https://images2015.cnblogs.com/blog/342595/201609/342595-20160901095956152-2040716620.png" alt=""></p>
<p>  也可以通过浏览器来看一下</p>
<p><img src="https://images2015.cnblogs.com/blog/342595/201609/342595-20160901100317699-721870770.png" alt=""></p>
<p>  好了,这个小教程到此就结束了,希望能帮助你入门。</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">
<div>作者:李鹏</div>
<div>出处:http://www.cnblogs.com/li-peng/</div>
<div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/li-peng/p/5827104.html
頁: [1]
查看完整版本: Docker实践--部署Nodejs应用