dockerizando uma aplicação nodejs
TRANSCRIPT
Dockerizando uma aplicaçãoNodeJS
Luís Bianchin
1 / 20
Sobre mim
Consultor desenvolvedor na ThoughtWoks
Contato com Docker a 2 anos
2 / 20
Agenda
O que é, por que e como instalar Docker?
A aplicação node
Dockerfile
Build & run
docker-compose
3 / 20
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
InstalaçãoOSX:
brew install docker docker-compose docker-machine
Ou Docker Toolbox: https://www.docker.com/docker-toolbox
5 / 20
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
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
Builddocker build -t my-app .
8 / 20
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
docker-composeCansado de vários docker run?
web: build: . ports: - "3000:3000" links: - redisredis: image: redis:latest
$ docker-compose up
10 / 20
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
Perguntas?
12 / 20
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
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
Build automatizado no Docker hubhttps://hub.docker.com/r/labianchin/docker-nodejs-demo/builds/
15 / 20
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
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
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
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
Fim
20 / 20