Desenvolvendo e implantando aplicações PHP utilizando Docker

46
Globalcode – Open4education Desenvolvendo e implantando aplicações PHP utilizando Docker Bruno Ricardo Siqueira @brunoric

description

Slides da palestra ministrada no TDC São Paulo 2014, na trilha PHP. A idéia central da palestra é introduzir os conceitos da ferramenta Docker, apresentados da visão de um programador PHP, denotando as vantagens de se utilizar a ferramenta para o desenvolvimento de software em PHP.

Transcript of Desenvolvendo e implantando aplicações PHP utilizando Docker

Page 1: Desenvolvendo e implantando aplicações PHP utilizando Docker

Clique para adicionar texto

Globalcode – Open4education

Desenvolvendo e implantando aplicações PHP utilizando Docker

Bruno Ricardo Siqueira @brunoric

Page 2: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Agenda – Parte I

Docker O que é? Qual a proposta? Origem VMs x Docker Linux Namespaces, AUFS, outras ferramentas, LXC Execution driver API, libcontainer Instalação e utilização, Dockerfile Escalabilidade, portabilidade Intersecções

Vagrant, Puppet, Chef, CFEngine, Heroku Buildstep, Dokku

Page 3: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Agenda – Parte II

Encapsulando aplicações PHP Preparando o ambiente de desenvolvimento

Docker Hub e Registry Utilizando uma imagem Construindo uma imagem

Ambiente de produção Efetuando a implantação

Docker-PHP Docker remote API Docker client em PHP

Page 4: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Agenda – Parte III

Considerações Pontos positivos e negativos Quem está utilizando Docker? O que vem por aí?

CoreOS, GearD Novas plataformas (OpenVZ, systemd-nspawn, libvirt-lxc, libvirt-sandbox, qemu/kvm, BSD Jails, Solaris Zones)

E nós desenvolvedores PHP o que temos com isso? Tempo e dinheiro Novas ferramentas

Page 5: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Parte I - Docker

Page 6: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker: o que é?

Page 7: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker: o que é?

“Docker é uma plataforma aberta para desenvolvedores e administradores de sistema construírem, entregarem e executarem aplicações distribuídas. Consistindo do Docker Engine, um leve ambiente de execução portátil e ferramenta de empacotamento, e do Docker Hub, um serviço baseado na nuvem para compartilhamento de aplicações e automação de fluxo de trabalho, Docker permite que aplicações sejam rapidamente montadas através de seus componentes eliminando a fricção entre desenvolvimento, garantia da qualidade e ambientes de produção. Como resultado, a TI pode entregar mais rapidamente e executar o mesmo aplicativo, sem alterações, em laptops, data center VMs e qualquer infraestrutura na nuvem.” - Solomon Hykes

Page 8: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker: qual a proposta?

Eliminar (na maioria dos casos): Hypervisors Máquinas virtuais Gestores de configuração (Puppet, Chef, CFEngine, etc)

Como? Isolar a aplicação e suas dependências Não virtualizar o sistema operacional Executar a aplicação em um 'espaço de usuário' próprio

'VM' com MUITO menos overhead

Page 9: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker: origem

dotCloud PaaS lançada em 2011 Solomon Hykes inicia o projeto Docker

Docker tem seu código aberto em março de 2013 Linguagem de programação Go

Primeiras versões Possuem LXC como ambiente de execução padrão Basicamente um wrapper LXC centrado em aplicações Docker Remote API Docker Hub

Page 10: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker: VMs x Docker

Máquina Virtual

Docker

Page 11: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Linux Namespaces

Mount namespaces Linux 2.4.19 Isolamento do sistema de arquivos

UTS namespaces Linux 2.6.19 Hostname e NIS domain name

IPC namespaces Linux 2.6.19 e Linux 2.6.30 Identificadores System V IPC e POSIX message queues

Page 12: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Linux Namespaces

PID namespaces Linux 2.6.24 init (PID 1), mesmo PID em diferentes PID namespaces

Network namespaces Linux 2.6.24 e Linux 2.6.29 Isolamento de recursos de rede

User namespaces Linux 2.6.23 e Linux 3.8 Identificadores System V IPC e POSIX message queues

Page 13: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

AUFS

Union mount – UnionFS (1990!) AnotherUnionFS – AUFS (2006) Live CDs, ..., Docker Monta o sistema em modo ready-only Adiciona camada(s) de sistemas de arquivo em modo ready-only Camada final (container) com permissão de escrita

Page 14: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Outras ferramentas

AppArmor e SELinux profiles Restringem as capacidades dos softwares (processos)

seccomp policies Linux 2.6.12 Estado seguro, chamadas limitadas ao sistema

chroot Muda o diretório root do processo corrente (e dos filhos)

cgroups control groups, Linux 2.6.24 Controla e isola a utilização de recursos

Page 15: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

