Demorou um pouco – até mais do que deveria -, mas acabei me rendendo ao Docker, o queridinho do mundo DevOps. Depois de estudar um pouco sobre ele e criar o meu primeiro container, deu para ver que realmente ele veio para ficar. Sem falar que trabalhar com containers é, de fato, um enorme avanço na questão de virtualização.
No meu trabalho atual, eu estou tentando implementar a arquitetura de microserviços para o nosso enorme monólito. E aí que entra o Docker. Ele faz com que toda essa implementação tenha vários serviços pequenos trabalhando juntos de uma forma muito tranquila.
Neste artigo, eu gostaria de compartilhar a minha experiência, que foi criar o meu primeiro container, um container que vai servir uma pequena API que usamos para o aplicativo mobile de vendas da nosso ERP, usando o Nginx + PHP FPM e baixando o projeto de um repositório Git privado, hospedado no Bitbucket.
A forma que eu utilizei para criar o container, foi usar o Dockerfile, um pequeno arquivo com instruções para criar a imagem do container, onde dentro desse arquivo, coloquei todos os comandos necessários para que o container já saia rodando com um comando após a criação da imagem.
Criando Dockerfile
Para começar, usaremos o comando “FROM” e depois, a imagem da onde nós vamos nos basear para criar nossa imagem, neste caso, o ubuntu 16.04.
FROM ubuntu:16.04
Depois precisamos declarar o mantenedor dessa imagem que vamos criar.
MAINTAINER <Seu nome> "<seu e-mail>"
Com o comando “ENV”, definimos uma variável para o nosso Nginx.
ENV NGINX_VERSION 1.9.3-1~jessie
Com o comando “RUN”, rodamos comandos dentro do nosso futuro container.
RUN apt-get update && apt-get install -y nginx php7.0-fpm curl git && apt-get clean
É importante o parâmetro -y no apt-get para que ele não te pergunte nada durante a instalação dos pacotes.
Agora definimos as configurações de log e cache do nosso Nginx.
RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stderr /var/log/nginx/error.log VOLUME ["/var/cache/nginx"]
Vamos apagar o vhosts padrão que vem na instalação no Nginx e usar o comando “ADD” para adicionar o nosso arquivo com o host.
RUN rm /etc/nginx/sites-available/default ADD ./default /etc/nginx/sites-available/default
O arquivo default utilizado nesse artigo está mais abaixo.
Agora esse comando é opcional, é só para quem vai usar o composer para fazer o build de sua aplicação.
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && rm composer-setup.php && mv composer.phar /usr/local/bin/composer && chmod a+x /usr/local/bin/composer ENV COMPOSER_ALLOW_SUPERUSER 1
Este comando “ENV COMPOSER_ALLOW_SUPERUSER 1” vai fazer com que o composer não apresente warning por estar rodando como usuário root.
Iremos nos preparar para baixar a nossa aplicação do Bitbucket. Vamos definir o diretório para o Git clone com o comando “WORKDIR”.
WORKDIR /var/www/html
Para fazermos o Git clone, vamos usar o seguinte comando:
RUN git clone https://<seu usuario>:<sua senha>@bitbucket.org/<usuario dono do repositório>/<nome do repositório> <nome da aplicação>
Estamos quase acabando, agora precisamos expor as portas para que o nosso host tenha acesso às portas do container.
EXPOSE 80 443
Para finalizar, vamos para a definição do Dockerfile – onde muita gente se atrapalha, apesar de termos feito tudo certo até agora -. Os nossos serviços do Nginx e PHP FPM estarão instalados, mas eles não vão iniciar de forma automática. Para definirmos isso, usaremos o comando “CMD” para rodar os seguintes comandos:
CMD service php7.0-fpm start && nginx -g "daemon off;"
O seu Dockerfile deve ficar parecido com isso:
FROM ubuntu:16.04 # Maintainer MAINTAINER <seu nome> "<seu e-mail>" ENV NGINX_VERSION 1.9.3-1~jessie RUN apt-get update && apt-get install -y nginx php7.0-fpm curl git && apt-get clean # NGINX RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stderr /var/log/nginx/error.log VOLUME ["/var/cache/nginx"] RUN rm /etc/nginx/sites-available/default ADD ./default /etc/nginx/sites-available/default # COMPOSER RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && rm composer-setup.php && mv composer.phar /usr/local/bin/composer && chmod a+x /usr/local/bin/composer ENV COMPOSER_ALLOW_SUPERUSER 1 # BUILD WORKDIR /var/www/html RUN git clone https://<seu usuario>:<sua senha>@bitbucket.org/<usuario dono do repositório>/<nome do repositório> <nome da aplicação> EXPOSE 80 443 CMD service php7.0-fpm start && nginx -g "daemon off;"
Arquivo default
O arquivo default utilizado na criação desse Dockerfile está logo abaixo, ele precisa estar no mesmo diretório onde está o Dockerfile para que o comando “ADD”, descrito acima, funcione.
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/<nome da aplicação>; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location ~ /\.ht { deny all; } }
Neste arquivo, já estão configuradas as URLs amigáveis.
Finalizando
Com esses dois arquivos, estamos prontos para criar o nosso container. Vamos dar o nosso primeiro Build (construção da imagem).
docker build . -t <nome da imagem>
Com nossa imagem criada, vamos levantar o nosso container.
docker run -d -p 8080:80 <nome da imagem>
Usamos o parâmetro -d para que container não ocupe o terminal e execute em background, e o parâmetro -p para definirmos as portas, onde 8080 é a porta do host e o 80 é a porta do container.
Ao executar o comando “docker ps”, você poderá ver todos os containers rodando atualmente na sua máquina e perceber que o nosso container está lá.
docker ps
Espero que tenha gostado desse artigo e acho importante avisar que estou começando a brincar com Docker, então tenho pouca experiência. Mas apesar de ser pouca, acho que essa informação pode ser útil para quem está com dificuldades para criar os seus primeiros containers.