Neste post vou falar um pouco sobre Docker Compose e como usá-lo no desenvolvimento de aplicações PHP, estou usando Docker version 1.10.2 e docker-compose version 1.6.2.
Que diabos é Docker Compose?
O Docker Compose é uma ferramenta para definição e execução de aplicações Docker multi-container. Isso significa que com ele você pode definir várias aplicações como container e executá-las de uma única vez sem precisar executar várias vezesdocker build -t [myuser]/[appname] . && docker run [myuser]/[appname]. Isso é uma mão na roda gigante :).
Como o Docker Compose pode me ajudar?
Usando o compose em apenas um arquivo você define as dependências do seu ambiente: banco de dados, bancos nosql, variáveis de ambiente, serviços e etc e em seguida com apenas um comando você sobe todo essa pilha e já pode usar. Sua equipe agora precisa apenas executar:git clone [repo] && docker-compose build && docker-compose up e já pode trabalhar.
Hands ON
Vamos imaginar uma app simples, um hello world por exemplo :D, farei este teste usando PHP. Primeiro de tudo temos que criar umDockerfile, nele iremos definir a imagem que iremos usar e os comandos necessários para importar nossa app para o container.
PHP - Dockerfile
FROM php
RUN mkdir /app
WORKDIR /app
RUN wget https://getcomposer.org/composer.phar
ADD composer.json /app/composer.json
ADD composer.lock /app/composer.lock
RUN ./composer.phar install
ADD . /app/
Em seguida vamos criar um arquivo chamado docker-compose.yml e definir os serviços nele. Serviços são uma espécie de alias para o containers que vão ser criados ex: web - para aplicações web, db - para banco de dados. Você pode definir quantos serviços quiser, desde que possuam nomes diferentes, pois quando os containers forem levantados esses "apelidos" serão usados na comunicação entre eles.
Obs: para saber mais sobre a questão de versão do docker-compose acesse https://docs.docker.com/compose/compose-file/#versioning
PHP - docker-compose.yml
version: '2'
services:
web:
build: .
command: php -S 0.0.0.0:8000 -t /app/web/ # comando a ser executado quando o conatiner web terminar o build
ports:
- "8000:8000" # porta que será mapeada com o host
volumes:
- .:/app # volume que será mapeado "." - root da aplicação, "/app" - diretório no container
Depois de definido o Dockerfile e o docker-compose.yml vamos agora fazer nossa app helloworld.
Para PHP irei usar o Silex.
PHP - Estrutura do diretório
.
├── composer.json
├── composer.lock
├── docker-compose.yml
├── Dockerfile
├── scripts
│ └── run
└── web
└── index.php
PHP - composer.json
{
"require": {
"silex/silex": "^1.3"
}
}
PHP - web/index.php
<?php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/', function() use($app) {
return "You are in home";
});
$app->get('/{name}', function($name) use($app) {
return 'Hello '.$app->escape($name);
});
$app->run();
?>
Executando os containers
Para executar os containers vamos rodar o seguinte o comando no root da aplicaçãodocker-compose up. Esse comando fara com que os containers sejam levantados e os comandos definidos no docker-compose.yml e no Dockerfile sejam executados.
Como vocês devem ter percebido na estrutura de diretórios tem uma pasta chamada scripts, com um script chamado run. Eu faço isso para facilitar minha vida, nesse script tem apenas uma linha com o comando citado acima, então quando quero rodar os containers apenas faço ./scripts/run.
Após rodar o comando é só acessar localhost:8000 para a aplicação PHP, qualquer alteração feita na aplicação será replicada no container por conta do mapeamento de volumes que fizemos no docker-compose.yml
volumes:
- .:/app
Executando comandos dentro do container
Caso precisem executar comandos dentro do container vocês pode fazer da seguinte maneira:docker-compose run web [comando] ex:
$ docker-compose run web php -v
PHP 7.0.4 (cli) (built: Mar 19 2016 00:06:16) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
Instalando novas depedências no projeto
Sempre que uma nova dependência for adicionada ao projeto é necessário executardocker-compose build para que uma nova imagem seja criada com as dependências instaladas.
É isso aí pessoal, divirtam-se!!! O reposótio com os exemplos está aqui: https://github.com/gwmoura/hello-docker-compose;)