Desmitificando o docker…

hugo espinelli
soma-labs
3 min readMay 22, 2019

--

Seu servidor funciona na sua máquina, porém não funciona em outro computador? Acabe com seus problemas de configuração de servidor!

Não é de hoje que se tem problemas de configuração de servidor quando rodado em diferentes máquinas. Muitas variáveis estão envolvidas quando se roda um servidor localmente, por consequência, os erros no ambiente são bem comuns e na maioria das vezes, bem incômodos de resolver.

E se houvesse alguma maneira de isolar o servidor localmente de maneira que fosse igual para todas as máquinas quando ele rodar? Para isso foi criado o nosso grande amigo Docker.

O docker foi projetado para que se possa criar, fazer deploy de maneira fácil de uma aplicação usando containers. Os containers são gerados a partir de imagens que permitem ao desenvolvedor encapsular todos os pacotes necessários daquela aplicação em algo parecido como uma máquina virtual. Isso garante que independente da máquina que esteja rodando o docker, as configurações setadas são sempre as mesmas. Seja rodando num sistema operacional linux ou windows, a “maquina virtual” será sempre a mesma.

Containers…imagens…Afinal o que é isso?

Para um container ser executado, antes deve-se criar uma imagem. Uma imagem é um pacote executável onde se inclui tudo o que se deve rodar na aplicação. Um container é uma instância da imagem em tempo de execução.

Fazendo uma analogia, é como se você quisesse fazer uma receita de um bolo(seria a aplicação). E para fazer a receita, você precisa dos ingredientes: farinha, leite, ovo e etc, e saber como vai preparar-la(isso tudo seria imagem). Porém para se ter o bolo, você precisa botar a mão na massa: misturar a farinha, botar no forno e etc (containers).

O importante é saber que containers são gerados a partir de imagens. E como são instâncias, elas não guardam informação após sua utilização.

Criando um container…

Em nosso exemplo, vamos simular com uma imagem pré-gerada pelo google cloud. Nessa imagem, rodamos a versão 8.0 do nodejs em um Ubuntu.

Primeiro, criaremos um dockerfile na pasta principal do nosso projeto para setar as nossas configurações:

# Aqui é onde pegamos a imagem do google.
FROM gcr.io/google-appengine/nodejs@sha256:5add6da6c28ce58ffe690fe949a8776726b0c6fd2f1c18ca484cff7ada895c33
# A partir daqui é onde damos os comandos para diretamente ao sistema operacional. É como se tivessemos aberto o prompt de comando da nossa máquina virtual# Para se instalar qualquer programa via terminal no Ubuntu, é necessário usar esse comando.
RUN apt-get update && apt-get upgrade --assume-yes
# Aqui escolhemos onde vamos por nosso diretório do projeto
WORKDIR /app
# Aqui copiamos o package da nossa máquina real para o docker
COPY package*.json /app/
# Aqui rodamos o npm install para instalar as dependências do projeto
RUN npm i
# Aqui copiamos todos os arquivos do nosso projeto para a máquina virtual. (é interessante fazer um arquivo .dockerignore para não passar o node_modules junto)
COPY . /app
# Aqui abrimos as portas do nosso docker para a nossa máquina real. Lembre-se: Containers são independentes e isolados.EXPOSE 8080
EXPOSE 6379

Agora com tudo devidamente configurado, utilizamos o comando para montar nossa imagem:

docker build -t myProject

O docker cria uma chave aleatória para o nome do projeto, porém podemos nomear do jeito que quisermos. Usamos a tag -t para nomear nosso projeto como myProject. Para verificar se nossa imagem foi criada com sucesso, podemos listar todas as imagens ativas com o comando:

docker images

Agora com nossa imagem criada, podemos criar nosso container! Para isso usamos o comando:

docker run -it -p 6379:6379 -p 8080:8080

Concluindo…

Portanto, com o docker ao nosso lado conseguimos isolar as variáveis de ambientes operacional, com isso eliminamos problemas referentes ao servidor que estamos rodando nossa aplicação. Podemos sempre simular a mesma máquina independentemente de qual computador esteja instalado. Maravilha, não?

--

--

hugo espinelli
soma-labs

Full stack developer. Game enthusiast and crazy to learn new things. Passionate about aviation.