Introdução ao Docker Como Ambiente de Desenvolvimento Web — Parte 1

Esron Silva
sysvale
Published in
5 min readAug 24, 2018

“Docker enables you to separate your applications from your infrastructure so you can deliver software quickly.” Docker overview

O Docker provê a possibilidade de rodar uma aplicação em um ambiente vagamente isolado chamado contêiner. Contêineres são leves pois não precisam da carga extra de um hypervisor, que é o que acontece com máquinas virtuais (VM). Outra vantagem é o tamanho em comparação com uma VM, já que a VM precisa de uma cópia completa do sistema operacional para funcionar e o contêiner compartilha o kernel e bibliotecas com seu hospedeiro.

Podemos nos aproveitar da tecnologia de contêineres para uniformizar as versões de softwares e infraestrutura do ambiente de desenvolvimento da sua equipe. Isso tem potencial para eliminar aquele velho ditado…

“Na minha máquina funciona…”

Nesta série de artigos aprenderemos uma maneira de utilizar contêineres Docker como ambiente de desenvolvimento Web. Esse é apenas um caso de uso que não extingue todas as possibilidades, deste modo estamos abertos a sugestões de arquiteturas e implementações diferentes de ambientes.

Neste artigo falaremos sobre os primeiros passos com Docker e nos familiarizaremos com conceitos fundamentais desta ferramenta.

Ambiente

Nos exemplos desse artigo usei a distribuição Linux Mint, que nada mais é que uma versão do Ubuntu mais amigável para ex-usuários Windows. Porém, os exemplos devem funcionar bem em qualquer máquina Linux ou Mac. Em máquinas Windows, aconselho o uso do Docker for Windows e desaconselho o uso do Docker Toolbox.

Não é necessário instalar nada além do Docker e de um editor de texto em sua máquina, já que todos as bibliotecas e softwares utilizados serão encapsulados pelo contêiner.

Pré-requisitos

  • Conhecimentos básicos sobre Linux

Conceitos

Docker host

Máquina onde foi instalado o Docker. Sendo uma máquina Linux, o próprio kernel da máquina será compartilhado entre os contêineres criados.

No host serão armazenados os contêineres e imagens Docker.

Imagens

Um arquivo imutável e inerte que é essencialmente uma fotografia de um container.

Contêiner

São instâncias de imagens que compartilham bibliotecas e recursos do Docker host. Aqui nossas aplicações residirão.

Primeiros Passos

Vamos assumir que o Docker já foi instalado e que o comando:

$ docker run hello-world

Resulta na seguinte saída:

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

De qualquer forma, caso ocorra algum problema, a instalação do Docker não é difícil e pode ser verificada na documentação do próprio Docker.

O próximo teste é feito com o seguinte comando:

$ docker run -it --name teste --hostname teste debian

Este comando nos colocará no terminal de um container genérico baseado na imagem debian fornecida pelo próprio Docker. A flag --name da um nome para o contêiner que será usado para referencia-lo quando fizermos operações como pará-lo ou remove-lo do host. A flag --hostname cria um usuário com o nome dado (no nosso caso, teste) interno ao container.

Neste contêiner podemos por exemplo instalar e rodar aplicações ou criar arquivos. Vamos testar. No terminal do contêiner recém criado digite os seguintes comandos:

root@teste:/# apt-get update
...
root@teste:/# apt-get install -y cowsay
...

Agora que temos um programa no contêiner vamos testá-lo. Rode o seguinte comando:

root@teste:/#  /usr/games/cowsay Moo
_____
< Moo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

Perfeito, já temos um container com um programa que recebe entradas e retorna uma saída. Porém repetir esses passos toda vez que quisermos construir um container será tedioso e poderá acarretar erros. É aí que entra o Dockerfile

O Dockerfile é um arquivo que define uma imagem, ele é obrigatoriamente baseado em uma imagem pai e tem uma sintaxe definida pela documentação do Docker. Uma das formas de compartilhar imagens entre times é compartilhar o próprio Dockerfile.

Vamos então sair do contêiner com o comando exit

root@teste:/# exit

Já fora do contêiner, crie uma pasta para manter as coisas organizadas:

$ mkdir vaquinha

Antes de criar um Dockerfile precisamos adicionar alguma lógica à nossa imagem. Vamos escrever um script que decide qual será a entrada do cowsay. De forma simplificada, se não for fornecida uma entrada ao nosso contêiner ele utilizará o programa fortune para fornecer uma frase bonita para o cowsay.

Script de inicialização do contêiner

Salve esse arquivo como entrypoint.sh dentro da pasta vaquinha.

Maravilha! Vamos agora escrever um Dockerfile para a nossa imagem.

A primeira instrução, FROM, informa em qual imagem pai a nova imagem será baseada.

Na linha 3, usamos a instrução RUN para instalar os programas necessários na nossa imagem.

Na linha 5, copiamos o arquivo entrypoint.sh que foi definido acima para o sistema de arquivos do contêiner em sua pasta raiz, indicada pelo caractere /.

Finalmente a instrução ENTRYPOINT indica à imagem que comando deve ser executado quando um contêiner, baseado nela, for iniciado. Neste caso queremos que seja o script entrypoint.sh.

Salve esse arquivo com o nome Dockerfile dentro da pasta vaquinha.

Parece pouco, mas com essa pequena receita já poderemos ter uma imagem só nossa, baseada na imagem debian com a tag jessie e dois programas instalados, o cowsay e o fortune.

Agora vamos construir esta imagem. Dentro da pasta do projeto, que foi criada em passos anteriores, vamos rodar o seguinte comando:

$ docker build -t=vaquinha .
Sending build context to Docker daemon 53.76kB
Step 1/3 : FROM debian:jessie
---> 79f4bda91989
Step 2/3 : RUN apt-get update && apt-get upgrade
...

A flag -t indica o nome da imagem que será construída. Não esqueça do . , pois ele indica onde está o Dockerfile utilizado para construção da nossa imagem.

Vamos verificar a nossa imagem listando as que residem no nosso host.

$ docker images

Agora vamos usar nossa nova imagem para criar um contêiner e executar os programas instalados.

$ docker run -it --rm vaquinha
________________________________
/ Never look up when dragons fly \
\ overhead. /
--------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ docker run -it --rm vaquinha "Mooo"
______
< Mooo >
------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

Revisando

Vamos apenas revisar alguns comandos importantes do Docker:

## Listar Comandos Docker
docker
docker container --help

## Mostrar a versão do Docker e informações do sistema
docker --version
docker version
docker info

## Executar um container
docker run hello-world

## Listar imagens
docker image ls

## Listar containers (rodando, todos)
docker ps
docker ps -a

Não esqueça que sempre é possível tirar dúvidas sobre qualquer comando Docker em sua documentação

Esta foi a primeira parte de uma série de artigos sobre como utilizar o Docker como ambiente de desenvolvimento Web. Neste artigo aprendemos diversos conceitos como: O que é uma imagem, o que é um contêiner. Aprendemos também como criar uma imagem personalizada que executa uma lógica baseada em entradas.

No próximo artigo mostrarei como instalar as dependências do framework Laravel, que foi escolhido como nosso motor Web, em uma imagem e instalar um servidor apache para refletir um ambiente de produção dentro do nosso contêiner. Stay tuned!!!!

--

--

Esron Silva
sysvale
Writer for

Computer Engineer — Web Developer — Amateur Writer