Configuração do Docker e Fig

Na minha máquina funciona

Uma das formas para melhorar a qualidade e diminuir o tempo de entrega de novos recursos é através da padronização de ambientes de desenvolvimento, homologação e produção. É a velha história do "funciona na minha máquina. É aí que entra o Docker

Com o Docker conseguimos construir um ambiente isolado através do conceito de containers. Um container é um processo virtualizado, onde ao invés de configurar uma máquina virtual instalando todos os serviços que precisamos, configuramos uma máquina virtual para cada serviço. Isso só é possível pois o docker utiliza o Linux Containers, onde o container compartilha parte do kernel da máquina hospedeira de uma forma mais inteligente, não possuindo assim o overhead de emular todo o hardware.

Assim resolvemos o problema de manter um ambiente confiável em qualquer ambiente, seja Linux ou Windows, mas como cada serviço possui um container a parte, surge a dificuldade da orquestração destes serviços. Precisamos inicializar todos os serviços de forma independente, além de definir os volumes compartilhados entre a máquina hospedeira e o container, conectar os containers entre si, através da especificação do IP e porta correspondentes, etc. É nesse ponto que o Fig entra em ação.

Configuração do Fig

O Fig extende o Docker, permitindo que todos os containers necessários sejam iniciados, encerrados, excluídos, etc. com apenas um comando. A configuração é tão simples quanto o Docker. Precisamos de um arquivo fig.yml na raiz do projeto, como o a seguir:

web:
  build: .
  command: php -S 0.0.0.0:8000 -t /code
  ports:
    - "80:8000"
  links:
    - db
  volumes:
    - .:/code
db:
  image: orchardup/mysql
  environment:
    MYSQL_DATABASE: dbname

Container Web

web:
Identificação do container. O nome web é arbitrário.
build: .
Neste caso, temos um Dockerfile definido no mesmo diretório do fig.yml, então este container será construído a partir do diretório atual.
command: php -S 0.0.0.0:8000 -t /code
Define o CWD do container. Neste caso utilizaremos o servidor embarcado do PHP na porta 8000 apontando para o diretório /code
ports: -"8000:8000"
Vinculamos a porta 8000 do container à porta 80 da máquina hospedeira. Utilizaremos http://localhost/ para acessar o servidor do container posteriormente.
links: - db
Essa é a parte realmente interessante do Fig. Aqui vinculamos o container web com o container db, que será definido posteriormente.
volumes: - .:/code
Definimos que a pasta /code do container, apontará para o diretório atual da máquina hospedeira.

Container DB

db:
Este container será chamado db
image: orchardup/mysql
Neste caso, queremos utilizar uma imagem encontrada no Docker Hub Repository
environment: MYSQL_DATABASE: dbname
A imagem orchardup/mysql utiliza variáveis de ambiente para se configurar, neste caso definimos o nome do banco de dados que utilizaremos.

Os nomes dos containers, serão seus hosts

No fig.yml definimos dois containers, web e db. Provavelmente um arquivo de configuração da aplicação hospedada no container web precisará se comunicar com o banco de dados em algum momento. Os dados de conexão são definidos pelas variáveis de ambiente do container, conforme visto acima, porém o IP do servidor é atribuído pelo próprio Docker.

Utilizando uma definição do próprio Docker, o fig permite conectar dois containers através da configuração links. Ao definir esta conexão, o Docker adiciona ao arquivo /etc/hosts do container, o IP e o nome do container definido no fig, como a seguir:

172.17.0.7 web
172.17.0.8 db

Dessa forma, nosso arquivo de configuração ficaria semelhante ao seguinte:

<?php

$db = array(
  'dbname' => 'dbname',
  'dbuser' => 'root',
  'dbpass' => 'mysecretpassword',
  'dbhost' => 'db'
);

A linha importante neste arquivo é 'dbhost' => 'db', onde apontamos como host, a string 'db'.

Iniciando sua aplicação

O Fig funciona de forma muito semelhante ao Docker. Após configurar o fig.yml, é só iniciar tudo:

$ fig up

Você pode passar a opção fig up -d para rodar sua aplicação em background. Outros comandos do Docker também se aplicam:

Os comandos do fig evitam que você precise executar diversas vezes o mesmo comando docker, para cada um de seus containers ou criar shell scripts para rodar sua aplicação.