Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¸ßÖÊÁ¿ Node.js ΢·þÎñʵÀýµÄ±àдºÍ²¿Êð
 
  4929  次浏览      27
  2018-5-16 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÍøÂç ,±¾ÎÄÖ÷Òª´Ó Docker ºÍ Node.js ³ö·¢ÁÄһϸßÖÊÁ¿Node.js΢·þÎñµÄ±àдºÍ²¿Êð¡£

΢·þÎñ¼Ü¹¹ÊÇÒ»ÖÖ¹¹ÔìÓ¦ÓóÌÐòµÄÌæ´úÐÔ·½·¨¡£Ó¦ÓóÌÐò±»·Ö½âΪ¸üС¡¢ÍêÈ«¶ÀÁ¢µÄ×é¼þ£¬ÕâʹµÃËüÃÇÓµÓиü¸ßµÄÃô½ÝÐÔ¡¢¿ÉÉìËõÐԺͿÉÓÃÐÔ¡£Ò»¸ö¸´ÔÓµÄÓ¦Óñ»²ð·ÖΪÈô¸É΢·þÎñ£¬Î¢·þÎñ¸üÐèÒªÒ»ÖÖ³ÉÊìµÄ½»¸¶ÄÜÁ¦¡£³ÖÐø¼¯³É¡¢²¿ÊðºÍÈ«×Ô¶¯²âÊÔ¶¼±Ø²»¿ÉÉÙ¡£±àд´úÂëµÄ¿ª·¢ÈËÔ±±ØÐ븺Ôð´úÂëµÄÉú²ú²¿Êð¡£¹¹½¨ºÍ²¿ÊðÁ´ÐèÒªÖØ´ó¸ü¸Ä£¬ÒÔ±ãΪ΢·þÎñ»·¾³ÌṩÕýÈ·µÄ¹Ø×¢µã·ÖÀë¡£ºóÐøÎÒÃÇ»áÁÄÒ»ÏÂÈçºÎÔÚʱËÙÔÆÆ½Ì¨Éϼ¯³É DevOps¡£

Node.js? is a JavaScript runtime built on Chrome¡¯s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js¡¯ package ecosystem, npm, is the largest ecosystem of open source libraries in the world. ¡ª https://nodejs.org

Node.js Êǹ¹½¨Î¢·þÎñµÄÀûÆ÷£¬ÎªÊ²Ã´ÕâÃ´ËµÄØ£¬ÎÒÃÇÏÈ¿´Ï Node.js ÓÐÄÄЩÓÅÊÆ£º

1.Node.js ²ÉÓÃʼþÇý¶¯¡¢Òì²½±à³Ì£¬ÎªÍøÂç·þÎñ¶øÉè¼Æ

2.Node.js ·Ç×èÈûģʽµÄIO´¦Àí¸ø Node.js ´øÀ´ÔÚÏà¶ÔµÍϵͳ×ÊÔ´ºÄÓÃϵĸßÐÔÄÜÓë³öÖڵĸºÔØÄÜÁ¦£¬·Ç³£ÊʺÏÓÃ×÷ÒÀÀµÆäËüIO×ÊÔ´µÄÖмä²ã·þÎñ

3.Node.jsÇáÁ¿¸ßЧ£¬¿ÉÒÔÈÏΪÊÇÊý¾ÝÃܼ¯ÐÍ·Ö²¼Ê½²¿Êð»·¾³ÏµÄʵʱӦÓÃϵͳµÄÍêÃÀ½â¾ö·½°¸¡£

ÕâЩÓÅÊÆÕýºÃÓë΢·þÎñµÄÓÅÊÆ£ºÃô½ÝÐÔ¡¢¿ÉÉìËõÐԺͿÉÓÃÐÔÏàÆõºÏ£¨ÎæÁ³Ð¦£©£¬ÔÙ¿´Ï Node.js µÄȱµã£º

1.µ¥½ø³Ì£¬µ¥Ị̈߳¬Ö»Ö§³Öµ¥ºËCPU£¬²»Äܳä·ÖµÄÀûÓöàºËCPU·þÎñÆ÷¡£Ò»µ©Õâ¸ö½ø³Ì down ÁË£¬ÄÇôÕû¸ö web ·þÎñ¾Í down ÁË

