Introdução
O Docker é um serviço de virtualização que isola nossa aplicação do sistema operacional do host/computador hospedeiro, evitando o erros na execução da nossa aplicação independente do sistema base (Windows, Linux, Mac, etc).
Ele utiliza o conceito de “containers”, os quais possuem tudo que a nossa aplicação precisa para executar (servidor, banco de dados, etc). Diferente de uma VM, um container não contém o Sistema Operacional dentro do mesmo, ele roda sobre o sistema do host, o que diminui e muito o seu tamanho.
Cada container roda de maneira independente e não enxerga as coisas que são executadas no host/computador hospedeiro.
Arquitetura
Client: Aplicação cliente: CLI/Terminal ou Remote API
Host/Engine: Possui um Daemon que interpreta os comandos do client e executa os mesmos, além disso o host possui os containers e as imagens.
Registry: Repositórios para imagens Docker, exemplos: Docker Hub, AWS ECS, Azure Registry, etc. Da mesma forma podemos ter públicas e privadas.
Instalação
O Docker possui 2 formas principais de instalação, via Docker Desktop ou via Docker Engine. O primeiro possui uma interface gráfica e cria uma VM para rodar o Docker, mesmo estando em um host Linux, enquanto o segundo funciona através do terminal. Essas duas formas não são muito compatíveis devido as diferenças, e portanto devemos escolher apenas uma para o uso.
Composição
Dockerfile: Define a arquitetura da nossa aplicação como: versão do node/ferramenta vamos usar, qual a versão do banco de dados vamos usar, qual arquitetura nós vamos buildar a aplicação, etc.
Imagem: “É um template somente de leitura com instruções para criar um container. É frequentemente baseada em outra imagem com alguma customização. Eu posso ter uma imagem do Unbuntu a qual eu inseri o servidor Apache por exemplo.” - Docker Documentation
Container: É a nossa imagem instância rodando no host. Ele é “stateless”, ou seja, não persiste informações quando interrompido. Ele não persiste as informações do banco de dados!!! Para isso usamos algo chamado volume ou outras técnicas de persistência, ver documentação:
Persistência
Para que possamos persistir informações de um banco de dados mesmo após um container ser interrompido ou deletado, o Docker disponibiliza algo chamado volume.
Volume: Um volume mapeia no host um espaço que vai ser compártilhado com uma área no filesystem do Docker, vamos fazer o “mount” dessa estrutura.
Exemplo da documentação referente ao MariaDB (Seção: “Where to Store Data”):
Comandos Comuns:
# Quantos e quais containers estão em execução
# Exibe ate os containers parados
docker ps
docker ps -a
# Exibe as imagens
docker images
docker images -a
# run: Cria e inicia um novo container com base na imagem 'my-image' dando um nome
# aleatório para o container.
# --name: Atribui o nome 'my-container' para o container referente a imagem
# 'my-image'.
docker run my-image
docker run --name my-container my-image
# -d: roda o container em background
# -p: porta, no exemplo mapeamos a porta 8088 do host para a porta 80 do container
docker run -d my-image
docker run --name my-container -d -p 8088:80 my-image
# Parar um ou todos os containers
docker stop
dcoker stop containerID
# Iniciar um container
docker start containerID
# Remover um container
# Remover uma imagem
docker container rm containerID
docker image rm image-name / imageID
# Gerar a imagem / build
docker image build image-name
# Executar o bash dentro de uma imagem Ubuntu
# -it: de iterativo, esse comando te leva para dentro do container
# bash: nesse caso estamos executando o terminal bash dentro do container
docker run -it ubuntu bash
Fontes:
- https://docs.docker.com/guides/docker-overview/
- https://docs.docker.com/guides/docker-overview/#:~:text=with%20fewer%20resources.-,Docker%20architecture,to%20a%20remote%20Docker%20daemon
- https://docs.docker.com/get-docker/
- https://docs.docker.com/guides/docker-concepts/running-containers/persisting-container-data/
Top comments (0)