Fundamentos do Gerenciamento de Imagens Docker

Uma imagem Docker é um modelo leve, autocontido e executável que inclui tudo o que é necessário para executar uma aplicação: o código, um ambiente de tempo de execução, bibliotecas, variáveis de ambiente e arquivos de configuração. Imagens servem como a base para a criação e execução de containers Docker.

A arquitetura das imagens Docker é baseada em um sistema de arquivos em camadas. Na base, temos o bootfs, que contém o kernel do sistema operacional e o bootloader. Após a inicialização do container, o bootfs é descarregado da memória para otimizar o uso de recursos.

Acima do bootfs, encontra-se o rootfs, que serve como o sistema de arquivos raiz do container. Em ambientes tradicionais, o rootfs é montado inicialmente em modo somente leitura e depois remontado como leitura e escrita. No Docker, no entanto, o rootfs permanece montado como somente leitura, e uma camada extra, gravável, é adicionada usando uma tecnologia de union mount (montagem união), como o OverlayFS (geralmente implementado via overlay2), permitindo que as alterações sejam feitas no container sem modificar a imagem base.

Essa abordagem em camadas otimiza o uso de disco e rede, pois as camadas compartilhadas entre diferentes imagens ou containers precisam ser armazenadas apenas uma vez, tornando as imagens eficientes e portáveis.

Registries Docker

Um Registry Docker funciona como um repositório centralizado para armazenar e distribuir imagens Docker. Ele organiza as imagens de forma hierárquica e gerencia seus metadados.

O Docker Hub é o Registry público padrão, mantido pela Docker, Inc., onde os usuários podem encontrar e compartilhar uma vasta gama de imagens. Além do Docker Hub, é comum para empresas e equipes configurarem seus próprios Registries privados para hospedar imagens internas, garantindo controle de acesso e segurança.

Os Registries podem ser classificados em:

  • Registries Públicos: Como o Docker Hub, acessíveis a todos, embora possam exigir autenticação para operações como 'push' de imagens.
  • Registries Privados: Operados por organizações para uso interno, frequentemente protegidos por firewalls e autenticação robusta, para garantir a privacidade e segurança das imagens.

Repositórios e Tags de Imagens

Dentro de um Registry, as imagens são organizadas em Repositórios. Um repositório agrupa todas as versões (ou variações) de uma imagem específica. Por exemplo, um repositório ubuntu pode conter diferentes versões do sistema operacional Ubuntu.

Cada imagem em um repositório é identificada por uma Tag (etiqueta), que geralmente indica uma versão (ex: 18.04, 20.04) ou uma variação específica (ex: alpine, focal). A tag latest é uma convenção comum para indicar a versão mais recente de uma imagem, mas não é automaticamente atualizada e deve ser gerenciada com cuidado.

A sintaxe para referenciar uma imagem completa é [registry_hostname[:porta]/][namespace/]nome_do_repositorio:tag. Se o registry_hostname não for especificado, o Docker assume o Docker Hub. O namespace é comum para imagens de usuários ou organizações (ex: minhaorganizacao/meuapp).

Para baixar uma imagem de um Registry, utiliza-se o comando docker pull:

docker pull meu.registry.com/minhaorganizacao/meuapp:v1.0

Quando a porta não é especificada, a comunicação padrão é via HTTPS na porta 443.

Construindo Imagens

Criando uma Imagem a Partir de um Container Existente

Uma maneira de criar uma imagem é capturar o estado de um container em execução ou parado. Este método é útil para experimentar ou quando as alterações são mínimas. No entanto, para ambientes de produção, a prática recomendada é a criação de imagens usando Dockerfiles, pois eles oferecem um processo de construção mais transparente e automatizado.

Para criar uma imagem a partir de um container, siga estes passos:

Passo 1: Iniciar um container e fazer alterações.
Vamos iniciar um container baseado na imagem busybox, criar alguns arquivos e depois encerrar a sessão interativa:

# No seu terminal
docker run --name servidor_web_temp -it busybox:latest /bin/sh
/ # mkdir -p /srv/www/
/ # echo '<h1>Servidor Web Simples com BusyBox</h1>' > /srv/www/index.html
/ # exit 
# O container 'servidor_web_temp' agora está em estado parado.

Passo 2: Comprometer (commit) as alterações em uma nova imagem.
Em um segundo terminal (ou no mesmo, após o container ter parado), podemos agora 'salvar' o estado do container como uma nova imagem. O comando docker commit cria uma nova imagem a partir das mudanças feitas no sistema de arquivos do container.

# No seu terminal
docker commit servidor_web_temp meu_usuario/busybox-web:v1.0

Este comando criará uma nova imagem baseada no container servidor_web_temp, nomeando-a meu_usuario/busybox-web e com a tag v1.0. O output será o ID da nova imagem.

Visualizando a nova imagem:

docker images

Adicionando Tags Adicionais:
Podemos adicionar tags adicionais a uma imagem existente para referenciar a mesma imagem com nomes ou versões diferentes. Isso é útil para marcar a última versão ou para criar apelidos.

docker tag meu_usuario/busybox-web:v1.0 meu_usuario/busybox-web:latest
docker images

Modificando Metadados da Imagem durante o Commit:
É possível definir metadados como o autor e o comando padrão (CMD) que será executado quando um container for iniciado a partir desta imagem. Por exemplo, para configurar o servidor httpd do busybox para servir arquivos do diretório /srv/www:

docker commit -a "Seu Nome <email@example.com>" \
              -c 'CMD ["/bin/httpd", "-f", "-h", "/srv/www"]' \
              servidor_web_temp meu_usuario/busybox-web:v1.1

Agora, ao iniciar um container com meu_usuario/busybox-web:v1.1, o servidor httpd será iniciado automaticamente com as configurações especificadas.

Importação e Exportação de Imagens

Para portabilidade e backup, imagens Docker podem ser exportadas para um arquivo TAR e improtadas de volta. Isso é particularmente útil para transferir imagens entre ambientes que não têm acesso direto a um Registry ou para arquivamento.

Exportando Imagens

O comando docker save permite exportar uma ou mais imagens para um arquivo TAR. Isso inclui todas as camadas e metadados da imagem, preservando sua estrutura completa.

docker save meu_usuario/busybox-web:v1.0 meu_usuario/busybox-web:v1.1 -o backup_imagens_web.tar

Ou, para exportar uma única imagem para um arquivo específico:

docker save -o imagem_unica_v1_0.tar meu_usuario/busybox-web:v1.0

Importando Imagens

O comando docker load lê um arquivo TAR gerado por docker save e carrega as imagens de volta para o ambiente local do Docker daemon.

docker load -i backup_imagens_web.tar

Após o carregamento, as imagens estarão disponíveis para uso local, e você pode verificá-las com docker images.

Tags: Docker Containerização Gerenciamento de Imagens Registries Docker Comandos Docker

Publicado em 6-7 00:42 por Thomas