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