Desenvolvendo e implantando aplicações PHP utilizando Docker

Post on 13-Dec-2014

513 views 10 download

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

Clique para adicionar texto

Globalcode – Open4education

Desenvolvendo e implantando aplicações PHP utilizando Docker

Bruno Ricardo Siqueira @brunoric

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

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

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

Globalcode – Open4education

Parte I - Docker

Globalcode – Open4education

Docker: o que é?

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

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

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

Globalcode – Open4education

Docker: VMs x Docker

Máquina Virtual

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

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

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

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

Globalcode – Open4education

LXC

Userspace tools for the Linux kernel containers

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

Globalcode – Open4education

libcontainer

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

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

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)

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

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)

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

Globalcode – Open4education

Parte II – Encapsulando aplicações PHP

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

Globalcode – Open4education

Docker HUB

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

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

Globalcode – Open4education

Construindo uma imagem

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

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

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

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}]

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" } }

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);

Globalcode – Open4education

Parte III - Considerações

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

Globalcode – Open4education

Quem está utilizando?

Globalcode – Open4education

CoreOS

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

Globalcode – Open4education

GearD

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

Globalcode – Open4education

libswarm

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

Globalcode – Open4education

Novas plataformas

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

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

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/

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/

Globalcode – Open4education

Dúvidas?

Globalcode – Open4education

Obrigado!

Bruno Ricardo Siqueira @brunoric

brunoric.info