±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÍøÂç
,±¾ÎÄÖ÷Òª´Ó 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)ÌåÏÖÔÚÁËÈÝÆ÷ÉÏ¡£ |