LXC

Userspace tools for the Linux kernel containers

Page 16: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Execution driver API

Camada de padronização do acesso ao ambiente de execução LXC não é mais o ambiente de execução padrão (mais ainda pode ser utilizado) Possibilidade para novas ferramentas de isolamento (e outras plataformas)

OpenVZ, systemd-nspawn, libvirt-lxc, libvirt-sandbox, qemu/kvm, BSD Jails, Solaris Zones

Novo driver de execução padrão libcontainer

Page 17: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

libcontainer

Open source Escrita em Go Redução de dependências Maior consistência

Page 18: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Instalação e utilização

Lembrete: Utiliza funcionalidades específicas do Linux Windows, OS X, etc... por enquanto só com VM

Instalação

Download de imagem padrão Shell interativa

$ curl –sSL https://get.docker.io/ubuntu | sudo sh

$ sudo docker pull ubuntu

$ sudo docker run –i –t ubuntu /bin/bash

Page 19: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Dockerfile

Script de montagem automatizada de imagens Executa ações em uma imagem base para criar outra imagem Sintaxe simples

comando [argumento] [argumento] [...] ADD, CMD, COPY, ENTRYPOINT, ENV, EXPOSE, FROM, MANTAINER, ONBUILD, RUN, USER, VOLUME, WORKDIR

Camadas AUFS para cada comando Reaproveitamento de camadas (cache)

Page 20: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Escalabilidade, portabilidade

Replicação de containers Gestão de mudança Rollback, versionamento Workflow simplificado

commit, push, pull, run Rollback, versionamento, redundância... Encapsulamento de dependências Aplicação independente das configurações do linux host

Page 21: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Intersecções

Vagrant Ambiente de desenvolvimento e execução compatíveis

Puppet, Chef, CFEngine Gerenciamento de configuração de sistema Gerenciamento de mudança

Heroku Gerenciamento automatizado de dependências Runtime forks Runtime revisions (release history)

Page 22: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Buildstep, Dokku

Buildstep Utiliza os buildpacks do Heroku para construir Dockerfiles automaticamente Cria containers autosuficientes através de sua aplicação Transforma aplicações Heroku em containers

Dokku "Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen." Utiliza buildstep

Page 23: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Parte II – Encapsulando aplicações PHP

Page 24: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker HUB

Diferencial colaborativo Índice de repositórios de imagens

Imagens oficiais de vários vendors Imagens públicas de usuários

Repositórios ilimitados e gratuitos para projetos de código aberto

1 repositório privado gratuito Registry é a alternativa

Builds automáticos Integração com GitHub e Bitbucket

Page 25: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker HUB

Page 26: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker Registry

Container pré-configurado Gerenciar repositórios Docker em sua própria infraestrutura Índice de repositórios (busca) Espelhamento de imagens Container pré-configurado Integração out-of-the-box com Amazon S3, Google Cloud Storage, OpenStack Swift, OpenStack Glance Open source

Page 27: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Utilizando uma imagem

Conta no Docker Hub (ou Registry próprio) Pulling das imagens Executando os containers (e montando a pasta da aplicação)

$ sudo docker pull brunoric/docker-apache2-php $ sudo docker pull brunoric/docker-apache2-phpng $ sudo docker pull brunoric/docker-apache2-hhvm

$ sudo docker run -d -p 8081:80 -v /path/of/your/app:/app \ brunoric/docker-apache2-php $ sudo docker run -d -p 8082:80 -v /path/of/your/app:/app \ brunoric/docker-phpng $ sudo docker run -d -p 8083:80 -v /path/of/your/app:/app \ brunoric/docker-hhvm

Page 28: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Construindo uma imagem

Page 29: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Construindo uma imagem

$ sudo docker build -t brunoric/docker \ apache2-php-mariadb .

Criando imagem

$ sudo docker run -d -p 80:80 -p 3306:3306 -v \ /path/of/your/app:/app \ brunoric/docker-apache2-php-mariadb

Executando

Page 30: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Efetuando implantação

Pulling da imagem Executando o container (e montando a pasta da aplicação)

$ sudo docker pull brunoric/docker-apache2-php

$ sudo docker run -d -p 80:80 -v /path/of/your/app:/app \ brunoric/docker-apache2-php

Page 31: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker remote API

RESTfull unix:///var/run/docker.sock (padrão) É possível utilizar outro host/porta ou Unix socket Possibilita a criação de outros clientes Docker

Shipyard (GUI escrita em Python) PHP-Docker

