Docker 101
Fundamentos de containers e Docker

Exemplo de uma app Ruby e outra NodeJS

Vamos supor que você escreve sua app em Ruby ou Javascript. Precisa então instalar um ambiente de execução para rodar sua aplicação, que se chama "runtime".
O runtime, por sua vez, tem dependências para poder funcionar adequadamente, que têm de ser instaladas no teu sistema operacional.

Conflitos?

Mas o quê acontece quando você precisa instalar outra versão do Ruby (2.5, 2.7, 3.0) no teu sistema, para rodar diferentes aplicações Ruby?
Podem haver conflitos com extensões nativas onde seja preciso reinstalar novamente o runtime ou as dependências:
Uma das soluções para isto é instalar o runtime não diretamente no SO, mas em outra camada de abstração.
Esta camada, geralmente se faz com virtualização. Poderíamos fazer virtualização de diversas formas, dentre elas:
  1. 1.
    instalar uma máquina virtual (VM)
  2. 2.
    instalar um container runtime Linux
Máquina Virtual
Emula todo kernel do sistema operacional host e ocupa área física de CPU e memória.
Container Runtime Linux
Não emula o kernel como em uma VM mas permite isolamento de arquivos, networking, CPU e memória através de Linux namespaces e Linux cgroups.
É mais leve que virtualização com VM, e possui o cenário adequado para rodar as apps sem precisar virtualizar um SO diferente.
Como mencionei, são "Linux" namespaces e cgroups. Portanto, só funciona em Linux.
Sorry, other systems.
Mas manusear namespaces e cgroups dá muito trabalho. Vários projetos foram criados de forma a abstrair isto, dentre eles o amado e odiado, Docker.

Instalação em Linux

Linux users, go ahead and install it.

E outros sistemas operacionais?

Até parece que users de macOS e Windows ficariam de fora né? Como resolver o problema?
Isto mesmo, VM Linux. E dentro da VM, há o tal do container runtime É exatamente isto o que o Docker for Mac e Docker for Windows fazem.
Então corre lá pra instalar o Docker no teu computador e começa a fazer alguns tutoriais no próprio site do Docker

Commit com configuração mínima do Docker

setup: add minimal Docker compose and Makefile · leandronsp/[email protected]
GitHub