2.Òì²½±à³Ì£¬callback »Øµ÷µØÓü

µÚÒ»¸öȱµã¿ÉÒÔͨ¹ýÆô¶¯¶à¸öʵÀýÀ´ÊµÏÖCPU³ä·ÖÀûÓÃÒÔ¼°¸ºÔؾùºâ£¬»°ËµÕâ²»ÊÇ K8s µÄÔ­Éú¹¦ÄÜÂð¡£µÚ¶þ¸öȱµã¸ü²»ÊÇʶù£¬ÏÖÔÚ¿ÉÒÔͨ¹ý generator¡¢promiseµÈÀ´Ð´Í¬²½´úÂ룬ˬµÄ²»Òª²»ÒªµÄ¡£

ÏÂÃæÎÒÃÇÖ÷Òª´Ó Docker ºÍ Node.js ³ö·¢ÁÄһϸßÖÊÁ¿Node.js΢·þÎñµÄ±àдºÍ²¿Êð£º

1.Node.js Òì²½Á÷³Ì¿ØÖÆ£ºgenerator Óë promise

2.Express¡¢Koa µÄÒì³£´¦Àí

3.ÈçºÎ±àд Dockerfile

4.΢·þÎñ²¿Êð¼° DevOps ¼¯³É

1 Node.js Òì²½Á÷³Ì¿ØÖÆ£ºGenerator Óë Promise

Node.js µÄÉè¼Æ³õÖÔΪÁËÐÔÄܶøÒì²½£¬ÏÖÔÚÒѾ­¿ÉÒÔдͬ²½µÄ´úÂëÁË£¬ÄãÔìÂð£¿Ä¿Ç° Node.js µÄLTS°æ±¾Ôç¾ÍÖ§³ÖÁËGenerator, PromiseÕâÁ½¸öÌØÐÔ£¬Ò²ÓÐÐí¶àÓÅÐãµÄµÚÈý·½¿â bluebird¡¢q ÕâÑùµÄÄ£¿éÖ§³ÖµÄÒ²·Ç³£ºÃ£¬ÐÔÄÜÉõÖÁ±ÈÔ­ÉúµÄ»¹ºÃ£¬¿ÉÒÔÓà bluebird Ìæ»» Node.js Ô­ÉúµÄ Promise:

global.Promise = require('bluebird')

blurbird µÄÐÔÄÜÊÇ V8 ÀïÄÚÖÃµÄ Promise 3 ±¶×óÓÒ£¨bluebird µÄÓÅ»¯·½Ê½¼û https://github.com/petkaantonov/bluebird/wiki/Optimization-killers £©¡£

1.1 ES2015 Generator

Generators are functions which can be exited and later re-entered. Their context (variable bindings) will be saved across re-entrances. ¡ª https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*

generator ¾ÍÏñÒ»¸öÈ¡ºÅ»ú£¬Äã¿ÉÒÔͨ¹ýȡһÕÅÆ±À´Ïò»úÆ÷ÇëÇóÒ»¸öºÅÂë¡£Äã½ÓÊÕÁËÄãµÄºÅÂ룬µ«ÊÇ»úÆ÷²»»á×Ô¶¯ÎªÄãÌṩÏÂÒ»¸ö¡£»»¾ä»°Ëµ£¬È¡Æ±»ú¡°ÔÝÍ£¡±Ö±µ½ÓÐÈËÇëÇóÁíÒ»¸öºÅÂë(next())£¬´ËʱËü²Å»áÏòºóÔËÐС£ÏÂÃæÎÒÃÇ¿´Ò»¸ö¼òµ¥µÄʾÀý£º

function* idMaker(){
var index = 0
while(index < 3)
yield index++
}

var gen = idMaker()

gen.next() // {value: 0, done: false}
gen.next() // {value: 1, done: false}
gen.next() // {value: 2, done: false}
gen.next() // {value: undefined, done: true}
// ...

´ÓÉÏÃæµÄ´úÂëµÄÊä³ö¿ÉÒÔ¿´³ö:

1.generator º¯ÊýµÄ¶¨Ò壬ÊÇͨ¹ý function *(){} ʵÏÖµÄ

