Docker: Guia de sobrevivência - Parte 2

  • Publicado em: 27/12/2020

Não li, nem lerei

Um breve resumo para pessoas cansadas

Sabendo alguns comandos básicos de Docker, tais como: `docker run`, `start`, `build`, `images`, `ps`, `rm`, `rmi`, vamos explorar como manter um container em execução, realizar comandos dentro do mesmo, pará-lo e, como realizar a criação de uma imagem customizada para o Docker.

Sem delongas, vamos continuar nosso processo da parte 1 e manter um container em pé sem travar nosso Terminal.

Baixando uma imagem base

A imagem escolhida para utilizarmos é do Ubuntu: git pull ubuntu e, é importante dizer que quando esse comando executa, pega a versão mais recente da imagem do Ubuntu no Docker Hub. Você poderia estipular uma versão específica utilizando essa sintaxe: docker pull ubuntu:21.04

Criando um container e rodando comandos

Execute nossa imagem com docker run, mantendo o terminal interativo com a flag -it para executarmos comandos dentro do container e nomeando nosso container como lab utilizando a flag --name: docker run -it --name lab ubuntu

Pronto, se você rodar o comando ls, poderá ver uma estrutura de pastas.
Estamos executando um sistema Linux “enxuto” mas vamos fazer algo mais divertido do que listar diretórios, certo?

  • Atualize os pacotes do Ubuntu: apt-get update
  • Instale o pacote sudo: apt-get -y install sudo
  • Digite echo $USER e repare que é retornada uma string em branco
  • Então vamos mudar para o super user: sudo su
  • Digite echo $USER novamente e veja que a resposta é root
  • Instale o pacote cowsay: sudo apt-get -y install cowsay
  • Rode o comando: cowsay MUUUUUU
  • Agora você tem uma vaquinha falante 🐮
  • Para sair, digite exit quantas vezes forem necessárias até seu Terminal voltar ao normal

Agora vamos verificar se o container continua em pé com: docker ps
A resposta é sim, então vamos entrar novamente nele: docker exec -it lab bash
E se quisermos executar o comando cowsay temos somente que trocar nosso usuário com sudo su, pois nossas modificações foram mantidas.

Parando o container

Vamos parar o container com: docker stop lab E a lista retornada do comando docker ps deve estar vazia.

Subindo novamente o container

Se quiser recomeçar o processo, é possível subir o container novamente com docker start lab E repetir o ciclo com docker exec -it lab bash

Utilizando Dockerfile para facilitar a construção de imagens

Imagine cada pessoa desenvolvedora tendo que aplicar diversos comandos sobre uma imagem base para rodar um projeto. A margem de erro seria enorme e o tempo consumido também. Então eis que surge o Dockerfile.

Dockerfile

O Dockerfile é um arquivo que comumente vai na raiz de nosso projeto e permite que construamos nossas próprias imagens e a utilizemos como base para os containers. Abaixo temos um exemplo de configuração:

FROM imagem # Imagem base que estamos utilizando RUN comando # Comando bash WORKDIR /app # Diretório "raíz" para os comandos a seguir COPY . /app # Copia arquivos para dentro do container VOLUME /app # Volumes exportos para fora do container EXPOSE 3000 # Portas liberadas para fora do container CMD ["comando", "parametros", …] # Comando que deve ser executado assim que um container sobe

Vamos reconstruir nossa imagem Ubuntu com suas dependências utilizando Dockerfile.

# imagem base FROM ubuntu # dependências RUN apt-get update && apt-get -y install sudo && sudo apt-get -y install cowsay # "cowsay" é instalado em /usr/games ENV PATH $PATH:/usr/games # as instruções passadas no comando 'docker run' serão executadas com bash CMD /bin/bash

Agora vamos rodar o comando para criar a imagem: docker build -t lab_image .

Confirmar se a imagem foi criada: docker images | grep lab_image

E rodar a imagem: docker run --rm lab_image cowsay muuuu

Um pouco mais sobre Entrypoint e CMD

O Docker tem um entrypoint padrão, que é: /bin/sh -c mas não tem um comando especificado.
Em outras palavras, o entrypoint especifica o comando que será executado sempre que o container iniciar e o CMD especifica os argumentos que serão passados para o entrypoint e, pelo menos um deles deve estar especificado no Dockerfile.

Quando você utiliza o comando docker run -i -t ubuntu bash, o entrypoint é o padrão, a imagem é a Ubuntu e o comando é bash.

Desse modo, o que realmente é executado é: /bin/sh -c bash.

O comando RUN

O comando RUN cria uma camada nova no container (os container são feito de camadas read-only onde a ultima camada é read/write), por isso é bom concatenar o máximo de comando possível pro seu container ficar com menos camadas assim economizando espaço, ganhando performance.

Indicação de curso

Indicação de leitura

Referências:

Felipe Marciano
Sobre o autor
Felipe Marciano

dev front-end, viciado em café, cinema e abraçar cachorros.

Tem perguntas,fale comigo.Respondo assim que puder.
Para mandar um "Oi" 👋felipexperto@gmail.com
Me siga no LinkedIn 🚀linkedin.com/in/felipexperto/
© 2024, Construído com Gatsby