84
dockerize node.js application shipping node.js application with docker 김석준 @SOCAR

Dockerize node.js application

Embed Size (px)

Citation preview

Page 1: Dockerize node.js application

dockerize node.js applicationshipping node.js application with docker

김석준 @SOCAR

Page 2: Dockerize node.js application

YOU CAN DOCKERIZE YOUR APPLICATION TOMORROW

Page 3: Dockerize node.js application

WHY WHAT HOW

Page 4: Dockerize node.js application

WHY WHAT HOW

Page 5: Dockerize node.js application

WHY?

EASIER ENVIRONMENT SETUP

SINGLE-THREADED in MULTI-CORE

FAST AND EASY TO ROLLBACK

MICROSERVICE

VIRTUALIZATION

Page 6: Dockerize node.js application

EASIER ENVIRONMENT SETUP

Application Server

Page 7: Dockerize node.js application

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

Page 8: Dockerize node.js application

EASIER ENVIRONMENT SETUP

Application

Servers

Page 9: Dockerize node.js application

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

Page 10: Dockerize node.js application

EASIER ENVIRONMENT SETUP

Application

Many Servers

Page 11: Dockerize node.js application

EASIER ENVIRONMENT SETUP

“이러려고 개발자 하려고 했나 자괴감 들고 괴로워”

TRADITIONAL WAY

“I really didn’t want to be a developer to do this”

Page 12: Dockerize node.js application

SINGLE-THREADED in MULTI-CORE

MULTICORESingle-threaded

in

Page 13: Dockerize node.js application

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/

Page 14: Dockerize node.js application

SIMPLICITY

Page 15: Dockerize node.js application

SINGLE-THREADED in MULTI-CORECLUSTER

TOO COMPLICATED

Page 16: Dockerize node.js application

VIRTUALIZATION

STAGINGDEV

LIVEPHYSICAL

LIVEDB

Page 17: Dockerize node.js application

VIRTUALIZATION

STAGINGLOCAL LIVECLOUDDEV

LIVEPHYSICAL

LIVEDB

Page 18: Dockerize node.js application

VIRTUALIZATION

STAGINGLOCAL

LIVECLOUD

DEV

LIVEPHYSICAL

STAGINGDB

LIVEDB

REPLICADB

Page 19: Dockerize node.js application

VIRTUALIZATION

STAGINGLOCAL

LIVECLOUD

DEV

LIVEPHYSICAL

STAGINGDB

REPLICADB

LIVEDB

environment variables

environment variables

environment variables

Page 20: Dockerize node.js application

VIRTUALIZATION

STAGINGLOCAL

LIVECLOUD

DEV

LIVEPHYSICAL

STAGINGDB

REPLICADB

environment variables

LIVEDB #1

LIVEDB #2

LIVECLOUD

LIVECLOUD

CRONenvironment variables

environment variables

Page 21: Dockerize node.js application

VIRTUALIZATIONUNABLE TO TRACK ENVIRONMENTS

Page 22: Dockerize node.js application

MICROSERVICE

SOCARAPP API BACK

OFFICE API

ZEROCARAPP API BACK

OFFICE API

MAKE IT DETACHABLE

Page 23: Dockerize node.js application

MICROSERVICE

BACKOFFICE API API

BACKOFFICE API API

APICRON

MAKE IT DETACHABLE

Page 24: Dockerize node.js application

MICROSERVICEMAKE IT DETACHABLE

BACKOFFICE API API

BACKOFFICE API API

APICRON

Page 25: Dockerize node.js application

FAST AND EASY TO ROLLBACKDEVELOPMENT REQUIREMENT

WE NEED TO ROLLBACK

SERIOUSLY

Page 26: Dockerize node.js application

WHY WHAT HOW

Page 27: Dockerize node.js application

BEFORE WHAT

Page 28: Dockerize node.js application
Page 29: Dockerize node.js application

VM DOCKER

WHAT IS DOCKER?

@http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01/01

Page 30: Dockerize node.js application

VM DOCKER

WHAT IS DOCKER?

@http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01/01

Page 31: Dockerize node.js application

WHAT IS DOCKER?

Page 32: Dockerize node.js application

WHAT IS DOCKER?

LIGHT VIRTUAL MACHINE

VMs

SERVER

Page 33: Dockerize node.js application

IMAGE CONTAINER

WHAT IS DOCKER?MEANWHILE IN DOCKER WORLD

Windows 8 PCs

@CPU by Creative Stall from the Noun Project

Page 34: Dockerize node.js application

WHAT IS DOCKER?IMAGE

BASEUBUNTU, ALPINE, CENTOS …

DEPENDENCIESVIM, CURL, NODE.JS, PYTHON …

APPLICATIONSOURCE CODE, ENVIRONMENT …

START SCRIPTBASH, MAKEFILE, NPM START …

Page 35: Dockerize node.js application

WHAT IS DOCKER?CONTAINER

INFORMATIONNAME, PORT …

SETUPRESTART, DAEMON, LINK …

HOST RELATEDVOLUME, NETWORK …

PROCESSNODE …

Page 36: Dockerize node.js application

