在Docker快速部署Node.js應(yīng)用的詳細(xì)步驟
一、前言
可能還有一些同學(xué)不了解docker這個(gè)項(xiàng)目,docker是由go語(yǔ)言編寫(xiě)的,一個(gè)快速部署的輕量級(jí)虛擬技術(shù)項(xiàng)目,他允許開(kāi)發(fā)人員將自己的程序和運(yùn)行環(huán)境一起打包,制作成一個(gè)docker的image(鏡像),這樣部署到服務(wù)器上,也只需要下載這個(gè)image就可以將程序跑起來(lái),免去每次都安裝各種依賴(lài)和環(huán)境的麻煩,還能夠做到應(yīng)用程序之間的隔離
二、實(shí)現(xiàn)準(zhǔn)備
我會(huì)先創(chuàng)建一個(gè)簡(jiǎn)單的Node.js web app,來(lái)構(gòu)建一個(gè)鏡像。然后基于這個(gè)Image運(yùn)行一個(gè)container。從而實(shí)現(xiàn)快速部署。
由于網(wǎng)絡(luò)的原因我的Node.js鏡像從國(guó)內(nèi)的鏡像庫(kù)下載,而不是Docker Hub。
先從國(guó)內(nèi)的鏡像網(wǎng)站上pull下一下nodejs鏡像。
docker pull hub.c.163.com/nce2/nodejs:0.12.2
下載完后查看我們的鏡像,找到他的名稱(chēng),等會(huì)我們會(huì)用到
三、創(chuàng)建Node.js 程序
創(chuàng)建package.json,并寫(xiě)入相關(guān)信息和依賴(lài)
vi package.json
{ "name": "webtest", "version": "1.0.0", "description": "Node.js on Docker", "author": "lpxxn", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.13.3" } }
創(chuàng)建server.js
vi server.js
寫(xiě)一個(gè)最簡(jiǎn)單web 這個(gè)web基于express框架,返回Hello word.注意我們監(jiān)聽(tīng)的是8888端口
'use strict'; var express = require('express'); var PORT = 8888; var app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT);
四、創(chuàng)建Dockerfile
接下來(lái)主角上場(chǎng)了創(chuàng)建Dockerfile文件 這個(gè)文件是創(chuàng)建鏡像所必須的文件
vi Dockerfile
Docker會(huì)依照Dockerfile的內(nèi)容來(lái)構(gòu)建一個(gè)鏡像。我先給出完整的代碼,再一行一行的給出解釋
FROM hub.c.163.com/nce2/nodejs:0.12.2 # Create app directory RUN mkdir -p /home/Service WORKDIR /home/Service # Bundle app source COPY . /home/Service RUN npm install EXPOSE 8888 CMD [ "npm", "start" ]
我們來(lái)一句一句的解釋
FROM hub.c.163.com/nce2/nodejs:0.12.2
FROM是構(gòu)建鏡像的基礎(chǔ)源鏡像,hub.c.163.com/nce2/nodejs:0.12.2
這個(gè)是鏡像的名稱(chēng),也就是我們一開(kāi)始從國(guó)內(nèi)服務(wù)器上拉下來(lái)的那個(gè)Image。如果本地沒(méi)有Docker 會(huì)自己pull鏡像。
# Create app directory RUN mkdir -p /home/Service WORKDIR /home/Service
第一句RUN 用于在Image里創(chuàng)建一個(gè)文件夾,將來(lái)用于保存我們的代碼。
第二句WORKDIR是將我們創(chuàng)建的文件夾做為工作目錄。
# Bundle app source COPY . /home/Service RUN npm install
第一句的COPY是把本機(jī)當(dāng)前目錄下的所有文件拷貝到Image的/home/Service文件夾下。
第二句的RUN 使用npm 安裝我們的app據(jù)需要的所有依賴(lài)。
EXPOSE 8888
由于我們的web app監(jiān)聽(tīng)的是8888端口,我們把這個(gè)端口暴露給主機(jī),這樣我就能從外部訪(fǎng)問(wèn)web了。
CMD [ "npm", "start" ]
這個(gè)我相信我不用解釋你也能看出來(lái)他是做什么的。運(yùn)行npm start
命令,這個(gè)命令會(huì)運(yùn)行 node service.js來(lái)
啟動(dòng)我們的web app。
五、構(gòu)建Image
在你Dockerfile文件所在的目錄下運(yùn)行下面的命令來(lái)構(gòu)建一個(gè)Image.
docker build -t mynodeapp .
別忘了最后的的那個(gè)點(diǎn)
構(gòu)建完后查看一下我們的鏡像
六、運(yùn)行鏡像
docker run -d -p 8888:8888 ac5
-d 表明容器會(huì)在后臺(tái)運(yùn)行,-p 表示端口映射,把本機(jī)的8888商品映射到container的8888端口這樣外網(wǎng)就能通過(guò)本機(jī)的8888商品訪(fǎng)問(wèn)我們的web了。
后面的ac5是我們Image的ID因?yàn)榍?個(gè)就已經(jīng)能定位出這個(gè)Image所以我就沒(méi)有把后邊的再寫(xiě)出來(lái)。
通過(guò)docker ps 查看我們剛運(yùn)行的Container的ID
打印log 7370就是我們的Container ID,和Image ID一樣,你也可以全寫(xiě)出來(lái),我比較懶就寫(xiě)前4位,已經(jīng)足夠標(biāo)識(shí)出這個(gè)Container了
docker logs 7350
如果你想到Container里可以執(zhí)行下面的命令,進(jìn)入到里邊后就可以像操作普通的linux 一樣。如果想退出可執(zhí)行exit命令。
七、測(cè)試
我們先通過(guò)curl 看能不能訪(fǎng)問(wèn)我們的web。
curl -i localhost:8888
也可以通過(guò)瀏覽器來(lái)看一下
八、總結(jié)
好了,這個(gè)小教程到此就結(jié)束了,大家都學(xué)會(huì)了嗎?希望這篇文章能幫助你入門(mén)。如果有什么問(wèn)題或者疑問(wèn)可以留言交流。謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
寶塔部署nodejs項(xiàng)目的實(shí)戰(zhàn)步驟
前段時(shí)間部署node項(xiàng)目的時(shí)候出現(xiàn)了一點(diǎn)問(wèn)題,所以想著給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于寶塔部署nodejs項(xiàng)目的實(shí)戰(zhàn)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12測(cè)試驅(qū)動(dòng)ChatGPT編程示例詳解
這篇文章主要為大家介紹了測(cè)試驅(qū)動(dòng)ChatGPT編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03關(guān)于node.js版本npm -v報(bào)錯(cuò)問(wèn)題的解決方法
最近工作中遇到了些問(wèn)題,這里總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于node.js版本npm -v報(bào)錯(cuò)問(wèn)題的解決方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04node.js使用redis儲(chǔ)存session的方法
這篇文章主要介紹了node.js使用redis儲(chǔ)存session的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09