2.¶Ô generator º¯ÊýµÄµ÷Ó÷µ»ØµÄʵ¼ÊÊÇÒ»¸ö±éÀúÆ÷£¬Ëæºó´úÂëͨ¹ýʹÓñéÀúÆ÷µÄ next() ·½·¨À´»ñµÃº¯ÊýµÄÊä³ö

3.ͨ¹ýʹÓÃyieldÓï¾äÀ´ÖÐ¶Ï generator º¯ÊýµÄÔËÐУ¬²¢ÇÒ¿ÉÒÔ·µ»ØÒ»¸öÖмä½á¹û

4.ÿ´Îµ÷ÓÃnext()·½·¨£¬generator º¯Êý½«Ö´Ðе½ÏÂÒ»¸öyieldÓï¾ä»òÕßÊÇreturnÓï¾ä¡£

ÏÂÃæÎÒÃǾͶÔÉÏÃæ´úÂëµÄÿ´Înextµ÷ÓýøÐÐÒ»¸öÏêϸµÄ½âÊÍ£º

1.µÚ1´Îµ÷ÓÃnext()·½·¨µÄʱºò£¬º¯ÊýÖ´Ðе½µÚÒ»´ÎÑ­»·µÄyield index++Óï¾äÍ£ÁËÏÂÀ´£¬²¢ÇÒ·µ»ØÁË0Õâ¸övalue£¬ËæÍ¬value·µ»ØµÄdoneÊôÐÔ±íÃ÷ generator º¯ÊýµÄÔËÐл¹Ã»ÓнáÊø

2.µÚ2´Îµ÷ÓÃnext()·½·¨µÄʱºò£¬º¯ÊýÖ´Ðе½µÚ¶þÑ­»·µÄyield index++Óï¾äÍ£ÁËÏÂÀ´£¬²¢ÇÒ·µ»ØÁË1Õâ¸övalue£¬ËæÍ¬value·µ»ØµÄdoneÊôÐÔ±íÃ÷ generator º¯ÊýµÄÔËÐл¹Ã»ÓнáÊø

¡­ ¡­

3.µÚ4´Îµ÷ÓÃnext()·½·¨µÄʱºò£¬ÓÉÓÚÑ­»·ÒѾ­½áÊøÁË£¬ËùÒÔº¯Êýµ÷ÓÃÁ¢¼´·µ»Ø£¬doneÊôÐÔ±íÃ÷ generator º¯ÊýÒѾ­½áÊøÔËÐУ¬valueÊÇundefinedµÄ£¬ÒòΪÕâ´Îµ÷Óò¢Ã»ÓÐÖ´ÐÐÈκÎÓï¾ä

PS: Èç¹ûÔÚ generator º¯ÊýÄÚ²¿ÐèÒªµ÷ÓÃÁíÍâÒ»¸ö generator º¯Êý£¬ÄÇô¶ÔÄ¿±êº¯ÊýµÄµ÷ÓþÍÐèҪʹÓÃyield*¡£

1.2 ES2015 Promise

The Promise object is used for asynchronous computations. A Promise represents an operation that hasn¡¯t completed yet, but is expected in the future. ¡ª https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Ëùν Promise£¬¾ÍÊÇÒ»¸ö¶ÔÏó£¬ÓÃÀ´´«µÝÒì²½²Ù×÷µÄÏûÏ¢¡£Ëü´ú±íÁËij¸öδÀ´²Å»áÖªµÀ½á¹ûµÄʼþ£¨Í¨³£ÊÇÒ»¸öÒì²½²Ù×÷£©£¬²¢ÇÒÕâ¸öʼþÌṩͳһµÄ API£¬¿É¹©½øÒ»²½´¦Àí¡£

Ò»¸ö Promise Ò»°ãÓÐ3ÖÖ״̬£º

1.pending: ³õʼ״̬, ²»ÊÇfulfilled£¬Ò²²»ÊÇrejected.

2.fulfilled: ²Ù×÷³É¹¦Íê³É.

3.rejected: ²Ù×÷ʧ°Ü.

Ò»¸ö Promise µÄÉúÃüÖÜÆÚÈçÏÂͼ£º

