Sumário
Arquitetura Docker
O Docker utiliza arquitetura cliente-servidor. O Docker client se comunica com o Docker daemon, que faz o trabalho pesado de construir, executar e distribuir seus containers Docker. O Docker client e o daemon podem rodar no mesmo sistema, ou você pode conectar um Docker client a um daemon Docker remoto. Eles se comunicam usando uma API REST, através de sockets UNIX ou uma interface de rede. Outro Docker client é o Docker Compose, que permite trabalhar com aplicações que consistem em um conjunto de containers.

Docker Daemon
O Docker daemon (dockerd) escuta por solicitações da API Docker e gerencia objetos Docker, como imagens, containers, redes e volumes. Um daemon também pode se comunicar com outros daemons para gerenciar serviços Docker.
Docker Client
O Docker client (docker) é a principal forma de interação para muitos usuários do Docker. Quando você usa comandos como docker run, o client envia esses comandos para o dockerd, que os executa. O comando docker utiliza a API Docker. O Docker client pode se comunicar com mais de um daemon.
Docker Registry
Um Docker registry armazena imagens Docker. O Docker Hub é um registry público que qualquer pessoa pode usar, e o Docker procura imagens no Docker Hub por padrão. Você também pode executar seu próprio registry privado.
Quando você usa os comandos docker pull ou docker run, o Docker baixa as imagens necessárias do seu registry configurado. Quando você usa o comando docker push, o Docker envia sua imagem para o registry configurado.
Docker Images
Uma imagem é um template somente leitura com instruções para criar um container Docker. Frequentemente, uma imagem é baseada em outra imagem, com alguma personalização adicional. Por exemplo, você pode construir uma imagem baseada na imagem do Ubuntu, mas que instala o servidor web Apache e sua aplicação, além dos detalhes de configuração necessários para fazer sua aplicação rodar.
Você pode criar suas próprias imagens ou usar apenas as criadas por outros e publicadas em um registry. Para construir sua própria imagem, você cria um Dockerfile com uma sintaxe simples para definir os passos necessários para criar a imagem e executá-la. Cada instrução em um Dockerfile cria uma camada na imagem. Quando você altera o Dockerfile e reconstrói a imagem, apenas as camadas que foram modificadas são reconstruídas. Isso é parte do que torna as imagens tão leves, pequenas e rápidas, em comparação com outras tecnologias de virtualização.
Docker Container
Um container é uma instância executável de uma imagem. Você pode criar, iniciar, parar, mover ou excluir um container usando a API ou CLI do Docker. Você pode conectar um container a uma ou mais redes, anexar armazenamento a ele ou até mesmo criar uma nova imagem com base no seu estado atual.
Por padrão, um container é relativamente bem isolado de outros containers e da máquina host. Você pode controlar quão isolada será a rede, o armazenamento ou outros subsistemas subjacentes de um container em relação a outros containers ou à máquina host.
Um container é definido pela sua imagem, assim como por qualquer opção de configuração que você fornecer a ele quando criar ou iniciar. Quando um container é removido, qualquer alteração em seu estado que não esteja armazenada em um armazenamento persistente desaparece.
O que acontece quando executamos o "docker run"?
Quando você executa o comando “docker run”, várias ações ocorrem para criar e iniciar um container. Vamos detalhar cada passo desse processo:
O Docker faz o download da imagem do registry: Primeiramente, o Docker verifica se a imagem especificada está disponível localmente. Se não estiver, ele baixa a imagem do registry configurado, como o Docker Hub.
O Docker cria um novo container: Com a imagem disponível, o Docker cria uma instância dela, que é o container. Esse container é uma instância isolada e executável da imagem.
O Docker aloca um sistema de arquivos de leitura e escrita para o container: O Docker então cria um sistema de arquivos para o container, onde ele pode ler e escrever dados durante sua execução.
O Docker cria uma interface de rede para conectar o container à rede padrão: O Docker configura a rede do container, criando uma interface de rede que permite a comunicação com a rede padrão e, possivelmente, com outros containers, dependendo da configuração.
O Docker inicia o container: Finalmente, o Docker inicia o container, executando o comando ou a aplicação especificada na imagem.