dockerizando uma aplicação nodejs

20
Dockerizando uma aplicação NodeJS Luís Bianchin 1 / 20

Upload: luis-bianchin

Post on 16-Apr-2017

208 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Dockerizando uma aplicação NodeJS

Dockerizando uma aplicaçãoNodeJS

Luís Bianchin

1 / 20

Page 2: Dockerizando uma aplicação NodeJS

Sobre mim

Consultor desenvolvedor na ThoughtWoks

Contato com Docker a 2 anos

2 / 20

Page 3: Dockerizando uma aplicação NodeJS

Agenda

O que é, por que e como instalar Docker?

A aplicação node

Dockerfile

Build & run

docker-compose

3 / 20

Page 4: Dockerizando uma aplicação NodeJS

O que é e por que Docker?

Isolamento: cgroup e namespaces

Dependências dentro de um pacote (imagem)

Densidade: um app por container, vários containars no mesmo servidor

(Docker Host)

Imagem como artefato de deployment

Facilita escalar horizontalmente

4 / 20

Page 5: Dockerizando uma aplicação NodeJS

InstalaçãoOSX:

brew install docker docker-compose docker-machine

Ou Docker Toolbox: https://www.docker.com/docker-toolbox

5 / 20

Page 6: Dockerizando uma aplicação NodeJS

A aplicação

Um simples contador de visitas em NodeJS + Express

Persistência em Redis

https://github.com/labianchin/docker-nodejs-demo

var express = require('express'), http = require('http'), redis = require('redis');

var client = redis.createClient( process.env.REDIS_1_PORT_6379_TCP_PORT || 6379, process.env.REDIS_1_PORT_6379_TCP_ADDR || '127.0.0.1');

var app = express();app.get('/', function(req, res, next) { client.incr('visits', function(err, visits) { if(err) return next(err); res.send('Esta página foi visitada ' + visits + ' vezes!'); });});

http.createServer(app).listen(process.env.PORT || 3000, function() { console.log('Listening on port ' + (process.env.PORT || 3000));});

6 / 20

Page 7: Dockerizando uma aplicação NodeJS

Criando um Dockerfilevim Dockerfile

FROM node:5.0.0

WORKDIR /app

ADD . /appRUN npm install

ENV PORT=3000EXPOSE 3000

CMD npm start

Cada comando cria uma layer/camada

Essas camadas são hierárquicas e cacheáveis

7 / 20

Page 8: Dockerizando uma aplicação NodeJS

Builddocker build -t my-app .

8 / 20

Page 9: Dockerizando uma aplicação NodeJS

Run

Rodar redis linkado ao app

docker run --detach --name my-redis redis:latestdocker run -it -p 3000:3000 --link my-redis:redis_1 my-app

9 / 20

Page 10: Dockerizando uma aplicação NodeJS

docker-composeCansado de vários docker run?

web: build: . ports: - "3000:3000" links: - redisredis: image: redis:latest

$ docker-compose up

10 / 20

Page 11: Dockerizando uma aplicação NodeJS

Fontes e Referências

http://mherman.org/blog/2015/03/06/node-with-docker-continuous-

integration-and-delivery/

https://www.airpair.com/node.js/posts/getting-started-with-docker-for-the-

nodejs-dev

http://anandmanisankar.com/posts/docker-container-nginx-node-redis-

example/

http://www.slideshare.net/labianchin/verdades-do-docker

11 / 20

Page 12: Dockerizando uma aplicação NodeJS

Perguntas?

12 / 20

Page 13: Dockerizando uma aplicação NodeJS

Dockerfile com cacheFROM node:5.0.0

WORKDIR /app

ADD package.json /app/RUN npm install

ADD . /app

ENV PORT=3000EXPOSE 3000

CMD npm start

13 / 20

Page 14: Dockerizando uma aplicação NodeJS

Dockerfile onbuild

App Dockerfile:

FROM node:5.0.0-onbuildEXPOSE 3000

Dockerfile node:5.0.0-onbuild:

FROM node:5.1.0

RUN mkdir -p /usr/src/appWORKDIR /usr/src/app

ONBUILD COPY package.json /usr/src/app/ONBUILD RUN npm installONBUILD COPY . /usr/src/app

CMD [ "npm", "start" ]

14 / 20

Page 15: Dockerizando uma aplicação NodeJS

Build automatizado no Docker hubhttps://hub.docker.com/r/labianchin/docker-nodejs-demo/builds/

15 / 20

Page 16: Dockerizando uma aplicação NodeJS

VolumesCriando volume:

$ docker volume create --name=myvolume$ docker run -v myvolume:/data busybox sh -c "echo hello > /data/file.txt"$ docker run -v myvolume:/data busybox sh -c "cat /data/file.txt"

Usando volumes_from no docker-compose:

web: build: . ports: - "3000:3000" links: - redisredis: image: redis:latest volumes_from: myvolume

Fazendo backups:

$ docker cp myvolume:/data/ ./local_path

16 / 20

Page 17: Dockerizando uma aplicação NodeJS

Docker Machine

Aqui usando Digital Ocean como driver

Também há VirtualBox (antigo boot2docker)

Prefira um Docker Host em US: docker pull mais rápido

$ docker-machine create \ --driver digitalocean \ --digitalocean-access-token 0ab77166d407f479c6701652cee3a46830fef88b8199722b87821621736ab2d4 \ stagingCreating SSH key...Creating Digital Ocean droplet...To see how to connect Docker to this machine, run: docker-machine env staging

17 / 20

Page 18: Dockerizando uma aplicação NodeJS

Boas práticas para imagens

Um processo por container

Minimize o número de layers: agrupar vários comandos no mesmo RUN

Aproveite o build cache

Prefira COPY ao invés de ADD

18 / 20

Page 19: Dockerizando uma aplicação NodeJS

Outros detalhes

CI: build, test and package

Em produção: entenda sobre mesos e/ou kubernetes

Entenda shell scripting

Cuidado com "yak shaving"

19 / 20

Page 20: Dockerizando uma aplicação NodeJS

Fim

20 / 20