O que é Docker?

Docker é uma ferramenta que permite "empacotar" aplicações em contêineres a partir de um arquivo "Dockerfile", isolando dependências e ambientes. Isso facilita a implantação e distribuição em diferentes sistemas, pois cada contêiner contém tudo que a aplicação precisa para rodar, mas o que exatamente é um contêiner Docker?

Contêiner Docker

Já ouviu a frase: "Mas na minha máquina o código funciona"? então, times que desenvolvem com Docker não passam por problemas como esse, pois com essa ferramenta, o desenvolvedor é capaz de encapsular a aplicação e todas as dependências necessárias para o seu funcionamento , incluindo o sistema operacional em um contêiner isolado, tornando o ambiente de desenvolvimento único para todos os desenvolvedores, prevenindo bug relacionado a mudança de sistema operacional ou versão das dependências utilizadas.

Para quem já trabalhou com o framework Django, é semelhante a criar um “virtual environment” na pasta “venv”. Porém, um contêiner Docker vai além, ele não apenas isola dependências, mas também o ambiente de execução, e também partes do sistema operacional e configurações, tornando o isolamento ainda maior.

DockerHub

DockerHub é um serviço de hospedagem de imagens Docker, semelhante, em algumas partes, ao GitHub. É um repositório onde são armazenadas, versionadas e compartilhadas as imagens de contêiner, permitindo que usuários façam pull (baixem) e push (publiquem) suas imagens em um repositório central.

Imagem é o molde que define como o container será criado. Fazendo uma alusão à orientação a objetos, o container gerado apartir da imagem seria como um objeto e a imagem uma classe

Exemplo:

Uma imagem Docker para um servidor web (como nginx:latest) pode ser usada para criar múltiplos contêineres, cada um rodando de forma independente, assim como uma classe pode ser instanciada em múltiplos objetos.

Docker Compose

O Docker Compose é uma ferramenta que permite definir e gerenciar vários contêineres, e as imagens que os originam, em um único arquivo YAML, chamado "docker-compose.yml". Em vez de executar cada contêiner individualmente, basta declarar todos os serviços necessários (por exemplo, um banco de dados, um servidor web ou uma aplicação) e então executar um único comando, para levantar todo o ambiente de forma coordenada, oque facilita o setup e manutenção do ambiente unificado.

Principais comandos Docker

# Lista os contêineres em execução
docker ps

# Lista todos os contêineres (em execução e parados)
docker ps -a

# Executa um novo contêiner a partir de um Dockerfile
docker run 

# Cria e inicia os contêineres em modo desanexado (background), reconstruindo se necessário
docker-compose up --build -d

# Encerra e remove os contêineres e redes criados
docker-compose down

# Para os contêineres sem removê-los
docker-compose stop

# Reinicia contêineres que foram parados
docker-compose start

# Para construir uma imagem Docker a partir de um Dockerfile
docker build -t nome-da-imagem .

# Executa um novo contêiner a partir de uma imagem
docker run -d -p 8080:80 nome-da-imagem

# Para acessar o terminal dentro de um contêiner em execução
docker exec -it <container_name> bash

# Para parar um contêiner
docker stop <container_name>

# Para remover um contêiner
docker rm <container_name>

# Para ver os logs de um contêiner
docker logs <container_name>

# Para visualizar opções gerais do Docker
docker

Observação
Em alguns sistemas operacionais, o comando correto é docker compose em vez de docker-compose.