ÏÂÃæÎÒÃÇ¿´Ò»¶Î¾ßÌå´úÂ룺

function asyncFunction() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world')
}, 16)
})
}

asyncFunction().then(function (value) {
console.log(value) // => 'Async Hello world'
}).catch(function (error) {
console.log(error)
})

asyncFunction Õâ¸öº¯Êý»á·µ»Ø Promise ¶ÔÏó£¬ ¶ÔÓÚÕâ¸ö Promise ¶ÔÏó£¬ÎÒÃǵ÷ÓÃËüµÄthen ·½·¨À´ÉèÖÃresolveºóµÄ»Øµ÷º¯Êý£¬catch·½·¨À´ÉèÖ÷¢Éú´íÎóʱµÄ»Øµ÷º¯Êý¡£

¸Ã Promise ¶ÔÏó»áÔÚsetTimeoutÖ®ºóµÄ16msʱ±»resolve, ÕâʱthenµÄ»Øµ÷º¯Êý»á±»µ÷Ó㬲¢Êä³ö ¡®Async Hello world¡¯ ¡£

ÔÚÕâÖÖÇé¿öÏÂcatchµÄ»Øµ÷º¯Êý²¢²»»á±»Ö´ÐУ¨ÒòΪ Promise ·µ»ØÁËresolve£©£¬ ²»¹ýÈç¹ûÔËÐл·¾³Ã»ÓÐÌṩ setTimeout º¯ÊýµÄ»°£¬ÄÇôÉÏÃæ´úÂëÔÚÖ´ÐÐÖоͻá²úÉúÒì³££¬ÔÚ catch ÖÐÉèÖõĻص÷º¯Êý¾Í»á±»Ö´ÐС£

С½á

Èç¹ûÊDZàдһ¸ö SDK »ò API£¬ÍƼöʹÓô«Í³µÄ callback »òÕß Promise£¬²»Ê¹Óà generator µÄÔ­ÒòÊÇ£º

1.generator µÄ³öÏÖ²»ÊÇΪÁ˽â¾öÒì²½ÎÊÌâ

2.ʹÓà generator ÊǻᴫȾµÄ£¬µ±Äã³¢ÊÔyieldһϵÄʱºò£¬ËüÒªÇóÄãÒ²±ØÐëÔÚÒ»¸ö generator function ÄÚ

£¨¡¶ÈçºÎÓà Node.js ±àдһ¸ö API ¿Í»§¶Ë¡·@leizongmin£©

ÓÉ´Ë¿´À´Ñ§Ï° Promise ÊÇË®µ½Çþ³ÉµÄÊÂÇé¡£

2 Express¡¢Koa µÄÒì³£´¦Àí

Ò»¸öÓѺõĴíÎó´¦Àí»úÖÆÓ¦¸ÃÂú×ãÈý¸öÌõ¼þ:

1.¶ÔÓÚÒý·¢Òì³£µÄÓû§£¬·µ»Ø 500 Ò³Ãæ

2.ÆäËûÓû§²»ÊÜÓ°Ï죬¿ÉÒÔÕý³£·ÃÎÊ

3.²»Ó°ÏìÕû¸ö½ø³ÌµÄÕý³£ÔËÐÐ

ÏÂÃæÎÒÃǾÍÒÔÕâÈý¸öÌõ¼þΪԭÔò£¬¾ßÌå½éÉÜÏ Express¡¢Koa ÖеÄÒì³£´¦Àí£º

2.1 Express Òì³£´¦Àí

