2. Problema
Nós queremos entregar nosso software funcional para
diferentes ambientes de forma simples.
Development
Production
CI Server
Contributor’s laptop
?
...
3. Principais problemas
Mover do ambiente de desenvolvimento para
produção é difícil
Libs conflitantes / diferentes versões;
Diferentes SOs;
Diferentes versões de banco de dados.
Criar, atualizar e manter toda a software stack é difícil
O projeto usualmente contém muitas libs, bd, serviços..;
Difícil de manter uma versão do projeto reproduzível.
Teste / Integração Contínua / Entrega contínua é
difícil de automatizar
4. Como resolver?
Faça você mesmo (Do-It-Yourself)
1. Copiar / Instalar dependências (manualmente);
2. Preparar os bancos de dados;
3. Instalar a última versão do projeto;
4. Configurar as propriedades;
5. Testar o projeto em execução;
5. Como resolver?
6. Epaa! Alguma coisa está faltando, não está
funcionando!
7. Consertar os erros;
8. Repetir os testes da aplicação novamente até estar
funcionando;
9. Escrever manuais para ajudar outras pessoas a
configurar o (monstrinho).
6.
7.
8. Como resolver isso (VMs)
Empacotar tudo em uma VM e executar o deploy em
diferentes ambientes.
Development
Production
CI Server
Contributor’s laptop
...
9. Desvantagens das VMs
Pesada. Quantas VMs você pode rodar em sua máquina?
Consumo alto de recursos. Virtualização completa OS,
I/O, etc...
Tamanho. Usualmente precisa de muitos GB para cada
VM.
Problemas de portabilidade. Diferentes soluções de
virtualização.
Gerenciamento. Difícil de manter / configurar / reusar
diferentes versões de cada VM.
14. LXC
Ele é executado como um processo isolado no sistema
operacional hospedeiro, compartilhando o kernel com
outros recipientes, ou seja, permitem códigos e
aplicações rodarem separados de outros containers
compartilhando os mesmos recursos de hardware
15. LXC
Para construir uma área isolada para sua aplicação o
container utiliza entre outras funcionalidades do kernel:
namespaces;
cgroups;
chroot.
16.
17. Containers nova tecpix?
Criar um container novo consiste em criar um novo
“chroot” o que exige muito I/O;
Não é simples replicar um container.
19. O que é docker?
Uma plataforma opensource (escrita em Go) que
automatiza a implementação de qualquer aplicação
de forma leve e portátil em containers auto-
suficientes, onde poderão ser executados nos mais
diversos ambientes.
20.
21.
22. Vantagens
Cada novo imagem é um “diff” de outra imagem base
(rápido);
Build automática (Dockerfile);
Reuso (FROM: image);
Compartilhamento (dockerhub);
Funciona em qualquer máquina Linux.
23. Docker images
Uma imagem pode ser um sistema operacional como o
Ubuntu, mas também pode ser um Ubuntu com o seu
aplicativo web e todos os seus pacotes necessários
instalados.
*Cada imagem começa de uma imagem base, por
exemplo uma imagem do ubuntu ou fedora.
24. Docker container
Um Container nada mais é do que um chroot.
Podemos dizer que são as instâncias reais criados a partir
das imagens do Docker. Eles podem ser iniciados,
executados, parados, deletados, e movidos.
25. Docker Hub
Github do docker!
Oferece um sistema open-source para que pessoas
possam ter seus próprios servidores e armazenar
imagens privadas ou públicas.
26. Exemplo
$ docker pull ubuntu:14.04
No comando acima, realizamos o download da imagem
do ubuntu na tag 14.04.
27. Exemplo
Essa instrução irá executar o comando “cat /etc/lsb-release”
dentro do container do ubuntu. Se você conseguiu executar esse
comando com sucesso, parabéns, você já está utilizando o
Docker :).
$ docker run ubuntu:14.04 cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
28. Dockerfile
Basicamente um shell script com instruções para construir
uma imagem.
Comandos exclusivos dos Docker também podem ser
utilizados:
Rodar um comando;
Adicionar um arquivo ou diretório;
Criar uma variável de ambiente.
29. Dockerfile: Exemplo
Imagem base do ubuntu;
Instala coisas básicas do ubuntu como gcc, make, curl;
Instala o GhostScript;
Instala o OpenJDK;
Instala o ImageMagick;
30. Dockerfile: Exemplo
Instala as fontes padrões;
Instala o Tomcat;
Copia o war do Projeto que está na mesma pasta para o
diretório webapps do Tomcat;
Inicia o Tomcat.
31. Dockerfile: Exemplo
# Pull base image.
FROM ubuntu:14.04
# Install Java.
RUN
apt-get update &&
apt-get install -y openjdk-7-jdk &&
rm -rf /var/lib/apt/lists/*
32. Construir uma imagem
$ docker build -t pdfsevices/ubuntu .
Constrói uma imagem com o nome pdfservices/ubuntu.
34. Executando um container com
base na imagem criada
$ docker run -p 3389:8080 -d pdfservices/ubuntu
35. Comandos úteis
Open terminal shell in the container
$ docker run -i -t pdfservices/ubuntu /bin/bash
List running containers
$ docker ps
Execute a shell command inside the container
$ docker exec <CONTAINER ID> ls