Você está na página 1de 46

Desenvolvendo e implantando

aplicações PHP utilizando Docker


Clique para adicionar texto
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

Docker

Máquina Virtual 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
$ curl –sSL https://get.docker.io/ubuntu | sudo sh

Download de imagem padrão


$ sudo docker pull ubuntu

Shell interativa
$ 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
$ sudo docker pull brunoric/docker-apache2-php
$ sudo docker pull brunoric/docker-apache2-phpng
$ sudo docker pull brunoric/docker-apache2-hhvm

Executando os containers (e montando a pasta da


aplicação)
$ 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

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

Executando
$ sudo docker run -d -p 80:80 -p 3306:3306 -v \
/path/of/your/app:/app \
brunoric/docker-apache2-php-mariadb
Globalcode – Open4education
Efetuando implantação
Pulling da imagem
$ sudo docker pull brunoric/docker-apache2-php

Executando o container (e montando a pasta da


aplicação)
$ 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);

Executando um container
<?php
$container = new Docker\Container(['Image' => 'ubuntu:precise']);
$docker->getContainerManager()->run($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

Globalcode – Open4education

Você também pode gostar