ÔÚ Express ÖÐÓÐÒ»¸öÄÚÖõĴíÎó´¦ÀíÖмä¼þ£¬Õâ¸öÖмä¼þ»á´¦ÀíÈκÎÓöµ½µÄ´íÎó¡£Èç¹ûÄãÔÚ Express Öд«µÝÁËÒ»¸ö´íÎó¸ønext()£¬¶øÃ»ÓÐ×Ô¼º¶¨ÒåµÄ´íÎó´¦Àíº¯Êý´¦ÀíÕâ¸ö´íÎó£¬Õâ¸ö´íÎó¾Í»á±» Express ĬÈϵĴíÎó´¦Àíº¯Êý²¶»ñ²¢´¦Àí£¬¶øÇÒ»á°Ñ´íÎóµÄ¶ÑÕ»ÐÅÏ¢·µ»Øµ½¿Í»§¶Ë£¬ÕâÑùµÄ´íÎó´¦ÀíÊǷdz£²»ÓѺõ쬻¹ºÃÎÒÃÇ¿ÉÒÔͨ¹ýÉèÖÃNODE_ENV»·¾³±äÁ¿Îªproduction£¬ÕâÑù Express ¾Í»áÔÚÉú²ú»·¾³Ä£Ê½ÏÂÔËÐÐÓ¦Óã¬Éú²ú»·¾³Ä£Ê½Ï Express ²»»á°Ñ´íÎóµÄ¶ÑÕ»ÐÅÏ¢·µ»Øµ½¿Í»§¶Ë¡£

ÔÚ Express ÏîÄ¿ÖпÉÒÔ¶¨ÒåÒ»¸ö´íÎó´¦ÀíµÄÖмä¼þÓÃÀ´Ìæ»» Express ĬÈϵĴíÎó´¦Àíº¯Êý£º

app.use(errorHandler)
function errorHandler(err, req, res, next) {
if (res.headersSent) {
return next(err)
}
res.status(500)
switch(req.accepts(['html', 'json'])) {
case 'html':
res.render('error', { error: err })
break
default:
res.send('500 Internal Server Error')
}
}

ÔÚËùÓÐÆäËûapp.use()ÒÔ¼°Â·ÓÉÖ®ºóÒýÈëÒÔÉÏ´úÂ룬¿ÉÒÔÂú×ãÒÔÉÏÈý¸öÓѺôíÎó´¦ÀíÌõ¼þ£¬ÊÇÒ»Öַdz£ÓѺõĴíÎó´¦Àí»úÖÆ¡£

2.2 Koa Òì³£´¦Àí

ÎÒÃÇÒÔKoa 1.xΪÀý£¬¿´´úÂ룺

app.use(function *(next) {
try {
yield next
} catch (err) {
this.status = err.status || 500
this.body = err
this.app.emit('error', err, this)
}
})

°ÑÉÏÃæµÄ´úÂë·ÅÔÚËùÓÐapp.use()º¯ÊýÇ°Ãæ£¬ÕâÑù»ù±¾ÉÏËùÓеÄͬ²½´íÎó¾ù»á±» try{} catch(err){} ²¶»ñµ½ÁË£¬¾ßÌåÔ­Àí´ó¼Ò¿ÉÒÔÁ˽âÏ Koa Öмä¼þµÄ»úÖÆ¡£

2.3 δ²¶»ñµÄÒì³£ uncaughtException

ÉÏÃæµÄÁ½ÖÖÒì³£´¦Àí·½·¨£¬Ö»Äܲ¶»ñͬ²½´íÎ󣬶øÒì²½´úÂë²úÉúµÄ´íÎó²ÅÊÇÖÂÃüµÄ£¬uncaughtException´íÎó»áµ¼Öµ±Ç°µÄËùÓÐÓû§Á¬½Ó¶¼±»Öжϣ¬ÉõÖÁ²»ÄÜ·µ»ØÒ»¸öÕý³£µÄHTTP ´íÎóÂ룬Óû§Ö»Äܵȵ½ä¯ÀÀÆ÷³¬Ê±²ÅÄÜ¿´µ½Ò»¸öno data received´íÎó¡£

ÕâÊÇÒ»Öַdz£Ò°Âù´Ö±©µÄÒì³£´¦Àí»úÖÆ£¬ÈκÎÏßÉÏ·þÎñ¶¼²»Ó¦¸ÃÒòΪuncaughtException µ¼Ö·þÎñÆ÷±ÀÀ£¡£ÔÚNode.js ÎÒÃÇ¿ÉÒÔͨ¹ýÒÔÏ´úÂë²¶»ñ uncaughtException´íÎó£º

process.on('uncaughtException', function (err) {
console.error('Unexpected exception: ' + err)
console.error('Unexpected exception stack: ' + err.stack)
// Do something here:
// Such as send a email to admin
// process.exit(1)
})

