Back-End

26 set, 2017

Criando um Container com Nginx + PHP + Bitbucket

Publicidade

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.