Docker quick guide

Docker quick guide

No mundo da bioinformática, desenvolvimento de software e administração de sistemas, a capacidade de criar, implantar e executar aplicações de forma consistente em diferentes ambientes é crucial. É aqui que o Docker entra em cena, uma ferramenta poderosa que revolucionou a maneira como lidamos com aplicações.

O Que São Contêineres e Por Que Docker?

Antes do Docker, a virtualização tradicional com Máquinas Virtuais (VMs) era o padrão. VMs emulam um sistema operacional completo, incluindo hardware virtual, o que consome muitos recursos.

Contêineres são diferentes. Eles compartilham o kernel do sistema operacional do host, mas isolam os processos da aplicação. Pense neles como pacotes leves que contêm tudo o que uma aplicação precisa para rodar: código, bibliotecas, dependências e configurações.

Docker é uma plataforma de código aberto que automatiza a implantação de aplicações dentro desses contêineres.

VMs vs. Contêineres (Docker):

CaracterísticaVMsContêineres (Docker)
PesoPesado (Heavyweight)Leve (Lightweight)
PerformancePerformance limitadaPerformance nativa
Sistema OperacionalCada VM roda seu próprio SOCompartilham o SO do host
VirtualizaçãoNível de hardwareNível de SO
Tempo de InicializaçãoMinutosMilissegundos
MemóriaAloca memória requeridaRequer menos espaço de memória
IsolamentoTotalmente isolado, mais seguroIsolamento a nível de processo, menos seguro em alguns cenários