²¶»ñuncaughtExceptionºó£¬Node.js µÄ½ø³Ì¾Í²»»áÍ˳ö£¬µ«Êǵ± Node.js Å׳öuncaughtExceptionÒ쳣ʱ¾Í»á¶ªÊ§µ±Ç°»·¾³µÄ¶ÑÕ»£¬µ¼Ö Node.js ²»ÄÜÕý³£½øÐÐÄÚ´æ»ØÊÕ¡£Ò²¾ÍÊÇ˵£¬Ã¿Ò»´Î¡¢uncaughtException ¶¼ÓпÉÄܵ¼ÖÂÄÚ´æÐ¹Â¶¡£¼ÈÈ»Èç´Ë£¬Í˶øÇóÆä´Î£¬ÎÒÃÇ¿ÉÒÔÔÚÂú×ãǰÁ½¸öÌõ¼þµÄÇé¿öÏÂÍ˳ö½ø³ÌÒÔ±ãÖØÆô·þÎñ¡£µ±È»»¹¿ÉÒÔÀûÓÃdomainÄ£¿é×ö¸üϸÖµÄÒì³£´¦Àí£¬ÕâÀï¾Í²»×ö½éÉÜÁË¡£

3 ÈçºÎ±àд Dockerfile

3.1 »ù´¡¾µÏñÑ¡Ôñ

ÎÒÃÇÏÈÑ¡Óà Node.js ¹Ù·½ÍƼöµÄnode:argon¹Ù·½LTS°æ±¾×îоµÏñ£¬¾µÏñ´óСΪ656.9 MB(½âѹºó´óС£¬ÏÂÎÄÌáµ½µÄ¾µÏñ´óСûÓÐÌØÊâ˵Ã÷µÄ¾ùÖ¸½âѹºóµÄ´óС)

The first thing we need to do is define from what image we want to build from. Here we will use the latest LTS (long term support) version argon of node available from the Docker Hub ¡ª https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

ÎÒÃÇÊÂÏÈдºÃÁËÁ½¸öÎļþpackage.json, app.js:

{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "Zhangpc <zhangpc@tenxcloud.com>",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.13.3"
}
}

 

// app.js
'use strict';

const express = require('express')

// Constants
const PORT = 8080

// App
const app = express()
app.get('/', function (req, res) {
res.send('Hello world\n')
})

app.listen(PORT)
console.log('Running on http://localhost:' + PORT)

ÏÂÃæ¿ªÊ¼±àд Dockerfile£¬ÓÉÓÚÖ±½Ó´Ó Dockerhub À­È¡¾µÏñËٶȽÏÂý£¬ÎÒÃÇÑ¡ÓÃʱËÙÔÆµÄdocker¹Ù·½¾µÏñ docker_library/node£¬ÕâЩ¹Ù·½¾µÏñ¶¼ÊÇÓë Dockerhub ʵʱͬ²½µÄ:

# Dockerfile.argon
FROM index.tenxcloud.com/docker_library/node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

# Expose port
EXPOSE 8080
CMD [ "npm", "start" ]

Ö´ÐÐÒÔÏÂÃüÁî½øÐй¹½¨£º

docker build -t zhangpc/docker_web_app:argon .

×îÖյõ½µÄ¾µÏñ´óСÊÇ660.3 MB£¬Ìå»ýÂÔ´ó£¬Docker ÈÝÆ÷µÄÓÅÊÆÊÇÇáÁ¿ºÍ¿ÉÒÆÖ²£¬ËùÒÔ³ÐÔØËüµÄ²Ù×÷ϵͳ¼´»ù´¡¾µÏñÒ²Ó¦¸ÃÓ­ºÏÕâ¸öÌØÐÔ£¬ÓÚÊÇÎÒÏëµ½ÁËAlpine Linux£¬Ò»¸öÃæÏò°²È«µÄ£¬ÇáÁ¿µÄ Linux ·¢Ðа棬»ùÓÚ musl libcºÍbusybox¡£

ÏÂÃæÎÒÃÇʹÓÃalpine:edge×÷Ϊ»ù´¡¾µÏñ£¬¾µÏñ´óСΪ4.799 MB£º

# Dockerfile.alpine
FROM index.tenxcloud.com/docker_library/alpine:edge

