Arquitetura de Software

Conteúdo produzido pelas turmas de Arquitetura de Software - Computação @ UFCG

Docker - Documentação arquitetural usando o modelo C4


TLDR: Este documento apresenta uma sugestão para a documentação arquitetural do sistema de conteinerização Docker usando o modelo C4. Entender bem como funciona esse sistema é importante, visto que os conceitos de containers linux podem ser muito úteis para pessoas que trabalham com desenvolvimento de software. É importante destacar que esse documento não descreve todos os detalhes da arquitetura do Docker.


Autor

Este documento foi produzido por Vinicius Barbosa da Silva.


O que é o Docker?

Docker é um sistema de conteinerização que utiliza recursos do linux como namespaces e cgroups para criar pacotes de software que são leves, isolados e que agrupam código, bibliotecas e arquivos de configuração. A aplicação que roda em um container tem a impressão que o sistema está sendo usado apenas por ela e, dessa forma, não consegue acessar os recursos e processos de outros containers. Esse isolamento existe graças a funcionalidade de namespaces do linux.

O modelo de conteinerização pode ser muito eficaz para executar aplicações que não requerem uso exclusivo dos servidores, já que são executados pelo mesmo kernel de um sistema operacional,sendo uma ótima alternativa a virtualização tradicional com máquinas virtuais que levantam o SO inteiro e acabam desperdiçando recursos.

Os containers são inicializados através de uma Imagem base que pode vir de registros privados ou públicos como o docker hub, por exemplo. As imagens são construídas por camadas e podem vir pre-configuradas com um software de interesse da aplicação que rodará no container. Exemplos de imagens: mysql, ubuntu, alpine, nginx, apache, etc. Mais detalhes sobre o projeto Docker e sobre containers podem ser vistos aqui.

docker-multilayer

Imagem retirada de [3]. Nela, podemos ver que o container roda em cima de uma imagem composta por diversas camadas, onde cada uma possui um software específico. É importante mencionar que na base existe um “mini sistema operacional”, que no caso desse exemplo é o alpine linux

Diagrama de Contexto

No centro temos o sistema principal, o Docker, que prove serviços para criar, executar, atualizar, gerenciar containers linux.

O Docker pode ser usado de duas maneiras: via CLI ou usando a API diretamente. Ambas as formas produzem o mesmo resultado, apenas a forma de fazer que muda. Isso permite que sistemas externos como o Kubernetes usem o Docker com facilidade.

O sistema Docker utiliza um serviço externo de registro de imagens, que pode ser público (como o Dockerhub) ou um registro privado de uma empresa particular

context_diagram

Diagrama de Containers

Os componentes internos do Docker incluem a CLI, API application e o Docker storage directory.

A CLI é implementada em golang e usa a biblioteca Cobra(ver library) para se comunicar com a RESTful API application.

A RESTful API application fornece seus serviços por meio do protocolo HTTP (ver mais). Essa api faz a conexão entre a CLI ou aplicação que usa a api diretamente com o deamon do Docker (chamado Docker Engine API), que é o core do Docker e que será melhor descrito no diagrama de componentes.

O Docker storage directory é responsável por armazenar os dados dos containers (o filesystem e seus volumes) e as imagens que foram baixadas do registro. Por default, o repositório se encontra em /var/lib/docker, mas pode ser trocado para qualquer outro diretório do sistema de arquivos, por exemplo, em um disco externo: /mnt/disk3/docker.

container_diagram

Diagrama de Componentes

Os componentes internos da API Application foram representados por: Docker Daemon, Kernel Component, Container Component e Image Component.

O Docker Component é responsável por receber as requisições da API e utilizar os demais componentes internos (Kernel, Image, Container component) para entregar resultado para o cliente, isto é, criar e gerenciar os containers.

O Kernel Component existe para lidar com o sistema operacional linux e pedir recursos para a criação de containers como namespaces e cgroups.

O Container Component lida com o gerenciamento dos containers.

O Image Component lida com o gerenciamento, criação de imagens e download/envio de imagens para o registro.

components_diagram

Diagrama da Visão de Informação

Ciclo de vida de um container

Os containers docker possuem 5 estados principais: CREATED, RUNNING, PAUSED, STOPPED e DELETED.

O primeiro estado, CREATED, é atingido através do comando docker create, estando pronto para seguir para um dos proximos estados: RUNNING (via docker start) ou DELETED (via docker rm)

O container quando está no estado RUNNING, pode ter diversos caminhos:

  • ser pausado e passar para o estado PAUSED (via docker pause) e possivelmente voltar para o estado RUNNING (via docker unpause)

  • ser reiniciado via docker restart

  • ser parado e passar para o estado STOPPED (via docker kill ou docker stop)

E por fim, temos o estado DELETED, que é atingido ao usarmos o comando docker rm.

components_diagram

Diagrama do ciclo de vida dos containers feito por Docker Saigon [2]

Referencias

  1. https://www.docker.com/products/container-runtime
  2. http://docker-saigon.github.io/post/Docker-Internals
  3. https://ragin.medium.com/docker-what-it-is-how-images-are-structured-docker-vs-vm-and-some-tips-part-1-d9686303590f