Page 32: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker remote API $ echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock HTTP/1.0 200 OK Content-Type: application/json Content-Length: 858 Connection: close Date: Fri, 20 Dec 2013 16:02:41 GMT [{"Repository":"ubuntu","Tag":"12.04","Id":"8dbd9e392...", "Created":1365714795,"Size":131502179,"VirtualSize":131502179}, {"Repository":"ubuntu","Tag":"latest","Id":"8dbd9e392...", "Created":1365714795,"Size":131502179,"VirtualSize":131502179}, {"Repository":"ubuntu","Tag":"precise","Id":"8dbd9e392...", "Created":1365714795,"Size":131502179,"VirtualSize":131502179}, {"Repository":"ubuntu","Tag":"12.10","Id":"b750fe792...", "Created":1364102658,"Size":24653,"VirtualSize":180116135}, {"Repository":"ubuntu","Tag":"quantal","Id":"b750fe792...", "Created":1364102658,"Size":24653,"VirtualSize":180116135}]

Page 33: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker-PHP

Cliente Docker escrito em PHP Ainda em estágio inicial de desenvolvimento O objetivo é cobrir 100% da API do docker Utiliza o Guzzle Client Instalação { "require": { "stage1/docker-php": "@dev" } }

Page 34: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Docker-PHP

Conectando a um container <?php $client = new Docker\Http\DockerClient(array(), 'tcp://127.0.0.1'); $docker = new Docker\Docker($client);

<?php $container = new Docker\Container(['Image' => 'ubuntu:precise']); $docker->getContainerManager()->run($container);

Executando um container

Parando e removendo um container <?php $manager ->stop($container) ->remove($container);

Page 35: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Parte III - Considerações

Page 36: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Pontos positivos e negativos

Até agora só pontos positivos... Pontos negativos?

Segurança? AppArmor e SELinux Imaturidade da comunidade Ausência de ferramentas estabelecidas (o próprio Docker teve a versão 1.0.0 lançada em 09 junho de 2014. Isolamento demais, pode perder a parte boa do compartilhamento de ambiente de execução

Page 37: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Quem está utilizando?

Page 38: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

CoreOS

“Applications on CoreOS run as Docker containers. Containers provide maximum flexibility in packaging and can start in milliseconds.”

Page 39: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

GearD

“geard is a command-line client and agent for integrating and linking Docker containers into systemd across multiple hosts.”

Page 40: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

libswarm

“… a minimalist toolkit to orchestrate and compose network services for distributed systems.”

Page 41: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Novas plataformas

OpenVZ systemd-nspawn libvirt-lxc libvirt-sandbox qemu/kvm BSD Jails Solaris Zones OSX?? Windows??

Page 42: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

E quanto a nós?

Tempo Simplificação de processos Redução de surpresas (e tempo às corrigindo/entendendo) Facilidade em testar aplicações em novos e diferentes ambientes (php5, phpng, hhvm, ...)

Dinheiro Construção de novas ferramentas Redução de custos, afinal tempo = dinheiro

Constante atualização tecnológica

Page 43: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Referências ‘Namespaces in operation’ series:

Part I - Namespaces overview - http://lwn.net/Articles/531114/

Part II - The namespaces API - http://lwn.net/Articles/531381/

Part III - PID namespaces - http://lwn.net/Articles/531419/

Part IV - More on PID namespaces - http://lwn.net/Articles/532748/

Part V - User namespaces - http://lwn.net/Articles/532593/

Part VI - More on user namespaces - http://lwn.net/Articles/540087/

Part VII - Network namespaces - http://lwn.net/Articles/580893/

LXC: Linux container tools - http://www.ibm.com/developerworks/linux/library/l-lxc-containers/

Docker: Using Linux Containers to Support Portable Application Deployment - http://www.infoq.com/articles/docker-containers

Docker Case-Study #1: Interview with Matt Butcher from Revolv - http://www.centurylinklabs.com/docker-case-study-1-interview-with-matt-butcher-from-revolv/

Docker drops LXC as default execution environment - http://www.infoq.com/news/2014/03/docker_0_9

Docker libcontainer unifies Linux container powers - http://www.zdnet.com/docker-libcontainer-unifies-linux-container-powers-7000030397/

Page 44: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Referências Docker PHP Farm - http://www.splitbrain.org/blog/2014-02/02-docker_phpfarm

Docker 0.9: introducing execution drivers and libcontainer - http://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/

Understanding LXC & Docker - http://pt.slideshare.net/coprinno/lxc-n-docker

Docker is the Heroku Killer - http://www.brightball.com/devops/docker-is-the-heroku-killer

How to scale Docker containers in production - http://stackoverflow.com/questions/18285212/how-to-scale-docker-containers-in-production

Ubuntu Wiki - LXC - https://help.ubuntu.com/lts/serverguide/lxc.html

Docker Documentation - https://docs.docker.com/

Docker for your dev environment - https://julo.ch/blog/docker-dev-environment/

Page 45: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Dúvidas?

Page 46: Desenvolvendo e implantando aplicações PHP utilizando Docker

Globalcode – Open4education

Obrigado!

Bruno Ricardo Siqueira @brunoric

brunoric.info