Visualização da diferença (adaptado de https://blog.netapp.com/):

VMs: [App1, Bins/Lib, Guest OS] [App2, Bins/Lib, Guest OS] ... sobre um Hypervisor e Infraestrutura.

Contêineres: [App1, Bins/Lib] [App2, Bins/Lib] ... sobre um Container Engine (Docker), Sistema Operacional do Host e Infraestrutura.

Quando Usar Docker?

Aprender novas tecnologias: Ambiente isolado e descartável.

Casos de uso básicos: Usar imagens prontas do Docker Hub (ex: LAMP stack).

Isolamento de aplicações: Rodar múltiplas apps em um servidor sem conflitos de dependência.

Equipes de desenvolvimento: Ambientes de desenvolvimento locais que espelham a produção.

Quando NÃO Usar Docker (ou usar com cautela)?

Aplicações complexas sem um sysadmin experiente.

Performance crítica ao extremo (Docker adiciona uma pequena sobrecarga).

Segurança crítica em aplicações muito complexas (requer engenharia de segurança experiente).

Necessidade de múltiplos sistemas operacionais (VMs são melhores para isso).

Componentes e Terminologia Essenciais do Docker

Docker Engine: O coração do Docker. É uma aplicação cliente-servidor com:

Server (Daemon): dockerd, um processo que cria e gerencia imagens, contêineres, redes e volumes.

REST API: Interface para o daemon ser instruído.

Client (CLI): docker, a interface de linha de comando para interagir com o daemon.

Docker Image (Imagem Docker): Um template somente leitura com instruções para criar um contêiner Docker. Contém a aplicação e todas as suas dependências.

Docker Container (Contêiner Docker): Uma instância executável de uma imagem. É a aplicação rodando.

Docker Hub: Um registro online oficial onde você pode encontrar e compartilhar imagens Docker.

Instalando o Docker CE no Ubuntu 20.04 LTS

O guia H3ABioNet detalha duas formas: via APT (Advanced Packaging Tool) e Snap. Vamos focar no método APT, que é bastante comum.

Atualize a lista de pacotes:

sudo apt update

content_copydownloadUse code with caution.Bash

Instale pacotes de pré-requisito:

sudo apt install curl apt-transport-https ca-certificates software-properties-common

content_copydownloadUse code with caution.Bash

Adicione a chave GPG oficial do Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

content_copydownloadUse code with caution.Bash

Adicione o repositório Docker:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

content_copydownloadUse code with caution.Bash

Atualize novamente a lista de pacotes (com o novo repositório):

sudo apt update

content_copydownloadUse code with caution.Bash

Verifique se você vai instalar do repositório Docker (opcional, mas bom):

apt-cache policy docker-ce

content_copydownloadUse code with caution.Bash

Instale o Docker CE:

sudo apt install docker-ce

content_copydownloadUse code with caution.Bash

Inicie o serviço Docker:

sudo service docker start

content_copydownloadUse code with caution.Bash

Verifique o status do Docker:

sudo systemctl status docker

content_copydownloadUse code with caution.Bash

Habilite o Docker para iniciar no boot (opcional):

sudo systemctl enable docker

content_copydownloadUse code with caution.Bash

Adicione seu usuário ao grupo docker (para evitar usar sudo sempre):

sudo usermod -aG docker ${USER}

content_copydownloadUse code with caution.Bash

Nota: Você precisará fazer logout e login novamente para que essa alteração tenha efeito.

Primeiros Passos: Comandos Básicos

Informações do Docker:

docker info

content_copydownloadUse code with caution.Bash

Rodar um contêiner e entrar no seu shell (interativo):

docker run -i -t ubuntu /bin/bash
# -i: interativo
# -t: aloca um pseudo-TTY
# ubuntu: nome da imagem (será baixada do Docker Hub se não existir localmente)
# /bin/bash: comando a ser executado dentro do contêiner

content_copydownloadUse code with caution.Bash

Para sair do contêiner, digite exit.

Rodar um contêiner executando um comando simples:

docker run ubuntu echo "Olá Mundo do Docker!"

content_copydownloadUse code with caution.Bash

Listar contêineres em execução (e parados):

docker ps -a

content_copydownloadUse code with caution.Bash

Parar um contêiner:

docker stop NOME_OU_ID_DO_CONTAINER

content_copydownloadUse code with caution.Bash

Iniciar um contêiner parado:

docker start NOME_OU_ID_DO_CONTAINER

content_copydownloadUse code with caution.Bash

Anexar a um contêiner em execução:

docker attach NOME_OU_ID_DO_CONTAINER

content_copydownloadUse code with caution.Bash

Remover um contêiner (deve estar parado):

docker rm NOME_OU_ID_DO_CONTAINER

content_copydownloadUse code with caution.Bash

Remover todos os contêineres parados:

docker container prune
# Ou o comando do guia: docker rm $(docker ps --no-trunc -aq)

content_copydownloadUse code with caution.Bash

Trabalhando com Imagens Docker

Listar imagens locais:

docker images

content_copydownloadUse code with caution.Bash

Baixar uma imagem do Docker Hub:

docker pull ubuntu:20.04 # Especificando uma tag/versão
docker pull ubuntu       # Pega a tag 'latest' por padrão

content_copydownloadUse code with caution.Bash

Criar sua própria imagem (usando um Dockerfile):

Crie um diretório para seu projeto, ex: meu-app-nginx.

Dentro dele, crie um arquivo chamado Dockerfile (sem extensão).

Exemplo de Dockerfile para um servidor Nginx simples:

# Imagem base
FROM ubuntu:20.04

# Mantenedor (opcional, mas boa prática)
MAINTAINER Seu Nome "[email protected]"

# Comandos para configurar a imagem
RUN apt-get update
RUN apt-get install -y nginx

# Copia um arquivo local para dentro da imagem
# (Supondo que você tenha um index.html no mesmo diretório do Dockerfile)
# COPY index.html /usr/share/nginx/html/

# Comando para rodar quando o contêiner iniciar
CMD ["nginx", "-g", "daemon off;"]

# Expõe a porta (informativo, não publica a porta automaticamente)
EXPOSE 80

content_copydownloadUse code with caution.Dockerfile

Construa a imagem:

# No diretório onde está o Dockerfile
docker build -t meu-app-nginx:v1 .
# -t: nome e tag da imagem (nome/tag)
# .: contexto de build (o diretório atual)

content_copydownloadUse code with caution.Bash

Remover uma imagem:

docker rmi NOME_DA_IMAGEM:TAG

content_copydownloadUse code with caution.Bash

Docker Registry (Registro Docker)

O Docker Hub é o registro público padrão, mas você pode ter registros privados.

Login no Docker Hub:

docker login
# Você precisará de uma conta no Docker Hub

content_copydownloadUse code with caution.Bash

Procurar imagens no Docker Hub:

docker search centos

content_copydownloadUse code with caution.Bash

Enviar sua imagem customizada para o Docker Hub:

Primeiro, sua imagem precisa ser nomeada corretamente: SEU_USUARIO_DOCKERHUB/NOME_DA_IMAGEM:TAG

docker tag meu-app-nginx:v1 SEU_USUARIO_DOCKERHUB/meu-app-nginx:v1

content_copydownloadUse code with caution.Bash

Depois, envie:

docker push SEU_USUARIO_DOCKERHUB/meu-app-nginx:v1

content_copydownloadUse code with caution.Bash

Rede Docker: Expondo Portas

Para acessar uma aplicação rodando dentro de um contêiner (como um servidor web), você precisa mapear uma porta do host para uma porta do contêiner.

Rodar um contêiner Nginx mapeando a porta 8080 do host para a porta 80 do contêiner:

docker run -d -p 8080:80 --name meu-nginx-web meu-app-nginx:v1
# -d: roda em modo detached (background)
# -p 8080:80 : mapeia porta_host:porta_container
# --name: nomeia o contêiner

content_copydownloadUse code with caution.Bash

Agora você pode acessar http://localhost:8080 no seu navegador.

Volumes Docker: Persistindo Dados

Contêineres são, por padrão, efêmeros. Se você remove um contêiner, seus dados são perdidos. Volumes são usados para persistir dados.

Montar um diretório do host como volume:

Crie um diretório no host: mkdir -p /meus-dados-web

Crie um arquivo de teste: echo "Dados do Host" > /meus-dados-web/teste.txt

Rode o contêiner montando o volume:

docker run -it -v /meus-dados-web:/dados-no-container ubuntu /bin/bash
# Dentro do contêiner, verifique /dados-no-container
# ls /dados-no-container
# cat /dados-no-container/teste.txt

content_copydownloadUse code with caution.Bash

Alterações feitas em /meus-dados-web no host refletirão em /dados-no-container no contêiner, e vice-versa.

Exemplo Prático: Site Estático com Nginx

Vamos juntar alguns conceitos para servir um site estático simples.

Crie a estrutura do projeto:

meu-site-nginx/
├── Dockerfile
└── public_html/
    └── index.html

content_copydownloadUse code with caution.

Conteúdo do public_html/index.html:

<html>
  <head><title>Meu Site Docker!</title></head>
  <body>
    <h1>Olá Mundo do Docker e Nginx!</h1>
    <p>Este é um site estático simples servido por um contêiner Docker.</p>
  </body>
</html>

content_copydownloadUse code with caution.Html

Conteúdo do Dockerfile:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY public_html/ /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

content_copydownloadUse code with caution.Dockerfile

Construa a imagem (no diretório meu-site-nginx):

docker build -t meu-site-estatico .

content_copydownloadUse code with caution.Bash

Rode o contêiner:

docker run -d -p 80:80 --name site-nginx meu-site-estatico

content_copydownloadUse code with caution.Bash

Se a porta 80 já estiver em uso no seu host, use outra, ex: -p 8080:80 e acesse http://localhost:8080.

Acesse no navegador: http://localhost (ou a porta que você mapeou).

Conclusão

O Docker é uma ferramenta incrivelmente versátil que simplifica o ciclo de vida do desenvolvimento e implantação de software. Este guia, inspirado no material do H3ABioNet, apenas arranhou a superfície. Encorajamos você a explorar mais a fundo, experimentar com diferentes imagens, construir seus próprios Dockerfiles e descobrir como o Docker pode otimizar seus fluxos de trabalho.