# Install node.js by apk
RUN echo '@edge http://nl.alpinelinux.org/alpine/edge/main' >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN apk add --no-cache nodejs-lts@edge

# If you have native dependencies, you'll need extra tools
# RUN apk add --no-cache make gcc g++ python

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# If your project depends on many package, you can use cnpm instead of npm
# RUN npm install cnpm -g --registry=https://registry.npm.taobao.org
# RUN cnpm install

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

# Expose port
EXPOSE 8080

CMD [ "npm", "start" ]

Ö´ÐÐÒÔÏÂÃüÁî½øÐй¹½¨£º

docker build -t zhangpc/docker_web_app:alpine .

×îÖյõ½µÄ¾µÏñ´óСÊÇ31.51 MB£¬×ã×ãËõСÁË20±¶£¬ÔËÐÐÁ½¸ö¾µÏñ¾ù²âÊÔͨ¹ý¡£

3.2 »¹ÓÐÓÅ»¯µÄ¿Õ¼äÂð£¿

Ê×ÏÈ£¬´óСÉÏ»¹ÊÇ¿ÉÒÔÓÅ»¯µÄ£¬ÎÒÃÇÖªµÀ Dockerfile µÄÿÌõÖ¸Áî¶¼»á½«½á¹ûÌύΪеľµÏñ£¬ÏÂÒ»ÌõÖ¸Á»á»ùÓÚÉÏÒ»²½Ö¸ÁîµÄ¾µÏñµÄ»ù´¡ÉϹ¹½¨£¬ËùÒÔÈç¹ûÎÒÃÇÒªÏëÇå³ý¹¹½¨¹ý³ÌÖвúÉúµÄ»º´æ£¬¾ÍµÃ±£Ö¤²úÉú»º´æµÄÃüÁîºÍÇå³ý»º´æµÄÃüÁîÔÚͬһÌõ Dockerfile Ö¸ÁîÖУ¬Òò´ËÐÞ¸Ä Dockerfile ÈçÏ£º

# Dockerfile.alpine-mini
FROM index.tenxcloud.com/docker_library/alpine:edge

# Create app directory and bundle app source
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app

