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):
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.