Upload
seokjun-kim
View
690
Download
0
Embed Size (px)
Citation preview
dockerize node.js applicationshipping node.js application with docker
김석준 @SOCAR
YOU CAN DOCKERIZE YOUR APPLICATION TOMORROW
WHY WHAT HOW
WHY WHAT HOW
WHY?
EASIER ENVIRONMENT SETUP
SINGLE-THREADED in MULTI-CORE
FAST AND EASY TO ROLLBACK
MICROSERVICE
VIRTUALIZATION
EASIER ENVIRONMENT SETUP
Application Server
EASIER ENVIRONMENT SETUPTRADITIONAL WAY
$curl-sLhttps://deb.nodesource.com/setup_6.x|sudo-Ebash-
$sudoapt-getupdate$sudoapt-getinstallnodejs
…
$echo“debhttp://nginx.org/packages/debian/squeezenginx”>>/etc/apt/sources.list$echo“deb-srchttp://nginx.org/packages/debian/squeezenginx”>>/etc/apt/sources.list
$sudoapt-getinstallnginx
…
$sudoapt-getinstallntpvimfail2ban
…
$vi/etc/nginx/site-enabled/node.conf$nginx-sreload
…
$mkdir/home/alma/app&&cd/home/alma/app
$gitpull…&&npminstall
$npmrunbuild
$npmrunserve
EASIER ENVIRONMENT SETUP
Application
Servers
EASIER ENVIRONMENT SETUP
$curl-sLhttps://deb.nodesource.com/setup_6.x|sudo-Ebash-
$sudoapt-getupdate$sudoapt-getinstallnodejs
…
$echo“debhttp://nginx.org/packages/debian/squeezenginx”>>/etc/apt/sources.list$echo“deb-srchttp://nginx.org/packages/debian/squeezenginx”>>/etc/apt/sources.list
$sudoapt-getinstallnginx
…
$sudoapt-getinstallntpvimfail2ban
…
$vi/etc/nginx/site-enabled/node.conf$nginx-sreload
…
$mkdir/home/alma/app&&cd/home/alma/app
$gitpull…&&npminstall
$npmrunbuild
$npmrunserveX3
TRADITIONAL WAY
EASIER ENVIRONMENT SETUP
Application
Many Servers
EASIER ENVIRONMENT SETUP
“이러려고 개발자 하려고 했나 자괴감 들고 괴로워”
TRADITIONAL WAY
“I really didn’t want to be a developer to do this”
SINGLE-THREADED in MULTI-CORE
MULTICORESingle-threaded
in
SINGLE-THREADED in MULTI-CORECLUSTER
varcluster=require('cluster');if(cluster.isMaster){varnumWorkers=require('os').cpus().length;console.log('Masterclustersettingup'+numWorkers+'workers...');for(vari=0;i<numWorkers;i++){cluster.fork();}cluster.on('online',function(worker){console.log('Worker'+worker.process.pid+'isonline');});cluster.on('exit',function(worker,code,signal){console.log('Worker'+worker.process.pid+'diedwithcode:'+code+',andsignal:'+signal);console.log('Startinganewworker');cluster.fork();});}else{varapp=require('express')();app.all('/*',function(req,res){res.send('process'+process.pid+'sayshello!').end();})varserver=app.listen(8000,function(){console.log('Process'+process.pid+'islisteningtoallincomingrequests');});}
@https://www.sitepoint.com/how-to-create-a-node-js-cluster-for-speeding-up-your-apps/
SIMPLICITY
SINGLE-THREADED in MULTI-CORECLUSTER
TOO COMPLICATED
VIRTUALIZATION
STAGINGDEV
LIVEPHYSICAL
LIVEDB
VIRTUALIZATION
STAGINGLOCAL LIVECLOUDDEV
LIVEPHYSICAL
LIVEDB
VIRTUALIZATION
STAGINGLOCAL
LIVECLOUD
DEV
LIVEPHYSICAL
STAGINGDB
LIVEDB
REPLICADB
VIRTUALIZATION
STAGINGLOCAL
LIVECLOUD
DEV
LIVEPHYSICAL
STAGINGDB
REPLICADB
LIVEDB
environment variables
environment variables
environment variables
VIRTUALIZATION
STAGINGLOCAL
LIVECLOUD
DEV
LIVEPHYSICAL
STAGINGDB
REPLICADB
environment variables
LIVEDB #1
LIVEDB #2
LIVECLOUD
LIVECLOUD
CRONenvironment variables
environment variables
VIRTUALIZATIONUNABLE TO TRACK ENVIRONMENTS
MICROSERVICE
SOCARAPP API BACK
OFFICE API
ZEROCARAPP API BACK
OFFICE API
MAKE IT DETACHABLE
MICROSERVICE
BACKOFFICE API API
BACKOFFICE API API
APICRON
MAKE IT DETACHABLE
MICROSERVICEMAKE IT DETACHABLE
BACKOFFICE API API
BACKOFFICE API API
APICRON
FAST AND EASY TO ROLLBACKDEVELOPMENT REQUIREMENT
WE NEED TO ROLLBACK
SERIOUSLY
WHY WHAT HOW
BEFORE WHAT
VM DOCKER
WHAT IS DOCKER?
@http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01/01
VM DOCKER
WHAT IS DOCKER?
@http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01/01
WHAT IS DOCKER?
WHAT IS DOCKER?
LIGHT VIRTUAL MACHINE
VMs
SERVER
IMAGE CONTAINER
WHAT IS DOCKER?MEANWHILE IN DOCKER WORLD
Windows 8 PCs
@CPU by Creative Stall from the Noun Project
WHAT IS DOCKER?IMAGE
BASEUBUNTU, ALPINE, CENTOS …
DEPENDENCIESVIM, CURL, NODE.JS, PYTHON …
APPLICATIONSOURCE CODE, ENVIRONMENT …
START SCRIPTBASH, MAKEFILE, NPM START …
WHAT IS DOCKER?CONTAINER
INFORMATIONNAME, PORT …
SETUPRESTART, DAEMON, LINK …
HOST RELATEDVOLUME, NETWORK …
PROCESSNODE …
WHY WHAT HOW
EASIER ENVIRONMENT SETUPUNABLE TO VERSION CONTROL
$curl-sLhttps://deb.nodesource.com/setup_6.x|sudo-Ebash-
$sudoapt-getupdate$sudoapt-getinstallnodejs
…
$echo“debhttp://nginx.org/packages/debian/squeezenginx”>>/etc/apt/sources.list$echo“deb-srchttp://nginx.org/packages/debian/squeezenginx”>>/etc/apt/sources.list
$sudoapt-getinstallnginx
…
$sudoapt-getinstallntpvimfail2ban
…
$vi/etc/nginx/site-enabled/node.conf$nginx-sreload
…
$mkdir/home/alma/app&&cd/home/alma/app
$gitpull…&&npminstall
$npmrunbuild
$npmrunserve
EASIER ENVIRONMENT SETUPDOCKERIZED WAY
FROMnode:6
RUN\apt-getupdate--force-yes-y&&\mkdir-p/src
COPYpackage.json/src/package.json
RUN\apt-getupdate--force-yes-y&&\apt-getinstall--force-yes-yvim
RUN\cd/src;npminstall--production
COPY./src
RUN\cd/src;npmrunbuild
EXPOSE3000
ENVNODE_ENVproductionENVDBliveENVTZAsia/Seoul
WORKDIR/src
CMDnpmrunserve
Dockerfile
EASIER ENVIRONMENT SETUPDOCKERIZED WAY
$dockerbuild-tnode-docker.
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutaminuteago654.5MB
EASIER ENVIRONMENT SETUPOFFICIAL NODE Dockerfile
FROMbuildpack-deps:jessie
RUNgroupadd-rnode&&useradd-r-gnodenode
#gpgkeyslistedathttps://github.com/nodejs/nodeRUNset-ex\&&forkeyin\9554F04D7259F04124DE6B476D5A82AC7E37093B94AE36675C464D64BAFA68DD7434390BDBE9B9C5\0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93FD3A5288F042B6850C66B31F09FE44734EB7990E\71DCFD284A79C3B38668286BC97EC7A07EDE3FC1DD8F2338BAE7501E3DD5AC78C273792F7D83545D\B9AE9905FFD7803F25714661B63B535A4C206CA9C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8\;do\gpg--keyserverha.pool.sks-keyservers.net--recv-keys"$key";\done
ENVNPM_CONFIG_LOGLEVELinfoENVNODE_VERSION6.9.1
RUNcurl-SLO"https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"\&&curl-SLO"https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"\&&gpg--batch--decrypt--outputSHASUMS256.txtSHASUMS256.txt.asc\&&grep"node-v$NODE_VERSION-linux-x64.tar.xz\$"SHASUMS256.txt|sha256sum-c-\&&tar-xJf"node-v$NODE_VERSION-linux-x64.tar.xz"-C/usr/local--strip-components=1\&&rm"node-v$NODE_VERSION-linux-x64.tar.xz"SHASUMS256.txt.ascSHASUMS256.txt\&&ln-s/usr/local/bin/node/usr/local/bin/nodejs
CMD["node"]
Dockerfile
EASIER ENVIRONMENT SETUPDOCKERIZED WAY
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutaminuteago654.5MB
$dockerrun--namedocker-instance-1--port80:3000node-docker
SINGLE-THREADED in MULTI-COREEASY TO SCALE
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutaminuteago654.5MB
$dockerrun--namedocker-instance-1--port80:3000node-docker
$dockerrun--namedocker-instance-2--port81:3000node-docker
$dockerrun--namedocker-instance-3--port82:3000node-docker
.
.
.
SINGLE-THREADED in MULTI-COREEASY TO SCALE
http{upstreamapplication{least_conn;serverlocalhost:80max_fails=3fail_timeout=60s;serverlocalhost:81max_fails=3fail_timeout=60s;serverlocalhost:82max_fails=3fail_timeout=60s;}
server{listen80;
location/{proxy_passhttp://application;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection'upgrade';proxy_set_headerHost$host;proxy_cache_bypass$http_upgrade;}}}
nginx.conf
MICROSERVICEDOCKER-COMPOSE
version:'2'
services:application:container_name:applicationimage:node-docker
docker-compose.yml
MICROSERVICEDOCKER-COMPOSE
version:'2'
services:application:container_name:applicationimage:node-docker
redis:container_name:redisimage:redis
docker-compose.yml
MICROSERVICEDOCKER-COMPOSE
version:'2'
services:application:container_name:applicationimage:node-docker
redis:container_name:redisimage:redis
nginx:container_name:nginximage:nginxports:-80:80-443:443
docker-compose.yml
MICROSERVICEDOCKER-COMPOSE
version:'2'
services:application:container_name:applicationimage:node-docker
application-alt:container_name:applicationimage:node-docker
redis:container_name:redisimage:redis
nginx:container_name:nginximage:nginxports:-80:80-443:443
docker-compose.yml
MICROSERVICEDOCKER-COMPOSE
version:'2'
services:application:container_name:applicationimage:node-docker
application-alt:container_name:applicationimage:node-docker
redis:container_name:redisimage:redis
nginx:container_name:nginxbuild:./nginxrestart:alwayslinks:-application-1:application-application-2:application-altports:-80:80-443:443depends_on:-application-application-alt
docker-compose.yml
FAST AND EASY TO ROLLBACKBUILD WITH TAG
$dockerbuild-tnode-docker.
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5M
$dockerbuild-tnode-docker:1982.
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5MBnode-docker198210394kdfksf1Aboutaminuteago654.5MB
FAST AND EASY TO ROLLBACKBUILD WITH TAG
$dockerbuild-tnode-docker.
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5M
$dockerbuild-tnode-docker:1982.
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5MBnode-docker198210394kdfksf1Aboutaminuteago654.5MB
FAST AND EASY TO ROLLBACK
FAST AND EASY TO ROLLBACKDOCKER HUB
https://hub.docker.com/r/library/node/tags/
WHY WHAT HOW
YOU CAN DOCKERIZE YOUR APPLICATION TOMORROW
$npminit-f
$npmi-Sexpressuuid
DOCKERIZESTART WITH EXPRESS
DOCKERIZESTART WITH EXPRESS
varexpress=require('express');varuuid=require('uuid');
varapp=express();varid=uuid.v4();varport=3000;
app.get('/',function(req,res){res.send(id)});
app.listen(port,function(){console.log('Exampleapplisteningonport:'+port);});
index.js
DOCKERIZEBUILD DOCKER IMAGE
node_modules/
.dockerignore
DOCKERIZE
FROMnode:6
COPYpackage.json/src/package.json
RUNcd/src;npminstall
COPY./src
EXPOSE3000
WORKDIR/src
CMDnodeindex.js
Dockerfile
BUILD DOCKER IMAGE
$dockerbuild--tagnode-nginx:test.
SendingbuildcontexttoDockerdaemon7.168kBStep1:FROMnode:66:Pullingfromlibrary/node357ea8c3d80b:Alreadyexists52befadefd24:Alreadyexists3c0732d5313c:Pullcompleteceb711c7e301:Pullcomplete868b1d0e2aad:Pullcomplete61d10f626f84:PullcompleteDigest:sha256:12899eea666e85f23e9850bd3c309b1ee28dd0869f554a7a6895fc962d9094a3Status:Downloadednewerimagefornode:6--->800da22d0e7bStep2:COPYpackage.json/src/package.json--->7f3344975b1eRemovingintermediatecontainerae1d0482e982Step3:RUNcd/src;npminstall--production--->Runningin222a0585301b
...
Successfullybuilt08a5b1c92fcf
BUILD DOCKER IMAGEDOCKERIZE
$dockerrun--namenode-nginx-instance-p3000:3000node-nginx:test
Exampleapplisteningonport:3000
$dockerps
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES30179995521cnode-nginx:test"/bin/sh-c'nodeind"AboutaminuteagoUpAboutaminute0.0.0.0:3000->3000/tcpnode-nginx-instance
BUILD DOCKER IMAGEDOCKERIZE
$dockerrun-d--namenode-nginx-instance-0-p3000:3000node-nginx:test
$dockerrun-d--namenode-nginx-instance-1-p3001:3000node-nginx:test
$dockerrun-d--namenode-nginx-instance-2-p3002:3000node-nginx:test
RUN 3 DOCKER CONTAINERDOCKERIZE
worker_processes1;
events{worker_connections1024;}
http{upstreamnode-app{least_conn;serverlocalhost:3000;serverlocalhost:3001;serverlocalhost:3002;}
server{listen80;
location/{proxy_passhttp://node-app;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection'upgrade';proxy_set_headerHost$host;proxy_cache_bypass$http_upgrade;}}}
LOAD-BALANCING WITH NGINX
nginx/nginx.conf
DOCKERIZE
FROMnginx
COPYnginx.conf/etc/nginx/nginx.conf
LOAD-BALANCING WITH NGINX
nginx/Dockerfile
DOCKERIZE
$dockerbuild--tagnode-nginx-lb:test.
$dockerrun-d--namenode-nginx-instance-lb-p4000:80node-nginx-lb:test
LOAD-BALANCING WITH NGINXDOCKERIZE
DOCKERIZE
NOOOOOOOOT WORKING
WHAT THE…
DOCKERIZEI RUINED PLAYNODE
$dockerrm-f$(dockerps-a-q)
LINK CONTAINERSDOCKERIZE
version:'2'
services:nginx:container_name:node-nginx-lbbuild:./nginxlinks:-app-1:app-1-app-2:app-2-app-3:app-3ports:-3000:80depends_on:-app-1-app-2-app-3
app-1:container_name:node-nginx-1image:node-nginx:testports:-3000
app-2:container_name:node-nginx-2image:node-nginx:testports:-3000
LINK CONTAINERSDOCKERIZE
app-3:container_name:node-nginx-3image:node-nginx:testports:-3000
docker-compose.yml
...
upstreamnode-app{least_conn;serverapp-1:3000max_fails=3fail_timeout=30s;serverapp-2:3000max_fails=3fail_timeout=30s;serverapp-3:3000max_fails=3fail_timeout=30s;}
...
LINK CONTAINERSDOCKERIZE
nginx/nginx.conf
$cd..
$docker-composeup
Recreatingnode-nginx-3Recreatingnode-nginx-1Recreatingnode-nginx-2Recreatingnode-nginx-lbAttachingtonode-nginx-1,node-nginx-2,node-nginx-3,node-nginx-lbnode-nginx-1|Exampleapplisteningonport:3000node-nginx-2|Exampleapplisteningonport:3000node-nginx-3|Exampleapplisteningonport:3000node-nginx-lb|172.19.0.1--[22/Aug/2016:16:07:32+0000]"GET/HTTP/1.1"20036"-""Mozilla/5.0(Macintosh;IntelMacOSX10_12)AppleWebKit/602.1.50(KHTML,likeGecko)Version/10.0Safari/602.1.50"node-nginx-lb|172.19.0.1--[22/Aug/2016:16:07:32+0000]"GET/HTTP/1.1"20036"-""Mozilla/5.0(Macintosh;IntelMacOSX10_12)AppleWebKit/602.1.50(KHTML,likeGecko)Version/10.0Safari/602.1.50"node-nginx-lb|172.19.0.1--[22/Aug/2016:16:07:33+0000]"GET/HTTP/1.1"20036"-""Mozilla/5.0(Macintosh;IntelMacOSX10_12)AppleWebKit/602.1.50(KHTML,likeGecko)Version/10.0Safari/602.1.50"node-nginx-lb|172.19.0.1--[22/Aug/2016:16:07:33+0000]"GET/HTTP/1.1"20036"-""Mozilla/5.0(Macintosh;IntelMacOSX10_12)AppleWebKit/602.1.50(KHTML,likeGecko)Version/10.0Safari/602.1.50"
LINK CONTAINERSDOCKERIZE
DOCKERIZE
AND THEN…
CLUSTERINGCONTAINER ORCHESTRATION
SWARM KUBERNATES
CLUSTERINGDOCKER SWARM
MONITORINGDOCKER STATS
$dockerstatsdetermined_shockleydetermined_wozniakprickly_hypatia
CONTAINERCPU%MEMUSAGE/LIMITMEM%NETI/Odetermined_shockley0.00%884KiB/1.961GiB0.04%648B/648Bdetermined_wozniak0.00%1.723MiB/1.961GiB0.09%1.266KiB/648Bprickly_hypatia0.00%740KiB/1.961GiB0.04%1.898KiB/648B
MONITORINGKITEMATIC FOR MAC (BETA)
MONITORINGDATADOG
CLOUDDOCKER CLOUD
CLOUDAWS ECS
– from Twitter
“Dockerize all the things!”