# Install node.js and app dependencies
RUN echo '@edge http://nl.alpinelinux.org/alpine/edge/main' >> /etc/apk/repositories \
&& apk update && apk upgrade \
&& apk add --no-cache nodejs-lts@edge \
&& npm install \
&& npm uninstall -g npm \
&& rm -rf /tmp/* \
&& rm -rf /root/.npm/

# Expose port
EXPOSE 8080

CMD [ "node", "app.js" ]

Ö´ÐÐÒÔÏÂÃüÁî½øÐй¹½¨£º

docker build -t zhangpc/docker_web_app:alpine

×îÖյõ½µÄ¾µÏñ´óСÊÇ21.47 MB£¬ËõСÁË10M¡£

Æä´Î£¬ÎÒÃÇ·¢ÏÖÔÚ¹¹½¨¹ý³ÌÖÐÓÐһЩÒÀÀµÊÇ»ù±¾²»±äµÄ£¬ÀýÈç°²×° Node.js ÒÔ¼°ÏîÄ¿ÒÀÀµ£¬ÎÒÃÇ¿ÉÒÔ°ÑÕâЩ²»±äµÄÒÀÀµ¼¯³ÉÔÚ»ù´¡¾µÏñÖУ¬ÕâÑù¿ÉÒÔ´ó·ùÌáÉý¹¹½¨ËÙ¶È£¬»ù±¾ÉÏÊÇÃë¼¶¹¹½¨¡£µ±È»Ò²¿ÉÒÔ°ÑÕâЩ»ù±¾²»±äµÄÖ¸ÁÖÐÔÚ Dockerfile µÄÇ°Ãæ²¿·Ö£¬²¢±£³ÖÇ°Ãæ²¿·Ö²»±ä£¬ÕâÑù¾Í¿ÉÒÔÀûÓûº´æÌáÉý¹¹½¨ËÙ¶È¡£

×îºó£¬Èç¹ûʹÓÃÁË Express ¿ò¼Ü£¬ÔÚ¹¹½¨Éú²ú»·¾³¾µÏñʱ¿ÉÒÔÉèÖÃNODE_ENV»·¾³±äÁ¿Îªproduction£¬¿ÉÒÔ´ó·ùÌáÉýÓ¦ÓõÄÐÔÄÜ£¬»¹ÓÐÆäËûÖî¶àºÃ´¦£¬ÏÂÃæ»áÓнéÉÜ¡£

С½á

ÎÒÃǹ¹½¨µÄÈý¸ö¾µÏñ´óС¶Ô±È¼ûÉÏͼ£¬¾µÏñµÄ´óСԽС£¬·¢²¼µÄʱºòÔ½¿ì½Ý£¬¶øÇÒ¿ÉÒÔÌá¸ß°²È«ÐÔ£¬ÒòΪ¸üÉٵĴúÂëºÍ³ÌÐòÔÚÈÝÆ÷ÖÐÒâζןüСµÄ¹¥»÷Ãæ¡£Ê¹ÓÃnode:argon×÷Ϊ»ù´¡¾µÏñ¹¹½¨³öµÄ¾µÏñ£¨tag Ϊ argon£©Ñ¹ËõºóµÄ´óС´ó¸ÅΪ254 MB£¬Ò²²»ÊǺܴó£¬Èç¹û¶ÔAlpine LinuxÐÄ´æ¹ËÂǵÄͯЬ¿ÉÒÔÑ¡Óà Node.js ¹Ù·½ÍƼöµÄnode:argon×÷Ϊ»ù´¡¾µÏñ¹¹½¨Î¢·þÎñ¡£

4 ΢·þÎñ²¿Êð¼° devops ¼¯³É

²¿Êð΢·þÎñʱÓÐÒ»¸öÔ­Ôò£ºÒ»¸öÈÝÆ÷ÖÐÖ»·ÅÒ»¸ö·þÎñ£¬¿ÉÒÔʹÓÃstack ±àÅŰѸ÷¸ö΢·þÎñ×éºÏ³ÉÒ»¸öÍêÕûµÄÓ¦Óãº

4.1 Dokcer »·¾³Î¢·þÎñ²¿Êð

°²×°ºÃ Docker »·¾³ºó£¬Ö±½ÓÔËÐÐÎÒÃǹ¹½¨ºÃµÄÈÝÆ÷¼´¿É£º

docker run -d --restart=always -p 8080:8080 --name docker_web_app_alpine zhangpc/docker_web_app:alpine

4.2 ʹÓÃʱËÙÔÆÆ½Ì¨¼¯³É DevOps

ʱËÙÔÆÄ¿Ç°Ö§³Ögithub¡¢gitlab¡¢bitbucket¡¢coding µÈ´úÂë²Ö¿â£¬²¢ÒÑʵÏÖÍêÈ«ÓÉAPI½ÓÈëÊÚȨ¡¢webhookµÈ£¬Ö»ÒªÄ㿪·¢Ê±Ê¹ÓõÄÊÇÕâЩ´úÂë²Ö¿â£¬¶¼¿ÉÒÔ½ÓÈëʱËÙÔÆµÄ CI/CD ·þÎñ£º

ÏÂÃæÎÒÃǼòµ¥½éÉÜϽÓÈëÁ÷³Ì£º

1.´´½¨ÏîÄ¿£¬²Î¿¼Îĵµ http://doc.tenxcloud.com/doc/v1/ci/project-add.html

2.¿ªÆôCI

1.¸ü¸Ä´úÂë²¢Ìá½»£¬ÏîÄ¿×Ô¶¯¹¹½¨

2.Óù¹½¨³öÀ´µÄ¾µÏñ£¨tagΪmaster£©´´½¨Ò»¸öÈÝÆ÷

3.¿ªÆôCD£¬²¢°ó¶¨¸Õ¸Õ´´½¨µÄÈÝÆ÷

4.¸ü¸Ä´úÂ룬²âÊÔ DevOps

ÎÒÃÇ¿ÉÒÔ¿´µ½´úÂë¸ü¸ÄÒѾ­¾­¹ý¹¹½¨£¨CI£©¡¢²¿Êð(CD)ÌåÏÖÔÚÁËÈÝÆ÷ÉÏ¡£

   
4929 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì