Desenvolvendo e implantando aplicações PHP utilizando Docker
-
Upload
bruno-siqueira -
Category
Software
-
view
513 -
download
10
description
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