WHY WHAT HOW

Page 37: Dockerize node.js application

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

Page 38: Dockerize node.js application

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

Page 39: Dockerize node.js application

EASIER ENVIRONMENT SETUPDOCKERIZED WAY

$dockerbuild-tnode-docker.

$dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutaminuteago654.5MB

Page 40: Dockerize node.js application

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

Page 41: Dockerize node.js application

EASIER ENVIRONMENT SETUPDOCKERIZED WAY

$dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutaminuteago654.5MB

$dockerrun--namedocker-instance-1--port80:3000node-docker

Page 42: Dockerize node.js application

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

.

.

.

Page 43: Dockerize node.js application

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

Page 44: Dockerize node.js application

MICROSERVICEDOCKER-COMPOSE

version:'2'

services:application:container_name:applicationimage:node-docker

docker-compose.yml

Page 45: Dockerize node.js application

MICROSERVICEDOCKER-COMPOSE

version:'2'

services:application:container_name:applicationimage:node-docker

redis:container_name:redisimage:redis

docker-compose.yml

Page 46: Dockerize node.js application

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

Page 47: Dockerize node.js application

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

Page 48: Dockerize node.js application

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

Page 49: Dockerize node.js application

FAST AND EASY TO ROLLBACKBUILD WITH TAG

$dockerbuild-tnode-docker.

$dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5M

$dockerbuild-tnode-docker:1982.

$dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5MBnode-docker198210394kdfksf1Aboutaminuteago654.5MB

Page 50: Dockerize node.js application

FAST AND EASY TO ROLLBACKBUILD WITH TAG

$dockerbuild-tnode-docker.

$dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5M

$dockerbuild-tnode-docker:1982.

$dockerimages

REPOSITORYTAGIMAGEIDCREATEDSIZEnode-dockerlatest08a5b1c92fcfAboutanhourago654.5MBnode-docker198210394kdfksf1Aboutaminuteago654.5MB

Page 51: Dockerize node.js application

FAST AND EASY TO ROLLBACK

Page 52: Dockerize node.js application

FAST AND EASY TO ROLLBACKDOCKER HUB

https://hub.docker.com/r/library/node/tags/

Page 53: Dockerize node.js application

WHY WHAT HOW

Page 54: Dockerize node.js application

YOU CAN DOCKERIZE YOUR APPLICATION TOMORROW

Page 55: Dockerize node.js application

$npminit-f

$npmi-Sexpressuuid

DOCKERIZESTART WITH EXPRESS

Page 56: Dockerize node.js application

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

Page 57: Dockerize node.js application

DOCKERIZEBUILD DOCKER IMAGE

node_modules/

.dockerignore

Page 58: Dockerize node.js application

DOCKERIZE

FROMnode:6

COPYpackage.json/src/package.json

RUNcd/src;npminstall

COPY./src

EXPOSE3000

WORKDIR/src

CMDnodeindex.js

Dockerfile

BUILD DOCKER IMAGE

Page 59: Dockerize node.js application

$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

Page 60: Dockerize node.js application

$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

Page 61: Dockerize node.js application
Page 62: Dockerize node.js application

$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

Page 63: Dockerize node.js application

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

Page 64: Dockerize node.js application

FROMnginx

COPYnginx.conf/etc/nginx/nginx.conf

LOAD-BALANCING WITH NGINX

nginx/Dockerfile

DOCKERIZE

Page 65: Dockerize node.js application

$dockerbuild--tagnode-nginx-lb:test.

$dockerrun-d--namenode-nginx-instance-lb-p4000:80node-nginx-lb:test

LOAD-BALANCING WITH NGINXDOCKERIZE

Page 66: Dockerize node.js application

DOCKERIZE

NOOOOOOOOT WORKING

WHAT THE…

Page 67: Dockerize node.js application

DOCKERIZEI RUINED PLAYNODE

Page 68: Dockerize node.js application

$dockerrm-f$(dockerps-a-q)

LINK CONTAINERSDOCKERIZE

Page 69: Dockerize node.js application

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

Page 70: Dockerize node.js application

...

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

Page 71: Dockerize node.js application

$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

Page 72: Dockerize node.js application

DOCKERIZE

Page 73: Dockerize node.js application

AND THEN…

Page 74: Dockerize node.js application
Page 75: Dockerize node.js application

CLUSTERINGCONTAINER ORCHESTRATION

SWARM KUBERNATES

Page 76: Dockerize node.js application

CLUSTERINGDOCKER SWARM

Page 77: Dockerize node.js application

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

Page 78: Dockerize node.js application

MONITORINGKITEMATIC FOR MAC (BETA)

Page 79: Dockerize node.js application

MONITORINGDATADOG

Page 80: Dockerize node.js application

CLOUDDOCKER CLOUD

Page 81: Dockerize node.js application

CLOUDAWS ECS

Page 82: Dockerize node.js application

– from Twitter

“Dockerize all the things!”

Page 83: Dockerize node.js application

WE ARE HIRING

http://socar.recruiter.co.kr

Page 84: Dockerize node.js application

[email protected]

[email protected]

http://seokjun.kr