Docker - Como Funciona nos Bastidores
Um pouco sobre a arquitetura do Docker, passando rapidamente por cada um de seus componentes.

A maioria das pessoas que escutam falar de Docker pela primeira vez, acabam fazendo uma analogia com o conceito de máquinas virtuais, apesar de ser muito parecido para quem olha de fora, por baixo dos panos a coisa é bem diferente.
Diferente de máquinas virtuais onde você precisa subir todo um sistema operacional, o Docker utiliza recursos do Kernel do Linux como namespaces, cgroups e chroot para isolamento dos processos em execução, com isso temos ganhos muito grandes no tempo de provisionamento das instâncias e economia de recursos do host.
Arquitetura Docker
A arquitetura do Docker é composta pelos seguintes componentes:
Client: Também conhecido como Docker CLI, ele é utilizado para acessar os recursos disponibilizados pelo Docker Server (Host). O Docker Client não precisa necessariamente estar rodando na mesma máquina do Docker Server, desta forma é possível administrar vários servers Docker a partir do mesmo client. Toda a comunicação realizada entre o Docker client e server é feita através do uso de apis.
A sintaxe padrão de utilização é a seguinte:
docker [option] [command] [arguments]
Host: O Docker Host (Server) é o componente que faz toda a interação com o sistema operacional da máquina hospedeira, dentre várias responsabilidades, ele é utilizado para gestão das imagens e fala diretamente com o Kernel do OS para criação e gerenciamento dos containers.
Registry: Semelhante ao Git Hub onde versionamos nossos fontes, o Docker Registry é utilizado para versionamento das imagens. Assim como no Git Hub, podemos ter registros privados ou públicos, caso não seja especificado nenhum registro durantes as operações em imagens (pull, push…), o default será o Docker Hub, o registro público mantido pela própria empresa criadora do Docker (Docker, Inc).
Objects: O Docker Objects é composto por basicamente quatro tipos de objetos:
- Images: As imagens são utilizadas de moldes para criação dos containers, elas são compostas por layers e são read only em sua essência. Pelo fato de serem read only, uma só imagem compartilha seus layers com todos os containers criados a partir dela, por exemplo: Você tem uma imagem do Ubuntu que ocupa 200MB (dado hipotético) do host, quando você cria um ou mais containers a partir desta imagem, você continua tendo somente os 200MB consumidos do host, mais (+) os dados que são persistidos na camada de escrita dos containers. Falaremos mais sobre a camada de escrita dos container na sequência.
- Containers: Os containers como já foi citado acima, são criados a partir de uma imagem base e resumidamente são ambientes auto contidos onde uma aplicação é executada. Assim que um container é criado, além de aproveitar todos os layers (read only) da imagem base, ele ganha um layer de escrita que é utilizado para persistência dos dados em tempo de execução. Vale atentar que por natureza um container é volátil, desta forma não recomenda-se a persistência de dados sem a utilização de Docker Volumes, falaremos mais de volumes no item Storage.
- Storage (Volumes): São utilizados quando precisamos manter estado do nosso container, seja com a máquina hospedeira, em memória ou remotamente. Resumidamente temos algumas maneiras de trabalhar com volumes no Docker, podemos criar volumes que são gerenciados pelo Docker Engine através do docker volume create, utilizar mapeamento de diretórios entre o container e o host (também conhecido como bind mount) e através do tmpfs para armazenamento em memória. Também podemos utilizar o Docker Storage Plugins para conectar com plataformas externas de armazenamento.
- Networking: Para trabalhar com rede no Docker, temos disponíveis alguns drivers. O Bridge que é o driver padrão, através de uma interface virtual de rede criada no host durante a instalação do Docker, cria uma ponte com a máquina hospedeira para comunicação com os demais containers em execução neste mesmo host. O Overlay, utilizado em ambiente de cluster onde precisamos fazer um container que está rodando no host A, falar com um container que está rodando no host B. O Macvlan, com este driver é possível que sua interface de rede virtual tenha um Mac Address, fazendo com que pareça ser uma interface física conectada diretamente na rede.
Nos últimos anos, com a evolução das arquiteturas de Cloud e Micro Serviços, o Docker tem estado presente em grande parte do mercado de tecnologia, seja na utilização de forma standalone ou com orquestradores como Kubernetes e Swarm. Atualmente todos os grandes fornecedores de Cloud já oferecem infraestrutura para execução de containers Docker, seja de forma orquestrada ou não. O Azure da Microsoft por exemplo, fornece o serviço Container Instance para execução de containers sem orquestração e o AKS (Azure Kubernetes Service) para containers orquestrados pelo Kubernetes.
Por onde começar?
Acredito que um bom começo seja realizar a instalação do Docker na sua máquina local e começar a brincar com a execução containers através de imagens presentes no Docker Hub. Para maiores informações de como instalar o Docker, acesse o link https://docs.docker.com/install/.
Caso não queira instalar o Docker na sua máquina local, você pode utilizar o Play With Docker, que é um ambiente disponível para que você possa utilizar durante o período de 4 horas em seus aprendizados e experiências.